作者回复: 非常不错的总结
作者回复: 很好的视角,g1 region之类确实有影响,另外g1还是有年代的概念的
作者回复: 也对,最好综合考虑堆内存结构、gc区别等,后续会讲解
作者回复: metaspace 默认是自增的,永久带做不到
作者回复: 简单点处理,可以:
先看看永久带给了多大,如果太小,可以适当增大,使用'-XX:MaxPermSize=NNNm';
如果没开启classunloading,可以根据GC选项做配置,例如,如果使用的CMS,可以加上“-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled”
通常就能解决问题了,如果还是有问题,那就要看看是不是出现了classloader leak,常见做法如,取Heap dump,然后用类似Eclipse MAT这样的工具,看看有没有不回收的自定义classloader实例之类
作者回复: Oracle官网也提供了很多好的文档:
虚拟机规范 https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
诊断指南 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/index.html
调优指南 https://docs.oracle.com/javase/10/gctuning/
Openjdk网站,或者那些感兴趣的邮件列表 http://mail.openjdk.java.net/mailman/listinfo
YouTube上查查javaone, JVM summit之类
回头有必要整理个书单之类
但这些东西太多了,自己把握一下
作者回复: 不错,可能性很多,其实和gc的选择也有关,例如g1 region比较小
作者回复: 不错,下一章会有更多内存结构细节
作者回复: 不是,方法区只是个逻辑概念,永久带和元数据区是具体设计、实现的选择;
以前放到永久带,而且永久带内部还有类似intern字符串之类内容;
元数据区具体内容和永久带也有区别,文章介绍了;
那个图只是个简化示例,8去掉永久带就是了,具体到比较复杂的gc比如g1,就不是这个结构,请看后面讲
作者回复: 怎么叫都有,看上下文,jsr133 jmm是解决多线程环境一致性,或者可以看做memory ordering model
作者回复: 也对,回答比较简洁,哈哈
作者回复: 是的