java垃圾收集解析


 

 

名称

查找对象

垃圾回收

引用计数

存储引用数,

引用数为0时收集

对象引用遍历(清除方式)

递归遍历,标记可到达对象

 

扫描堆栈,删除未标记对象,释放内存

对象引用遍历(压缩方式)

递归遍历,标记可到达对象

 

重新组织内存中的对象,并进行压缩。

 

GC回收常用算法:

 

 

 

 

 

 

 

 

 

 

GC回收常用方式:

 

方式名称

原理

特点

标记-清除收集器

递归遍历,标记可到达对象,删除未标记对象,

单线程并停止其它操作

标记-压缩收集器

递归遍历,标记可到达对象,把标记对象复制到堆栈的新域中,以便压缩堆栈

停止其它操作

复制收集器

将堆栈分成两个域,常称为半空间,每次仅使用一半的空间,jvm生成的新对象放在另一半空间中.gc运行时,把可到达对象复制另一半空间中去,从而压缩了堆栈

短生存期的对象,持续复制长生存期的对象则导致效率降低

增量收集器

把堆栈分成多个域,每次仅从一个域回收

会造成较小的程序中断

分代收集器

把堆栈分为两个或多个域,用以存放不同寿命的对象。Jvm生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象,将获得使用期并转入更长寿命的域中。

对不同的域使用不同的算法以优化性能

并发收集器

与应用程序同时运行

这些收集器在某点上(比如压缩时)一般都不得不停止其他操作以完成特定的任务,但是因为其他应用程序可进行其他的后台操作,所以中断其他处理的实际时间大大降低

并行收集器

使用多线程并行执行垃圾回收工作

在多cpu机器上使用多线程技术可以显著的提高java应用程序的可扩展性

 

 

 

 

Sun HotSpot 1.4.1

使用分代收集器,整个堆分为新域(分为:Eden空间,救助空间(From空间,to空间)),旧域,永久域

 

堆大小:-Xms堆的初使大小,-Xmx堆的最大值

 

Eden(新域)

From(新域:救助空间)

to(新域:救助空间)

旧域

永久域

 

 

新域:存放新对象,使用复制收集器

       -Xmn:NewSizeMaxNewSize设成一致

       -XX:NewSize:设置新域的初使值

       -XX:MaxNewSize:设置新域的最大值

       -XX:SurvivorRatio:救助空间与Eden空间的比值

-XX:MaxTenuringThreshold=0控制救助空间的比例

 

旧域:存放长期对象,标记-压缩收集器

       -XX:NewRatio设置新域和旧域在堆中所占的比例

      

 

永久域:存放classmethod对象

-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,(fromto救助空间)分别为: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设置成最大值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值