关于JVM的知识和参数的调优
- 概念:
- JRE中的核心概念就是JVM
- JMM是java内存模型
- 三大核心:
- JVM的类加载机制
- jvm的运行时数据区
- jvm的垃圾回收机制
- 类加载器:在jvm启动或者在类运行时将需要的class加载到jvm中
- 执行引擎:负责执行class文件中包含的字节码指令
- 内存区:是在jvm运行的时候操作所分配的内存区。运行时内存主要分为5部分:方法区,堆内区,虚拟机栈,本地方法栈,程序计数器
- 本地方法接口:主要调用c或c++实现的本地方法及返回结果。
- 进一步的细分运行时数据区
- 方法区 永久代
- 堆内区 1.年轻代 2.老年代
- 栈(私有 栈)1.本地方法栈 2.程序计数器 3.java虚拟机栈
- JVM各区域的作用
- 堆:就是程序运行时创建的各种对象,java堆是垃圾管理的主要区域,因此也叫GC堆。
- 方法区:是线程共享的通常用来保存装载类的元结构信息。主要用于存储虚拟机加载的类信息,常量,静态变量以及编译器编译后的代码等数据。
- 程序计数器:当前线程所执行的字节码的行号指示器。
- 举例说明:
-
方法栈深度溢出
public class Heap { public static void main(String[] args) { test(); } /** * 方法栈深度溢出 */ public static void test() { test(); } }
-
堆内存空间不足:
//idea中设置:VM opention:-Xmx500m 可以尽快抛出异常 public class Heap { public static void main(String[] args) { /** * OutOfMemoryError:Java heap space */ ArrayList list=new ArrayList(); while(true) { list.add(new Heap()); } } }
-
- 垃圾回收
- 吞吐率:(运行时间-垃圾回收时间)/运行时间
- 最大停顿时长:垃圾回收的次数中最大的时间
- 对一个对象判断是否存活两种方式:1.引用计数 2.可达性分析
- GC分为新生代GC MinorGC 和老年代GC Fill GC
- 四种垃圾回收算法:
- 标记清楚算法:算法分为标记和清除两个阶段,首先标记处所有要回收的对象,在标记完成之后统一收回别标记的对象。缺点就是效率不高,而且会产生大量的内存碎片。
- 复制算法:将可用内存容量划分为大小的两块,每次只使用其中一块,当着一块内存用完了就将活着的对象复制到另一块上,把这一块完全清除。缺点就是使用的内存大小缩小为原来的一半,长久存在对象则导致其效率变慢。(年轻代)
- 标记整理算法:是算法和标记清除一样,但是后续的步骤不是直接对可回收的对象进行清除,而是让活着的对象都向一端移动,然后直接清理掉端边界以外的内存。(年老代)
- 分代收集算法:根据不同代的特性选择适合的垃圾收集算法。
- 五种垃圾收集器:
- Serial收集器又叫串行收集器:最古老的最稳定的单线程的收集器。缺点:就是会产生服务暂停,也就是停顿时间过长。
使用-XX:+UseSerialGC来开启。 - ParNew收集器:Serial收集器的多线程版本。-XX:UseParNewGC 开启这种收集器 -XX:ParallelGCThreads 限制线程数量。也会发生挺顿但还是比串行收集器停顿的时间短。
- Parallel收集器:这个收集器更加注重系统的吞吐量。-XX:UseParallelGC 开启这种收集器 -XX:UseParallelOld 开启老年代使用Parallel收集器-XX:GCTimeRatio:指定运行应用代码的时间占总时间的比例 默认为99。-XX:MaxGCPauseMillis:设置GC的最大停顿时间
- CMS收集器:以获取最短回收时间停顿为目标的收集器。步骤分为4步:1.初始标记 2.并发标记 3.重新标记 4.并发清除
-XX:UseConcMarkSweepGC 使用cms收集器-XX:UseCMSCompactAtFullCollection:FullGC 之后进行一次碎片整理。-XX:+CMSFullGCsBeforeCompaction 设置进行几次碎片整理。-XX:ParallelCMSThreads:设置线程的数量。
-G1收集器:采用标记整理算法进行垃圾回收。-XX:UseG1GC使用G1垃圾回收器
- Serial收集器又叫串行收集器:最古老的最稳定的单线程的收集器。缺点:就是会产生服务暂停,也就是停顿时间过长。
- 设置JVM的参数列表
- -Xmx3550m:最大对内存为3550m
- -Xms3550m:初始堆内存为3550m
- Xmn2g:设置年轻代大小为2g
- Xss1m:设置每个线程的堆栈的内存大小
- -XX:NewRation=4:设置年轻代和年老代的比例
- -XX:SurvivorRatio=4:设置年轻代中Eden与Survivor的大小比值
- -XX:MaxPermSize=16M;设置持久代的大小
- -XX:MaxTenuringThreshold=15:设置垃圾最大年龄在from Servivor 和to Servivor中15次后把这个对象放到old中
- 垃圾回收统计信息
- XX:+PrintGC
- XX:+PrintGCDetails
- XX:+PrintGCTimeStamps
- Xloggc:filename