JVM性能调优
JVM内存模型:堆、栈、本地方法栈、程序计数器、元空间(方法区) 学习来自于:juejin.cn/post/684790…
1. 程序计数器
程序计数器是一块比较小的空间,它是当前线程所执行的字节码的行号指示器
1.1 程序计数器的作用
在java虚拟机中的多线程是通过线程的切换、分配处理器执行时间的方式来完成的。那么如何确认在切换完成另外一个线程回来的时候能够恢复到准确的位置,所以每一个线程都有一个独立的程序计数器(通常这个要和栈联系到一起)。
1.2 程序计数器的特点
- 空间小
- 线程私有
- 生命周期随着线程,线程在就在,线程结束就没了
- 不会出现OOM
2. 本地方法栈
为虚拟机提供调用本地方法服务的地方
3. java虚拟机栈(stack)
3.1 java虚拟机栈的定义
他的生命周期和线程一样,他描述的是java方法执行的线程内存模型。
每一个方法被执行的时候都会压入一个栈帧。
栈帧里面包括有局部变量表、操作数栈、动态链接(这边需要和堆、元空间进行联系深入学习)、方法出口。
当方法执行完了,也就是当前线程结束的时候栈帧会出栈
3.2 java虚拟机栈的特点
- 当线程请求的栈的深度大于虚拟机所允许的深度,就会出现StackOverflowError
- 如果java虚拟机栈容量可以自动扩容,当一直扩容一直扩容到无法扩容的时候还爆满就会出现OOM
4. java堆(Heap)
4.1 堆的定义
首先heap是内存中最大的一块。线程共享,在虚拟机启动的时候创建。
这个内存区域的唯一目的就是为了存放内存实例。
Java堆是垃圾收集管理的主要区域(GC堆)。主要分为两个区域:
- 新生代:Eden、FromSurvivor、ToSurvivor(8:1:1) 1
- 老年代 2
4.2 堆区的调整
调整参数
可以设定堆的初始值和最大值:-Xms256M -Xmx1024M
-X字母表示是JVM运行时参数,ms代表memory start,mx代表memory max。
PS:在通常的情况下:服务器的运行过程中ms和mx都会设置一样的大小避免GC后调整堆大小带来的额外压力。
4.3 OOM异常
堆满了OOM
5. 方法区(元空间)
方法区和堆一样,都是线程共享的区域,他用来储存类信息、常量、静态变量、编译器编译了之后的代码缓存。1.8之后元空间不在虚拟机中,所以他受到本地内存的限制。