JVM虚拟机
包括运行时数据区(内存模型)类装载子系统和字节码执行引擎。
内存模型
包括栈、堆、方法区、本地方法栈和程序计数器
main线程开始运行,就会从栈中给一部分给main线程存放局部变量。
- 栈帧:给线程运行的方法分配一块专属的内存区域,一个栈帧对应一个方法。
- 局部变量表:存放变量
- 操作数栈:把常数先存入,然后再弹出赋值到局部变量表中的变量。是临时的
- 动态链接:存放方法入口的内存地址,可以找到方法进而执行方法下面的程序。
- 方法出口:存放方法的返回地址,main方法可以继续向下执行。
程序计数器:用来表示当前程序存放的位置,因为Java是多线程执行的,便于有些线程挂起后重新执行找到位置
堆:局部变量很多都是对象类型的,那么它的值是放到堆里面的。局部变量表里面存放的是内存地址,引用指针,所以栈和堆的关系就是引用的关系。
方法区:常量+静态变量+类信息(也是存放在堆中对象的内存地址)
本地方法栈:是本地方法在执行过程中需要用的内存空间
常见java虚拟机的面试题
能否对JVM调优?让其几乎不发生full jc?
可以,把 年轻态调大一些
minor gc 垃圾收集,回收年轻
full gc 全部回收
调优 就是减少gc的次数
对象头里有分代年龄