一 方法区与其他内存结构关系
直接上图
二 参数设置方法区的大小
JDK7:
-XX:PermSize= :永久代初始分配大小,默认20.75M
-XX:MaxPerSize= :永久代最大值:32位默认64M,64位默认82M
JDK8:
-XX:MetaSpaceSize=:元空间初始分配大小,默认21M
-XX:MaxMetaSpaceSize=:默认-1,即没有限制(使用的是本地内存)
三 方法区的存储(面试)
存储了:类型信息、运行时常量池、静态变量、JIT代码缓存、域信息、方法信息
1.常量池和运行时常量池:
常量池:
在字节码文件中,存储各种字面量和 对类型、域和方法的符号引用,也可以看作是一张表。
运行时常量池:
以常量池表的形式存在,用于存放编译器生成的各种字面量与符号引用,这部分内容将在类加载后存到方法区的运行时常量池,和字节码文件中的常量池最大的区别是具有动态性
2.不同版本的jdk对应的方法区和堆的内存结构关系
注:StringTable为字符串常量池
JDK6:
JDK7:
JDK8:
1.永久代被元空间替换的原因:
1.为永久代设置大小很难确定
2.永久代难以调优
替换之后减少GC,提高性能
2.StringTable调整的原因
永久代回收效率比较低,在Full GC时才回收,所以回收效率不高,而开发时需要大量字符串,需要提高回收效率。
方法区的垃圾回收主要包括两部分:
1.常量池中的废弃的常量
2.不再使用的类型
四 堆、方法区的大厂面试题
(答案在前文和上篇堆专题里都能找到,也可评论交流)
1.JVM内存模型都有哪些,分别都是做什么的?
2.Java8的内存分代改进
3.JVM的内存分布/内存结构如何?谈谈栈和堆的区别?为什么有两个survivor区?
4.Eden区和Survivor的比例分配
5.JVM为什么有新生代和老年代?
6.什么时候对象会进入老年代?
7.JVM的永久代会发生垃圾回收吗?