在学习JVM的时候,先了解一张整体的结构图和对应的名词。
1.堆:存储类实例,一个jvm只有一个堆内存。
2.栈(虚拟机栈):存储当前线程运行方法时所需要的数据,指令,返回地址等。
3.程序计数器:指向当前线程正在执行的字节码的地址,行号。
4.方法区(元空间):存储类信息,常量,运行时常量,静态变量等。
5.本地方法栈:同虚拟机栈,不同的是,它存的本地方法的数据。
写一个简单的demo程序
public class Math {
public int compute(){
int a = 1;
int b = 2;
int c=(a+b)*10;
return c;
}
public static void main(String[] args) {
Math math = new Math();
math.compute();
}
}
可以通过命令javap -c Math.class 进行生成一个汇编文件。
0 iconst_1
1 istore_1
2 iconst_2
3 istore_2
4 iload_1
5 iload_2
6 iadd
7 bipush 10
9 imul
10 istore_3
11 iload_3
12 ireturn
可以对照jvm手册看出每一行的具体指令的含义。很明显,jvm运行时就由开始的五部分组成。
接下来具体说下对结构
年轻代:里面有Eden与Survivor区,默认占比是8:1:1.内存占用1/3
老年代:占用内存的2/3
jvm内存参数的设置:
java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar microservice‐eurek a‐server.jar
关于元空间的jvm参数有两个: -XX:MetaspaceSize 和 ‐XX:MaxMetaspaceSize
1.-XX:MetaspaceSize 设置元空间最大值,默认值是-1,即不限制,根据本地的内存大小。
2.‐XX:MaxMetaspaceSize 指定元空间触发Full gc 的初始阈值(元空间无固定的初始值),以字节为单位,默认为21M,达到该值就会触发full gc。同时收集器会对该值进行调整;
3.-Xss设置越小count值越小,说明一个线程栈里能分配的栈帧就越少。