一、概述
先来说下JVM调优主要是在调啥?
调优就是调节JVM运行时内存大小+gc垃圾回收细节,要想调整JVM运行时内存大小
需要我们知道JVM内存划分知识以及要想调整gc垃圾回收的细节;
需要我们知道垃圾回收器工作原理以及它们使用的垃圾回收算法;
需要我们知道垃圾回收的一个流程以及调优的基本原则(能在年轻代回收掉的不要留到老年代,减少Full GC 次数);
二、知识点划分
1)JVM内存划分
JVM运行时内存划分图
堆(heap):这块区域主要存放对象的,比如说我们程序中new User()对象它就会被分配到这块区域,这块区域是共享的,也就是所有线程都可以访问该区域的对象,堆也是垃圾回收主要区域。
java虚拟机栈 (vm stack): 这块区域存放我们线程运行时的一些数据,它是每个线程私有的,可以理解为一个线程就对应的着一个java虚拟机栈,它里面就是一个个的栈帧组成的,一个方法就是一个栈帧,栈帧里面有局部变量表,操作数栈,常量池的引用,方法返回地址等;
比如下面这段代码:
public static void main(String[] args) {
int a=1;
int b=2;
int c= a+b;
System.out.println(c);
c=0;
}
这段代码就是计算a+b 为c,然后调用println方法打印c的值。
这里面 a,b,c 就在局部变量表中,在算c的时候就是使用的操作数栈算的,然后调用println方法打印c其实就是往java 虚拟机栈 压入一个println 方法的栈帧。
println栈帧中会保存着一个返回地址(也就是方法返回地址),当println方法执行完成后,会进行弹栈,然后程序跳到返回地址位置,也就是c=0 位置继续执行。
本地方法栈(native stack):它与java虚拟机栈功能差不多,只不过java虚拟机栈是运行的java方法,而本地方法栈主要是执行的native方法。在hotspot虚拟机中将本地方法栈与java虚拟机栈合二为一。
元数据(Metaspace):这个是java8 的新概念,以前叫方法区,主要是存放着我们的class类信息,我们