提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、JVM是什么?
Java虚拟机是指运行在操作系统之上的、可运行Java代码的假想计算机。它可以屏蔽操作系统底层的差异,使得Java程序可以实现“一次编译,到处运行”。
二、JVM分区
线程共享
1、堆:存放创建的实例对象及数组(包含字符串常量池)
2、元空间(jdk1.7及以前叫做方法区,占用Java虚拟机内存):保存加载的类信息、静态变量。占用本地内存空间
线程私有
1、虚拟机栈:存储方法的局部变量、方法出口等信息
2、本地方法栈:与虚拟机栈功能一致,但存储的信息是本地方法,本地方法包括native关键字声明的本地方法。
3、程序计数器:指示当前线程执行的字节码行号
三、fullgc和younggc
younggc:非常频繁,回收速度快
指针对堆中的年轻代使用的垃圾回收机制,当年轻代的eden区满时,会触发一次younggc。
fullgc:回收速度慢
是指对年轻代、老年代进行一次全面的垃圾回收,触发的条件有:
(1)晋升进入老年代的对象大小大于老年代的可用内存时
(2)调用system.gc方法时
四、什么时候年轻代的对象会进入老年代?
年轻代中的对象每经历一次垃圾回收,年龄就会加一,当年龄达到我们设置的阈值时,年轻代的对象就会被移至老年代。
五、年轻代设置两个survivor区的原因是什么?
survivor区每次只使用其中一个。新创建的对象会先进入到eden区,当eden区满了后,触发一次younggc,对eden区和正在使用的survivor区进行垃圾清理,将存活的对象放入另一个survivor区。
这样做可以防止产生内存碎片。
六、分代垃圾回收算法
1、年轻代:标记复制算法
由于年轻代的特点就是存活的对象比较少,所以采用标记复制算法效率高,而且不会产生内存碎片。
2、老年代:标记整理算法
由于老年代的存活对象较多,如果采用标记复制算法的数据复制成本较高,降低效率,因此采用标记整理算法。
垃圾回收算法
1、标记清除算法
先标记处需要回收的对象,再根据标记对这些对象占用的内存空间进行清理。
2、标记复制算法
将内存分为相等两份,每次只使用其中一块,当这块内存满了之后,将存活的对象移至另一块内存,这样可以避免内存碎片的产生。
3、标记整理算法
先标记出需要回收的对象,将存活的对象移至内存的另一侧,将存活对象内存边界以外的可回收对象清楚。
七、如何确定垃圾?
引用计数法
当一个对象没有任何与之关联的引用,引用计数为0时,就说明可以被垃圾回收。
可达性分析
以gcroots为起点开始向下搜索,当一个对象与任意一个gcroots之间都没有任何一条可达路径,则说明可以进行垃圾回收。
包括虚拟机栈、本地方法栈中引用的对象以及静态属性引用的对象等。