JVM内存模型与操作系统内存模型
Java进程在操作系统内存中的结构
JVM内存模型
可以这样理解:JVM内存模型其实就是JVM在启动的时候从操作系统内存中要了一块大内存,然后将这个大内存分成五个区域:方法区、堆区、虚拟机栈、本地方法栈、本地方法栈、程序计数器.其实叫JVM运行时区域更合适。但是要区分JVM内存模型与JMM(Java Memory Model)
InstanceKlass:类的元信息(方法区)
InstanceMirrorKlass:镜像类Class对象(堆区)
四个名词:
class文件:即硬盘上的.class文件
class content:类加载器将硬盘上的.class文件读入内存中的那一块内存区域
Class对象:
Class<?> clazz = Test.class
对象:
Test obj = new Test();
方法区
方法区是虚拟机的一种规范
不同版本虚拟机堆方法区的具体实现
永久代(1.8之前是在堆区)
元空间(1.8之后,在直接内存上)
- 1.永久代的缺点?
放在堆上,很难触犯类的卸载机制
1.1 Class对象没有被使用
1.2 被三大类加载器加载的类不会被卸载,自定义类加载器才会被卸载
1.3 释放的内存很少
1.4 为什么早期没有一开始使用元空间的方式呢?早期是没有成熟的动态字节码技术的,现在cglib、asm技术、热更新技术可能会去创建新的类,会造成永久代的OOM,进而会引发堆区的OOM - 2.元空间是如何解决?
2.1 不放在堆区,放在直接内存 - 3.元空间内部是如何存储的?元空间存在的问题?以及后面会如何优化
类加