jvm主要知识点小结之 方法区及大场面试题

一 方法区与其他内存结构关系

直接上图

jvm主要知识点小结之 方法区及大场面试题

jvm主要知识点小结之 方法区及大场面试题

二 参数设置方法区的大小

JDK7:

-XX:PermSize=  :永久代初始分配大小,默认20.75M

-XX:MaxPerSize= :永久代最大值:32位默认64M,64位默认82M

JDK8:

-XX:MetaSpaceSize=:元空间初始分配大小,默认21M

-XX:MaxMetaSpaceSize=:默认-1,即没有限制(使用的是本地内存)

 

三 方法区的存储(面试)

存储了:类型信息、运行时常量池、静态变量、JIT代码缓存、域信息、方法信息

1.常量池和运行时常量池:

常量池:

在字节码文件中,存储各种字面量和 对类型、域和方法的符号引用,也可以看作是一张表。

运行时常量池:

以常量池表的形式存在,用于存放编译器生成的各种字面量与符号引用,这部分内容将在类加载后存到方法区的运行时常量池,和字节码文件中的常量池最大的区别是具有动态性

2.不同版本的jdk对应的方法区和堆的内存结构关系

注:StringTable为字符串常量池

JDK6:

jvm主要知识点小结之 方法区及大场面试题

JDK7:

jvm主要知识点小结之 方法区及大场面试题

JDK8:

jvm主要知识点小结之 方法区及大场面试题

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的永久代会发生垃圾回收吗?