垃圾回收机制(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
版权声明:本文博主原创文章。博客,未经同意不得转载。