文章参考:
http://qqtang.spaces.live.com/blog/cns!A733784AA1BFFCCC!348.entry?fl=cat
http://unixboy.javaeye.com/blog/174173
http://dev.yesky.com/113/2160613.shtml
名称 | 查找对象 | 垃圾回收 |
引用计数 | 存储引用数, | 引用数为0时收集 |
对象引用遍历(清除方式) | 递归遍历,标记可到达对象
| 扫描堆栈,删除未标记对象,释放内存 |
对象引用遍历(压缩方式) | 递归遍历,标记可到达对象
| 重新组织内存中的对象,并进行压缩。 |
GC回收常用算法:
GC回收常用方式:
方式名称 | 原理 | 特点 |
标记-清除收集器 | 递归遍历,标记可到达对象,删除未标记对象, | 单线程并停止其它操作 |
标记-压缩收集器 | 递归遍历,标记可到达对象,把标记对象复制到堆栈的新域中,以便压缩堆栈 | 停止其它操作 |
复制收集器 | 将堆栈分成两个域,常称为半空间,每次仅使用一半的空间,jvm生成的新对象放在另一半空间中.gc运行时,把可到达对象复制另一半空间中去,从而压缩了堆栈 | 短生存期的对象,持续复制长生存期的对象则导致效率降低。 |
增量收集器 | 把堆栈分成多个域,每次仅从一个域回收 | 会造成较小的程序中断 |
分代收集器 | 把堆栈分为两个或多个域,用以存放不同寿命的对象。Jvm生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象,将获得使用期并转入更长寿命的域中。 | 对不同的域使用不同的算法以优化性能 |
并发收集器 | 与应用程序同时运行 | 这些收集器在某点上(比如压缩时)一般都不得不停止其他操作以完成特定的任务,但是因为其他应用程序可进行其他的后台操作,所以中断其他处理的实际时间大大降低 |
并行收集器 | 使用多线程并行执行垃圾回收工作 | 在多cpu机器上使用多线程技术可以显著的提高java应用程序的可扩展性 |
Sun HotSpot 1.4.1
使用分代收集器,整个堆分为新域(分为:Eden空间,救助空间(From空间,to空间)),旧域,永久域
堆大小:-Xms堆的初使大小,-Xmx堆的最大值
Eden(新域) |
From(新域:救助空间) |
to(新域:救助空间) |
旧域 |
永久域
|
新域:存放新对象,使用复制收集器
-Xmn:将NewSize和MaxNewSize设成一致
-XX:NewSize:设置新域的初使值
-XX:MaxNewSize:设置新域的最大值
-XX:SurvivorRatio:救助空间与Eden空间的比值
-XX:MaxTenuringThreshold=0控制救助空间的比例
旧域:存放长期对象,标记-压缩收集器
-XX:NewRatio设置新域和旧域在堆中所占的比例
永久域:存放class和method对象
-XX:PermSize
-XX:MaxPermSize
例子:
1)java -Xms512m -Xmx512m -XX:NewSize=64m -XX:MaxNewSize=128m -XX:MaxPermSize=64m -XX:SurvivorRation =2
说明:
-Xms512m -Xmx512mà堆内存初始为512M,最大值512M,
XX:NewSize=64m -XX:MaxNewSize=128mà新域的初始值为64M,最大值为128M
-XX:MaxPermSize=64mà永久域初始值4M(默认值),最大值64M
-XX:SurvivorRation =2à新域中两个救助空间和Eden空间的比例为:(1+1):2,所以每个救助空间占新域的1/4,即128/4=32M , Eden域占1/2,即64M
2)java -Xms512m -Xmx512m -Xmn128m -XX:PermSize=32m -XX:MaxPermSize=64m -XX:SurvivorRation =8
说明:
-Xmn128mà新域的初始值和最大值均为128M
-XX:PermSize=32m -XX:MaxPermSize=64mà永久域初始值32M,最大值64M
新域中Eden空间为:128*8/10=102.4M,(from和to救助空间)分别为:128/10=12.8M
3)java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0 -XX:SurvivorRatio=50000
说明:
-Xss128Kà设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右
-XX:NewRatioà设置新域和旧域的比例1:4,新域大小为3550/5=710M
-XX:MaxTenuringThresholdà此值为0时,在新域中不使用救助空间,这时需要把-XX:SurvivorRatio设置成最大值