JVM内存结构主要分为五个区域:
1.方法区:用来存储类的信息,例如:方法,方法名,返回值,常量,超出内存时,会报错(OutOfMemoryErr)
2.堆:存放new出来的对象信息, 全局变量。
3.程序计数器:每个线程的创建,都会创建一个程序计数器,并且对于每个线程而言是互相独立的,主要是用来记录程序执行的位置
4.JVM栈:每个线程的创建,都会创建JVM栈,描述的是线程进栈出栈的过程,线程结束内存自动释放,它用来存储当前线程运行方法所需要的数据、指令、返回地址。
5.本地方法栈:描述的是为虚拟机是用到的Native方法出栈和入栈的过程。
ParallelGC:
Parallel Scavenge:
特点:可以精确控制吞吐量,而高吞吐量可以高效的利用CPU时间。
缺点:不能在整体应用上获得吞吐量最大化的效果。
Parallel Old:
特点:高吞吐量,处理敏感资源。
CMS:
优点:并发收集,降低停顿。
缺点:1.对CPU资源敏感;2.无法处理浮动垃圾,可能出现Concurrent Mode Failure失败导致的另一次Full GC;3.CMS是标记清除算法实现的,在收集结束时会产生大量的空间碎片,当空间碎片过多时,对大对象分配造成问题,无法找到足够大的空间存储,而不得不提前猝发Full GC。
G1:
优点:1.并行,并发;2.分代收集;3.空间整合;4.可预测停顿
缺点:只有并发标记才不会stop-the-world 其他都会停下来
ZGC:
优点:1.着色指针是一种将信息存储在指针中的技术,指针可以处理更多的内存,因此可以使用一些位来存储状态。
2.在访问指针时加入Load Barrier(读屏障),比如当对象正被GC移动,指针上的颜色就会不对,这个屏障就会先把指针更新为有效地址再返回,也就是,永远只有单个对象读取时有概率被减速,而不存在为了保持应用与GC一致而粗暴整体的Stop The World。
缺点:1.ZGC仅支持64位平台;2.当需要取消着色时,它需要额外的工作(因为需要屏蔽信息位)。