3.JVM内存模型与优化

45 阅读2分钟

1.JVM内存模型

image.png

  • 每个线程独占一个栈

  • 线程中要执行的方法会以FILO先进后出的方式存储在栈中,每个方法都是一个栈帧。

  • 栈帧中包含:局部变量表,操作数栈,动态链接,方法出口

    • 局部变量表:存储当前要执行的方法内部的局部变量
    • 操作数栈:使用javap命令转译class文件后,可以看到参与计算的数值会进入操作数栈进行计算。存放操作的变量的数值。
    • 动态链接:
    • 方法出口:会指向栈底的下一个方法,此方法执行完毕会执行栈中下一个方法。

2.JVM内存参数设置

image.png

  • 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,通常都是永久代大小发生了调整。一般建议元空间两个参数设置为相同的值,并且比初始值要大。