jvm结构
jvm栈:新生代(Eden, From, To),老年代,永久代
jvm垃圾回收算法:
-
引用计算法,无法处理循环引用
-
复制法,需要2倍空间
-
标记-清除法,会暂停整个应用,同时会产生内存碎片
-
标记-整理法,基于标记-清除法和复制法,不会产生内存碎片
垃圾收集器:Scavenge GC(次收集,发生在新生代,需要速度快、效率高的算法)和Full GC(全收集,老年代)
老年代对象大部分是Minor GC过程中从新生代进入老年代。full GC的速度一般会比Minor GC慢10倍以上。当来年代内存不足或者显示调用System.gc()方法时,会触发Full GC
HotSpot虚拟机7大分代收集器:
young generation:
-
serial,串行收集器,会STW stop the world,让工作线程暂停,使用复制算法
-
parnew,并行收集器,是serial的多线程版本,当老年代使用了CMS后parnew就是新生代的默认收集器,存在线程切换开销,收集线程数和CPU数量相同可用-XX:ParallelGCThreads=<N>参数控制GC线程数,关注尽可能缩短垃圾收集时间
-
parallel scavenge,也是并行多线程收集器,但是关注点是系统吞吐量,系统吞吐量=运行用户代码时间/(运行用户代码时间+垃圾收集时间)
old generation:
4. CMS(concurrent mark sweep),可以和serial、parnew配合使用,concurrent:并发,可以和用户线程一起工作,一款真正意义上的并发收集器,现在主流互联网企业线 上选用的仍然是CMS,以最短回收停顿时间为目标的收集器,4个步骤:初始标记->并发标记->重新标记->并发清除(没有压缩,初始和重新标记阶段仍然会STW)
5. serial old,是单线程收集器,使用标记-整理算法,可以跟年轻代的所有收集器一起使用
6. parallel old,只能和parallel scavenge一起使用(parallel:并行,不能跟用户线程一起工作)
通用收集器:
7. G1(gabage first),分区收集器
JVM优化:
-
选择jvm的版本
-
手动指定堆区大小
-
垃圾收集器的选择
jvm小工具:
jps:
jstat
jinfo
jmap
jcmd
jconsole
jvisualvm:jdk中最强大的运行监视和故障处理工具,可以监视内存泄漏、跟踪垃圾回收、执行时内存分析、CPU分析、线程分析...