赞
踩
JVM垃圾回收机制(Garbage Collect,简称GC)主要负责回收JVM内存当中未被及时释放回收的内存区域,JVM垃圾回收机制让程序员摆脱了手动释放内存的操作,降低了程序员疏忽大意导致的风险。
那么,垃圾回收机制到底针对哪一块的内存空间进行处理呢?是整体内存还是某一块内存?
在回答这个问题之前,我们需要先了解一下JVM内存分配机制,JVM内存分配机制主要有如下几个区域:
关于每个区域的具体内容,可参考博客:【后端面经-Java】JVM内存分区详解
因此,内存回收机制主要针对堆和方法区进行处理。
JVM垃圾回收机制中,一般都是基于GC分代思想进行算法设计。
GC机制将内存内容分为三部分:
年轻代(Young Generation)
:新产生的实例基本上都处于这代,因为新产生的实例大部分都是一次性的,因此这部分内存需要经常进行内存回收;老年代(Old Generation)
:在新生代残酷频繁的筛选机制中,多次存活下来的实例会进入老年代,老年代意味着生命周期较长,一般在内存没有满之前不会对这部分内存进行回收;永久代(Permanent Generation,JCK1.8之后改成元空间(Metaspace))
:永久代存放的是JVM程序运行相关的元数据,比如类信息、方法信息、常量池等,内容重要且占空间小,因此基本上不会进行垃圾回收。如果要类比的话,年轻代就是刚刚步入职场的小青年,不稳定性较高,很容易被裁员(垃圾回收),而熬过这个阶段,成为技术骨干(老年代)之后,基本上不会在正常公司运行过程中被裁员,除非公司倒闭(内存已满),而永久代或者元空间就是公司最高层的管理人员,对公司的运行起着关键作用,一般情况下不会被裁员。
Eden区
、Survivor0区
和Survivor1区
,比例为8:1:1
。整体内存细分情况如图所示:
GC按照触发条件,可分为Scavenge GC
和Full GC
。
system.gc()
对于GC线程,其本身的优先级比较低,因此在CPU空闲的时候,可能会进行GC处理,而在忙时基本上不会进行GC处理,除非此时内存空间不足,需要GC处理之后才能正常运行。
Full GC对于计算资源是一个很大的消耗,应该尽量避免使用Full GC。
前面主要介绍了JVM垃圾回收机制的针对对象,GC分代思想和触发条件。那么,好好的一个对象实例,GC机制空口无凭凭什么说它是垃圾呢?这就需要垃圾判断算法了。
常见的垃圾判断方法有两种:引用计数法
和可达性分析法
。
循环引用
的问题(从图论角度来说就是环状节点无法识别)。虚拟机栈
(栈帧中的本地变量表)中引用的对象方法区
中类静态属性引用的对象方法区
中常量引用的对象本地方法栈
中JNI(Native方法)引用的对象常见的垃圾回收算法包括:标记-清除算法
、标记-整理算法
、复制算法
和分代收集算法
(自适应算法)。
在被处决之前,垃圾会进行一次垂死挣扎,实例第一次被标记为垃圾之后,如果可以进行一次有效finalize()
方法调用,和其他实例建立引用,那么该实例就会被复活,不会被回收。
在垃圾判断算法执行完成后,已经被明确判断成垃圾的实例,清除法在原地释放其内存空间,将其标记为可用空间,等待后续的内存分配。
标记-整理算法在标记完成之后,将所有存活的实例移动到一端,然后清除掉另一端的内存空间,这样就可以有效解决内存碎片的问题。
复制算法将内存空间分为两块,每次只使用其中一块,当一块内存空间内存满了之后,将存活的实例复制到另一块内存空间中,然后清除掉之前的内存空间。
针对不同代的数据特点,使用不同的垃圾回收算法。
垃圾回收器是垃圾回收算法的执行者,常见的垃圾回收器如下图所示:
连线部分说明这两个垃圾回收器能够搭配使用。
垃圾收集停顿时间
这一参数,影响用户体验,因此需要尽量避免;-XX:+UseSerialGC
-XX:+UseParNewGC
吞吐量 = 用户线程运行时间 / (用户线程运行时间 + 垃圾回收线程运行时间) |
-XX:MaxGCPauseMillis=一个数值
-XX:GCTimeRatio=一个数值
99%
,表示只有1%
的时间用于垃圾回收;-XX:+UseAdaptiveSizePolicy
-XX:+UseParallelGC
-XX:ParallelGCThreads
设置,默认为CPU核心数-XX:+UseParallelOldGC
-XX:CMSInitiatingOccupancyFraction=一个数值
68%
,占用内存空间超过这个阈值就进行垃圾回收处理。-XX:+UseCMSCompactAtFullCollection
Region
,
-XX:G1HeapRegionSize=一个数值
E
-Eden区
:存放年轻代当中Eden区域的数据;S
-Survivor区
:存放年轻代当中Survivor区域(survivor0和survivor1)的数据;O
-Old
:存放老年代的一般数据;H
-Humongous
:存放老年代当中大对象的数据;当占据整个Region一半以上的时候,就会被划分为Humongous区域;Garbage First
名字的由来。对上述垃圾回收器的对比如下所示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。