静态内存的分配和回收
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