GC

 

本地方法栈、程序计数器、虚拟机栈不需要进行垃圾回收。因为他们的生命周期是和线程同步的,随着线程的销毁,他们占用的内存会自动释放。

所以,只有方法区和堆区需要进行垃圾回收,回收的对象就是那些不存在任何引用的对象。

垃圾回收区域:

新生代(Youn Generation):大致分为Eden区和Survivor区,Survivor区又分为大小相同的两部分:FromSpace和ToSpace。新建的对象都是从新生代分配内存,Eden区不足的时候,会把存活的对象转移到Survivor区。当新生代进行垃圾回收时会触发Minor GC(也称作Young GC)。
 旧生代(Old Generation):旧生代用于存放新生代多次回收依然存活的对象,如缓存对象。当旧生代满了的时候就需要对旧生代进行回收,旧生代的垃圾回收称作Major GC(也称作Full GC)。

持久代(Permanent Generation):在Sun 的JVM中就是方法区的意思,尽管大多数JVM没有这一代。

 

常见的GC算法引用、复制、标记-清除和标记-整理(压缩)

 1.引用计数(Reference Counting): 引用+1,去引用-1,垃圾回收时,只针对计数为0的对象。无法处理循环引用的问题。

 2.复制(Copying):两个相等的区域。遍历一个区域复制到另个区域。不会出现内存碎片,但需要两倍内存空间。

 3. 标记-清除(Mark-Sweep):先从引用根节点标记所有被引用的对象,再遍历整个堆,清楚未标记。STW,会出现内存碎片。

 4.标记-整理(Mark-Compact):同标记清楚。有优化,清楚对象时压缩内存,不会出现内存碎片。

 

垃圾收集器

串行收集器(Serial GC)、并行收集器(ParNew GC)、Parallel Scavenge GC

CMS (Concurrent Mark Sweep)收集器、Serial Old收集器、Parallel Old收集器

G1(Garbage-First)收集器

Serial GC, 复制算法。该收集器适用于单CPU、新生代空间较小且对暂停时间要求不是特别高的应用上,STW(stop the world)是client级别的默认GC方式。 

ParNew GC,复制算法,Serial GC的多线程版本,除使用多条线程GC外,其他控制参数、收集算法、STW、回收策略都一样。这样它就可以被用于服务端上(server)。并行

Parallel Scavenge GC,复制算法,并行多线程。更关注系统吞吐量(运行用户代码时间/[运行用户代码时间+GC时间]),是server级别的默认GC方式

-----------------------------------------以上为 新生代的收集器-------------------------------------------------------------------

Serial Old GC,标记整理算法。是Serial收集器的老年代版本,它同样使用一个单线程执行收集。主要使用在Client模式下的虚拟机。

Parallel Old GC,标记整理算法。是Parallel Scavenge收集器的老年代版本,搭配使用。吞吐量优先。

CMS,标记清除算法。与用户线程并发运行,以达到最短回收时间。常见的B/S架构的应用就适合这种收集器,因为其高并发、高响应的特点。(GC过程四个阶段,比较复杂)

-----------------------------------------以上为 老年代的收集器-------------------------------------------------------------------

G1,标记-整理算法,面向服务端的收集器。其次可以比较精确的控制停顿。

 

JVM优化

java自带小工具:\jdk\bin\

java.exe
javaw.exe

java虚拟机
javac.exe java编译器
javadoc.exe  生成文档
native2ascii.exe  编码转换
jps.exe 查jvm线程
jstat.exe  
jinfo.exe  
jmap.exe  
jstack.exe  
jconsole.exe  
jvisualvm.exe  
posted @ 2019-01-10 00:08  scmath  阅读(338)  评论(0编辑  收藏  举报