JVM内存回收策略

静态内存的分配和回收

Java中静态内存分配是指在Java被编译时就已经能够确定需要的内存空间,当程序被加载时系统把内存一次性分配给它。

  • 原生数据类型
  • 对象的引用

动态内存分配和回收

  • Java中的对象

如何检测垃圾

只要某个对象不再被其他活动对象引用,他就可以被回收。
活动对象是指能够到达根集合对象的对象

根集合对象包括
  • 方法中局部变量区中对象的引用
  • Java操作栈中对象的引用
  • 常量池中的对象引用
  • 本地方法中持有的对象引用
  • 类的class对象

垃圾收集算法

  • Serial Collector
  • Parallel Collector
  • CMS Collector
分代
  • Young
    所有新创建的对象都在Eden区,当Eden区满后会触发 minor GC 将Eden区仍然存活的对象复制到其中一个Survivor区中
    ,另外一个Survivor区中的存活对象也复制到这个Survivor中,以保证始终有一个Survivor区是空的。

    • Eden
    • Survivor
      • From
      • To
  • Old
    Old区存放的是Young区的Survivor满后出发minor GC后仍然存活的对象,当Eden区满后会将对象放到Survivor区中,如果Survivor区仍然存不下这些对象,GC收集器会将对象存放到Old区。如果Survivor区中的对象足够老,也直接存放到Old区。如果Old区满了会出发FullGC回收整个堆内存

  • Perm
    存放的主要是类的class对象,如果一个类被频繁的加载,也可能会导致Perm区满,Perm区的垃圾回收也是由FullGC触发的。

Serial Collector

使用:-XX:+UseSerialGC
JVM client模式下默认GC方式。
具体流程如下
这里写图片描述
JVM在做GC时是串行的,所以这些动作都是单线程完成的,JVM中的其他应用程序会全部停止

Parallel Collector

Parallel GC 根据Minor和Full GC的不同分为三种,分别是
这里写图片描述
- ParNewGC
- ParallelGC
- ParallelOldGC

ParNewGC
  • 使用:-XX:+UseParNewGC

分配和回收策略和SerialCollector类似,只不过是多线程并行回收。
可以使用UseAdaptiveSizePolicy参数动态控制Eden,From Space和To Space的TenuringThreshold大小

ParallelGC
  • 使用: -XX:+UseParallelGC

Server模式下默认的GC方式
并行回收的线程数可以通过-XX:ParallelGCThreads来指定(如果CPU的核数小于8,线程数可以和核数一样,如果大于8,值为3 + x*5/8)
-Xmn来控制Young区大小,Young区内的Eden,From,To的大小通过SurvivorRatio参数来完成如果值为8表示Eden和From的大小比为8:1

ParallelOldGC
  • 使用: -XX:+UseParallelOldGC

并行回收的的线程数可以通过 -XX:ParallelGCThreads来指定(如果CPU的核数小于8,线程数可以和核数一样,如果大于8,值为3 + x*5/8)
与ParallelGC的不同:
ParallelGC进行的动作为清空整个Heap堆中的垃圾对象,清楚Perm区中已经被卸载的类信息,并进行压缩。
ParallelOldGC是清楚Heap堆中的部分垃圾对象,并进行部分的空间压缩

GC垃圾回收都是以多线程方式进行的,同样也将暂停所有应用程序

CMS Collector

  • 使用: -XX:+UseConcMarkSweepGC

并发的线程数默认为4,也可通过ParallelCMSThreads指定
触发CMS GC回收的只是Old区或者Perm区的垃圾对象,在回收时和前面所说的MinorGC和FullGC基本没有关系
Minor GC触发的规则回收规则与Serial Collector基本一致,只不过是多线程而已
Full GC是在两种情况下发生的:
1. Eden分配失败,Minor GC后分配到To Space,To Space不够再分配到Old区,Old区不够则出发Full GC;
2. 当 CMS GC正在进行时向Old区向Old申请失败则会直接直接触发Full GC
注意:在Hotspot1.6中使用这种GC方式时在程序中显式地调用了System.gc,并且设置了ExplicitGCInvokesConcurrent参数,那么使用NIO时可能会引发内存泄露。

三种GC优缺点比较

Serial Collector
  • 串行
  • 优点:适合内存有限的情况下
  • 缺点:回收慢
Parallel Collector
  • 并行
  • 优点:效率高
  • 缺点:当Heap过大时,应用程序暂停时间过长
CMS collector
  • 并行
  • 优点:Old区回收暂停时间段
  • 缺点:产生内存碎片,整个GC耗时较长,比较耗CPU
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值