本教程操作环境:windows7系统、java10版,DELL G3电脑。
1.GC堆内存
Java将堆内存分为3大部分:新生代、老年代和持久代,其中新生代又进一步划分为Eden、S0、S1(Survivor)三个区。
我们在程序中new出来的对象一般情况下都会在新生代里的Eden区里面分配空间,如果存活时间足够长将会进入Survivor区,进而如果存活时间再长,还会被提升分配到老年代里面。持久代里面存放的是Class类元数据、方法描述等。
(1)Minor GC(年轻代GC):
对象优先在Eden中分配,当Eden中没有足够空间时,虚拟机将发生一次Minor GC,因为Java大多数对象都是朝生夕灭,所以Minor GC非常频繁,而且速度也很快。
(2)Full GC(老年代GC):
Full GC是指发生在老年代的GC,当老年代没有足够的空间时即发生Full GC,发生Full GC一般都会有一次Minor GC。
(3)持久代(Permanent generation)也称之为 方法区(Method area):
用于保存类常量以及字符串常量。注意,这个区域不是用于存储那些从老年代存活下来的对象,这个区域也可能发生GC。发生在这个区域的GC事件也被算为 Major GC 。
2.GC执行条件
eden区空间不够存放新对象的时候,执行Minro GC。升到老年代的对象大于老年代剩余空间的时候执行Full GC,或者小于的时候被HandlePromotionFailure 参数强制Full GC 。调优主要是减少 Full GC 的触发次数,可以通过 NewRatio 控制新生代转老年代的比例,通过MaxTenuringThreshold 设置对象进入老年代的年龄阀值
3.GC算法原理
HotSpot 虚拟机采用了可达性分析来进行内存回收,可达性分析的基本思路就是通过一系列可以做为root的对象作为起始点,从这些节点开始向下搜索。当一个对象到root节点没有任何引用链接时,则证明此对象是可以被回收的。以下对象会被认为是root对象:
栈内存中引用的对象
方法区中静态引用和常量引用指向的对象
被启动类(bootstrap加载器)加载的类和创建的对象
Native方法中JNI引用的对象。
以上就是gc在java中原理分析,相信经过本篇的学习理解,已经对基础的名词概念有所掌握。对于一些GC算法还不会使用的,可以再学完本篇文章后,回顾之前所学的知识内容。