JVM读书笔记

Java虚拟机的基本结构
栈上分配:技术基础是进行逃逸分析,逃逸分析的目的是判断对象的作用域是否有可能逃逸出函数体.
栈上分配速度快,可以有效避免垃圾回收带来的负面影响

方法区:决定系统可以保存多少个类 1.6/1.7中可视为永久区 -XX:PermSize,-XX:MaxPermSize配置(默认为64M)
注意:动态代理在运行时会生成大量类.
1.8中永久区被元数据区取代,由-XX:MaxMetaspaceSize分配,如果不指定大小,则虚拟机会耗尽所有的可用内存.
类加载的跟踪:-XX:+TraceClassLoading.

新生代的设置:-Xmn 一般为整个堆空间的1/3到1/4左右
基本策略是:尽可能将对象预留在新生代,减少老年代GC的次数.
-XX:NewRatio:配置老年代与新生代的比例.

直接内存可以用-XX:MaxDirectMemorySize设置,默认为最大堆空间,直接内存适合申请次数较少,访问较频繁的场合(allocateDirect)

常见的垃圾回收算法:
引用计数法,标记压缩法,标记清除法,复制算法,分代分区
引用计数法:无法处理循环引用的情况,性能差
标记清除算法是现代垃圾回收算法的基础,缺点是会产生空间碎片的问题
Java新生代串行垃圾回收器中,使用了复制算法的思想
复制算法的思想:将原有的内存空间分为两块,每次只使用其中一块,在垃圾回收时,将正在使用的内存中的存活对象复制到未使用的内存块中,之后清除正在使用的内存块中的所有对象,交换两个内存的角色,完成垃圾回收.
复制算法比较适用于新生代(垃圾对象多)
标记压缩法:用于老年代,是对标记清除法的优化,也被称为标记清除压缩算法

卡表

Java中提供了四个不同级别的引用:强引用,软引用,弱引用和虚引用

垃圾回收会产生系统的停顿现象Stop-The-World(STW)

垃圾收集器种类:
串行垃圾回收器,并行垃圾回收器,CMS回收器,G1回收器

CMS回收器:初始标记/并发标记/预清理/重新标记/并发清楚和并发重置,其中初始标记和重新标记是独占资源的,即此时的系统应用是停顿的;
启用CMS的参数是-XX:+UseConcMarkSweepGC 其默认的启动的并发线程数是(ParallelGCThreads+3)/4,其中的参数表示GC并行时使用的线程数量
注意:并发是指收集器与系统应用交替执行,并行是指应用程序停止运行,同时由多个线程一起执行GC.
并发数量可以通过设定,当资源比较紧张时,收到CMS回收器线程的影响,应用系统的性能在垃圾回收阶段可能会非常糟糕.
使用建议:可以使用-XX:CMSInitiatingOccupancyFraction进行优化,默认是68,如果应用内存增长缓慢,则可以设置一个稍大的值,反之,则设一个小的参数,默认是68,此外,CMS是标记清除算法,可以使用-XX:+UseCMSCompactAtullCollection控制多少次CMS回收后进行一次内存压缩.

G1回收器:JDK1.7中正式使用,从长期看是为了取代CMS,属于分代垃圾回收器
相关参数设置:-XX:+UseG1GC–标记打开G1收集器
-XX:MaxGCPauseMillis最重要的参数设置,制定目标最大停顿时间,-XX:ParallelGCThreads,设置GC工作线程的数量,默认是45;InitiatingHeapOccupancyPercent谨慎使用

考虑到对象分配几乎是Java最常用的动作,因此Java虚拟机采用了TLAB线程专属的区间避免多线程冲突,提高对象分配的效率.

猜你喜欢

转载自blog.csdn.net/u012418845/article/details/78615783