当前位置:网站首页>说下你对方法区演变过程和内部结构的理解
说下你对方法区演变过程和内部结构的理解
2022-06-25 15:36:00 【InfoQ】

简介


永久代、元空间
直接内存
方法区的大小
jdk7 及以前
-XX:PermSize=N //方法区 (永久代) 初始分配空间,默认值为 20.75M
-XX:MaxPermSize=N //方法区 (永久代) 最大可分配空间。32位机器默认是64M,64位机器默认是82M
jdk8及以后
-XX:MetaspaceSize=N //方法区 (元空间) 初始分配空间,如果未指定此标志,则元空间将根据运行时的应用程序需求动态地重新调整大小。
-XX:MaxMetaspaceSize=N //方法区 (元空间) 最大可分配空间,默认值为 -1,即没有限制
- 永久代:OutOfMemoryError:PermGen space
- 元空间:OutOfMemoryError:Metaspace
jvisualvm
public class MethodAreaDemo1 {
public static void main(String[] args) {
System.out.println("start...");
try {
Thread.sleep(1000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end...");
}
}

高水位线
XX:MetaspaceSize=21- 如果释放的空间不足,那么在不超过 MaxMetaspaceSize 时,适当提高该值;
- 如果释放空间过多,则适当降低该值。
-XX :MetaspaceSize内部结构

类型信息
- 这个类型的完整有效名称(全名=包名.类名)
- 这个类型直接父类的完整有效名(对于 interface 或是 java. lang.Object ,都没有父类)
- 这个类型的修饰符( public , abstract, final 的某个子集)
- 这个类型直接接口的一个有序列表
域(Field)信息
- JVM必须在方法区中保存类型的所有域(field,也称为属性)的相关信息以及域的声明顺序;
- 域的相关信息包括:域名称、 域类型、域修饰符(public, private,protected, static, final, volatile, transient 的某个子集)
方法(Method)信息
- 方法名称
- 方法的返回类型(或void)
- 方法参数的数量和类型(按顺序)
- 方法的修饰符(public, private, protected, static, final,synchronized, native , abstract 的一个子集)
- 方法的字节码(bytecodes)、操作数栈、局部变量表及大小( abstract 和 native 方法除外)
- 异常表( abstract 和 native 方法除外)每个异常处理的开始位置、结束位置、代码处理在程序计数器中的偏移地址、被捕获的异常类的常量池索引
non-final 的类变量
- 静态变量和类关联在一起,随着类的加载而加载,他们成为类数据在逻辑上的一部分
- 类变量被类的所有实例所共享,即使没有类实例你也可以访问它。
public class MethodAreaDemo2 {
public static void main(String[] args) {
Order order = null;
order.hello();
System.out.println(order.count);
}
}
class Order {
public static int count = 1;
public static final int number = 2;
public static void hello() {
System.out.println("hello!");
}
}
hello!
1
javap -v -p MethodAreaDemo2.class
运行时常量池
常量池表

为什么字节码文件需要常量池?
运行时常量池
Runtime Constant PoolString.intern()演进细节
- jdk1.6 及之前:有永久代,静态变量存放在永久代上;
- jdk1.7:有永久代,但已经逐步“去永久代”,字符串常量池、静态变量移除,保存在堆中;
- jdk1.8及之后: 无永久代,类型信息、字段、方法、常量保存在本地内存的元空间,但字符串常量池、静态变量仍在堆中;
演变示例图



为什么要将永久代替换为元空间呢?
- 永久代使用的是 JVM 的内存,受 JVM 设置的内存大小限制;元空间使用的是本地直接内存,它的最大可分配空间是系统可用内存的空间。因为元空间里存放的是类的元数据,所以随着内存空间的增大,能加载的类就更多了,相应的溢出的机率会大大减小。
- 在 JDK8,合并 HotSpot 和 JRockit 的代码时,JRockit 从来没有一个叫永久代的东西,合并之后就没有必要额外的设置这么一个永久代的地方了。
- 对永久代进行调优是很困难的。
StringTable 为什么要调整
StringTable垃圾回收
- 字面量比较接近 Java 语言层次的常量概念,如文本字符串、被声明为 final 的常量值等。
- 符号引用则属于编译原理方面的概念,包括类和接口的全限定名、字段的名称和描述符、方法的名称和描述符。
类型判定
- 该类所有的实例都已经被回收,也就是 Java 堆中不存在该类及其任何派生子类的实例;
- 加载该类的类加载器已经被回收,这个条件除非是经过精心设计的可替换类加载器的场景,如OSGi、JSP的重加载等,否则通常是很难达成的;
- 该类对应的 java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
边栏推荐
- Brief object memory layout
- Architecture evolution of high-performance servers -- Suggestions
- 解析数仓lazyagg查询重写优化
- Yadali brick playing game based on deep Q-learning
- 基于深度Q学习的雅达利打砖块游戏博弈
- 剑指 Offer 05. 替换空格
- Desktop development (Tauri) opens the first chapter
- MySQL transaction characteristics and implementation principle
- NFT元宇宙发展能做什么?
- What is the safest app for stock account opening? Tell me what you know
猜你喜欢

免费送书啦!火遍全网的AI给老照片上色,这里有一份详细教程!

For the first time in Chinese universities! Unique in the world! Tongji students win international awards

CPU over high diagnosis and troubleshooting
Open the box to experience rust, come on!!!

Distributed token

MySQL performance optimization - index optimization

Rapport de la main - d'oeuvre du Conseil de développement de l'aecg air32f103cbt6

VectorDraw Developer Framework 10.1001 Crack

解决Visio和office365安装兼容问题
How to convert a recorded DOM to a video file
随机推荐
Binocular 3D perception (I): preliminary understanding of binocular
Talk about the creation process of JVM objects
剑指 Offer 09. 用两个栈实现队列
Optimization of lazyagg query rewriting in parsing data warehouse
合宙Air32F103CBT6开发板上手报告
What is the safest app for stock account opening? Tell me what you know
CPU over high diagnosis and troubleshooting
[golang] leetcode intermediate - find the first and last position of an element in a sorted array & Merge interval
Getting started with lambda8 new features
剑指 Offer II 091. 粉刷房子
How to debug grpc by postman
MySQL transaction characteristics and implementation principle
AspNetCore&云效Flow持续集成
Architecture evolution of high-performance servers -- Suggestions
Source code analysis of nine routing strategies for distributed task scheduling platform XXL job
Super comprehensive custom deep copy function
Completabilefuture of asynchronous tools for concurrent programming
《睡眠公式》:怎么治睡不好?
VectorDraw Developer Framework 10.1001 Crack
Ten routing strategies for distributed task scheduling platform XXL job