首页 > 代码库 > 第一节 垃圾收集机制简介以及简单配置
第一节 垃圾收集机制简介以及简单配置
垃圾收集机制(GC)是JVM用于释放那些不再使用的对象所占用内存的程序和算法。GC并没有写入在java语言定制的标准中,因此并不是所有的JVM都有GC。GC的主要目的就是清除不再使用的对象。
垃圾回收的两种方法:
1.引用计数
引用计数表示一个对象被引用的所有次数,当引用计数为0时,则表示该对象没有被引用,可以将其删除。
2.对象引用树
目前比较常用的垃圾收集机制是对象引用树,即将对像的引用关系构建成一棵树,从一组根对象开始,对所有对象进行查找,通过递归查找若在该树中找到相应的对象,则将该对象标记为可达的即该对象仍然被引用,否则标记该对象为不可达。最后通过简单的堆栈扫描,删除标记为不可达的对象,释放相应的内存。
PS:如果只是简单的将标记为不可达的对象删除,就会出现多个内存片段,有可能这些内存片段太小都不可用,这样就会造成内存的浪费。因此,通常是再删除对象后采用内存压缩方法将可用对象变得放在一起,空闲内存放在一起,这样就能够再次利用。要是进行内存重组,JVM需要停止其他的活动,即所有与应用程序相关的工作停止,只有GC运行,这样就会产生多次程序中断。
Sun的JVM中的垃圾收集器:分代收集器
这种收集器将内存分为多个区域,用于存放不同寿命的对象。首先新建立的对象放在一个区域,在一段时间以后该对象还存在则将其移动到另一个寿命更长的区域中。JVM有新域(Young Generation)、旧域(Tenured Geneartion)、永久域(Perm Generation),JVM生成的所有新的对象放在新域中,对象经历几轮垃圾收集循环以后,便获得使用期允许进入旧域。永久域中存放的是类和方法对象。通常永久域不认为是堆的一部分。
1.配置堆区域
堆区域:是新域和旧域之和。
设置堆的初始大小:java -Xms128m
设置堆的最大大小:java -Xmx128m
PS: 通常将初始堆大小和最大堆大小设置为相同的,这样就避免程序动态增加堆大小。
2.配置新域和旧域
1)设置新域初始值和最大值为64m
Java –Xms256m–Xmx256m–Xmn64m
2)使用-XX:NewSize|MaxSize设置设置新域的初始值和最大值
Java –Xms256m –Xmx256m –XX: NewSize64m –XX:MaxNewsize=64m
3)设置新域和旧域的比例
Java –Xms128m –Xmx128m–XX:NewRatio=3
堆大小为128m,新域比例为3,即新域与旧域比例为1:3,新域大小为128/4n=32m
PS: 设置了新域的大小,将堆的大小减去新域的大小即为旧域的大小。
3.配置永久域
永久域的大小默认是4M。运行程序时,会动态调整大小以满足需求,每次调整,JVM会对堆进行一次完全的垃圾收集。
1)使用-XX:MaxPermSize来增加永久域的大小
Java –XX:MaxmPerSize=64m
2)当JVM加载类时,永久域中的对象急剧增加,从而使JVM不断调整永久域的大小。为了避免调整,可以使用-XX:PermSize设置初始值。
Java –Xms512 –Xmx512m–Xmn128m –XX: PermSize=32m -XX: MaxPermSize=64m
4.配置新域子空间
新域有:Eden、from救助空间、to救助空间构成;Eden用于存放新建的对象,当Eden被充满时,收集器停止执行应用程序,把所有可达到的对象复制到当前的from救助空间中;当from救助空间被从满时,收集器则把可达到对象复制到to救助空间中。这样保证活动的对象在救助空间中,知道其获得进入旧域。
默认情况下,新域使用复制收集器,旧域使用标记—清除—压缩收集器。
复制收集器:堆分为两个区间,JVM新生成的对象放在一个区间,可达到的对象放在另一个区间,从而压缩堆栈。仅仅适用于短生命周期的对象,否则来回复制效率太低。
1)使用-XX:SurvivorRatio控制新域子空间大小
SurvivorRatio规定救助域与Eden空间的比值。
Java –Xms256m –Xmx256m–Xmn64m –XX:SurvivorRation=2
新域64m,其中Eden32m,每个救助域16m(SurvivorRatio表示Survivor: Eden=1:2)
2)使用-XX:TargetSurvivorRatio来控制救助域之间的比例,默认是50是一个百分比。当较大的堆栈使用较低的SurvivorRatio时,应该增加TargetSurvivorRatio为80~90,以便更好的利用救助空间。用-XX:MaxTenuringThreshold可以控制上限。
例子:为了防止所有的复制全部发生,希望对象从Eden直接扩展到旧域,将MaxTenuringThreshold=0,设置完成后实际上就不用救助域了,因此将SurvivorRation设置为最大值以最大化Eden空间
Java –Xms256m –Xmx256m–XX:MaxTenuringThreshold=0 –XX:SurvivorRatio=50000
第一节 垃圾收集机制简介以及简单配置