描述一下 JVM 的内存结构?

373 阅读2分钟

分析&回答

1.7 OR 1.8 JVM内存结构

image.png

1.8 JVM内存结构

image.png

JVM控制参数

先看一张图,这张图能很清晰的说明JVM内存结构的布局和相应的控制参数:

image.png

控制参数:

  • 堆(Heap):
    • -Xms 设置堆的最小空间大小。
    • -Xmx 设置堆的最大空间大小。
    • -XX:NewSize 设置新生代最小空间大小。
    • -XX:MaxNewSize 设置新生代最大空间大小。
    • 没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。
      • 老年代空间大小=堆空间大小-年轻代大空间大小
  • 方法区
    • -XX:PermSize 设置永久代最小空间大小。
    • -XX:MaxPermSize 设置永久代最大空间大小。
  • 栈/本地方法栈
    • -Xss 设置每个线程的堆栈大小。

反思&扩展

永久代为什么被替换了

表面上看是为了避免OOM异常。因为通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。

当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。

更深层的原因还是要合并HotSpot和JRockit的代码,JRockit从来没有所谓的永久代,也不需要开发运维人员设置永久代的大小,但是运行良好。同时也不用担心运行性能问题了,在覆盖到的测试中, 程序启动和运行速度降低不超过1%,但是这点性能损失换来了更大的安全保障。


喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!