二 JVM.垃圾回收算法/策略内存分配( 六 )


染色指针:把少量信息存储在指针上的技术;64位系统,理论一次寻址可达2^64 = 16EB 的数据,但是处于需求,性能,成本AMD64 架构只支持了54位4PB 的地址总线,和 48位 256TB 的虚拟地址空间;此外操作系统还做了限制 Linux :47位 128TB进程虚拟地址 和 46位 64TB 物理地址空间,就44位 16TB 的物理地址空间;
Linux 平台下46 位指针 前四位用于存储信息 ,剩余用于寻址 ,早就压缩了ZGC 的内存大小最大为4TB
染色指针优势:
问题:随意定义指针,操作系统是否支持,CPU 是否支持?程序代码最后都是转换成机器指令去执行,处理器不会理会指针里面多少位多少位是什么内容,只会当做是内存地址去处理;这个问题在/ SPARC 上可以直接设置忽略前几位;但是在X86-64 的平台上没有类类似的功能,这里就要说到补救措施:虚拟内存映射技术 :ZGC为了能高效、灵活地管理内存,实现了两级内存管理:虚拟内存和物理内存,并且实现了物理内存和虚拟内存的映射关系 。
GC步骤
优点:不需要 Set ,写屏障,卡表;这些计算资源和空间资源都省略了;
缺点:回收周期长(不代表停顿时间 STD ) 对象的分配速度不能太快,大量新对象是浮动垃圾,只能下次回收;只能增加堆空间,获取更多喘息的时间来下次回收;
优化方案:还是需要引入分代收集,新生代专门区域,针对这个区域更频繁和更快的收集;
7.为应用选择何时的垃圾回收器
为我们应用选择适合的垃圾回收器;要考虑jvm 运行的操作系统如Win Linux ,像ZGC 在Win 上就用不了;如果机器的内存和JDK 版本较低,CMS会比较好,内存再大一点的话,就是G1 也不错;

二  JVM.垃圾回收算法/策略内存分配

文章插图
7.1 垃圾回收日志
日志级别:Trace ,Debug ,Info ,, Error,Off 默认Info 级别
日志行携带信息: 默认是: ,level,tags
以JDK 9 为分界线 参数-Xlog:: : :-统一处理系统所有日志
的种类有很多,其中就包括gc,打印GC 日志 还有其他的比如add,,cpu.jni,ihop 等等
1.默认日志打印基本信息
-Xlog:gc JDK9 之前:-XX:+
//jdk 9 之后[0.004s][warning][gc] -XX:+PrintGC is deprecated. Will use -Xlog:gc instead.[0.015s][info][gc] Using G1Connected to the target VM, address: '127.0.0.1:64410', transport: 'socket'
2.日志打印详细信息
-X-log:gc* JDK9 之前:-XX:+
//jdk 9 之后[0.005s][warning][gc] -XX:+PrintGCDetails is deprecated. Will use -Xlog:gc* instead.[0.015s][info][gc,heap] Heap region size: 1M[0.017s][info][gc] Using G1[0.017s][info][gc,heap,coops] Heap address: 0x00000000fec00000, size: 20 MB, Compressed Oops mode: 32-bitConnected to the target VM, address: '127.0.0.1:64611', transport: 'socket'[20.740s][info][gc,start] GC(0) Pause Young (Normal) (G1 Evacuation Pause)[20.740s][info][gc,task] GC(0) Using 2 workers of 10 for evacuation[20.741s][info][gc,phases] GC(0)Pre Evacuate Collection Set: 0.0ms[20.741s][info][gc,phases] GC(0)Evacuate Collection Set: 1.4ms[20.741s][info][gc,phases] GC(0)Post Evacuate Collection Set: 0.2ms
其实还有很多参数,自行百度搜索 。。。。。
7.2 垃圾回收器参数总结
每个垃圾回收和其对应的垃圾回收参数
参数描述
模式 + Old 回收
9后不支持+ Old
+CMS+ Old;CMS失败后 Old
9之前默认+Old
+Old
Eden : 默认是8 代表8:1
ld
byte 超过直接老年代
每次 年龄+1 ,超过这个直接老年代
y
动态堆大小和动态进入老年代的年龄
re
允许老年代担保失败