1.JVM内存模型
-
每个线程独占一个栈
-
线程中要执行的方法会以FILO先进后出的方式存储在栈中,每个方法都是一个栈帧。
-
栈帧中包含:局部变量表,操作数栈,动态链接,方法出口
- 局部变量表:存储当前要执行的方法内部的局部变量
- 操作数栈:使用javap命令转译class文件后,可以看到参与计算的数值会进入操作数栈进行计算。存放操作的变量的数值。
- 动态链接:
- 方法出口:会指向栈底的下一个方法,此方法执行完毕会执行栈中下一个方法。
2.JVM内存参数设置
- Xss:每个线程的栈大小。
- Xms:设置堆的初始可用大小,默认为物理内存的1/64.
- Xmx:设置堆的最大大小,默认为物理内存的1/4.
- Xmn:新生代大小。
- XX:newRadio:默认2,表示新生代占老年代的1/2,占整个堆内存的1/3.
- XX:survivorRadio:默认8,表示占eden取1/8,即新生代1/10的内存。
关于元空间的JVM参数:
- -XX:MaxMetaspaceSize:设置元空间的最大值,默认-1,即不做限制
- -XX:MetaspaceSize:指定元空间触发full gc的初始阈值,默认21M。达到阈值会触发full gc进行卸载,同时gc会对该值进行调整:如果释放了大量的内存空间,就降低此值,如果释放了很少的空间,就提高该值。 调整元空间大小需要full gc,属于代价昂贵的操作,在应用启动的过程中如果发生大量full gc,通常都是永久代大小发生了调整。一般建议元空间两个参数设置为相同的值,并且比初始值要大。