分析&回答
1.7 OR 1.8 JVM内存结构
1.8 JVM内存结构
JVM控制参数
先看一张图,这张图能很清晰的说明JVM内存结构的布局和相应的控制参数:
控制参数:
- 堆(Heap):
- -Xms 设置堆的最小空间大小。
- -Xmx 设置堆的最大空间大小。
- -XX:NewSize 设置新生代最小空间大小。
- -XX:MaxNewSize 设置新生代最大空间大小。
- 没有直接设置老年代的参数,但是可以设置堆空间大小和新生代空间大小两个参数来间接控制。
- 老年代空间大小=堆空间大小-年轻代大空间大小
- 方法区
- -XX:PermSize 设置永久代最小空间大小。
- -XX:MaxPermSize 设置永久代最大空间大小。
- 栈/本地方法栈
- -Xss 设置每个线程的堆栈大小。
反思&扩展
永久代为什么被替换了
表面上看是为了避免OOM异常。因为通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。
当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。
更深层的原因还是要合并HotSpot和JRockit的代码,JRockit从来没有所谓的永久代,也不需要开发运维人员设置永久代的大小,但是运行良好。同时也不用担心运行性能问题了,在覆盖到的测试中, 程序启动和运行速度降低不超过1%,但是这点性能损失换来了更大的安全保障。
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!