每个区域的作用:
- 方法区(线程共享)
存放类的二进制字节码文件(二进制字节码文件中包括:类基本信息,常量池,类方法定义,包含了虚拟机指令);
所有java虚拟机共享的区,存储了和类的结构、类信息
类结构:运行时常量池(含字符串常量),静态变量,类的信息,常量
类信息:魔数,版本号,常量池,类(字段和方法),父类和接口数组,字段,方法等信息。
可以结合类加载器理解:所有上述的信息在Class对象中都可以获取到
方法区逻辑上是堆的一部分,不同厂商在具体实现时不一定,方法区的位置不固定,方法区会产生内存溢出;
方法区是JVM中的一个规范,永久代和元空间是方法区的两个不同实现;
Jdk1.8之前使用永生代实现,1.8之后使用元空间实现。
-
堆(线程共享)
通过new关键字创建的对象都会由堆存储;堆中不再被引用的对象会通过垃圾回收机制自动回收
细分一点的内存结构:年轻代、老年