讲jvm之前先明确下串行、并行、并发的区别:
- 并行(Parallel): 必须多核支持
- 并发 (Concurrent):不需要多核支持
举个粟子:
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
回收策略:
- 引用计数:对象有一个引用就增加计数,不能处理循环引用的情况,现在已不使用
- 标记清除:年老代中使用
- 标记-整理:分代中年轻代中使用
各收集器选择:
- 串行收集器 Serial GC:client 虚拟机、windows 32位的jvm或运行在单处理器上的JVM
- 并行 Parallel GC:server虚拟机、多CPU的Unix机器以及64位虚拟机
- 并发标记清除 CMS:对停顿比较敏感时使用,并行 Parallel GC追求吞吐量,CMS追求,小停顿
- 垃圾优先 G1:JDK1.7u4正式出现,针对内存大于4GB时使用
注意:
1.8之后永久代(Permanent Generation)被元空间(MetaSpace)替代:
永久代中的静态变量和常量放到堆中
永久代中的类信息放到无空间中
-XX:useParalleGC/UseParallelOldGC启用Parallel
-XX:UseConcMarkSweepGC/ UseParNewGC启用CMS
堆空间小于4GB时,CMS性能好于G1