JVM之 方法区 和 堆 的总结(学习笔记)
Posted 猎人在吃肉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM之 方法区 和 堆 的总结(学习笔记)相关的知识,希望对你有一定的参考价值。
文章目录
1、方法区
此处默认都是 hotspot 虚拟机,JDK7。
Method Area
(方法区), 是 《JVM 规范》 定义的,所有虚拟机必须有的。
PermGen space
,有时缩写为 PermGen
,全称是 Permanent Generation space
,中文是 永久代,是指内存的永久保存区域。
这块内存主要是被JVM存放Class和Meta信息的, Class 在被 Loader 时就会被放到 PermGen space
中。
JVM 中 方法区、永久代(PermGen space)、元空间(Metaspace)三者的区别 : https://blog.csdn.net/xiaojin21cen/article/details/104267301
1.1、方法区、永久代(PermGen space
)、 Metaspace
(元空间)的区别
-
方法区, 是 《JVM 规范》 定义的,所有虚拟机必须有的。
-
PermGen space
则是 HotSpot 虚拟机基于《 JVM 规范》 对方法区
的一个落地实现。
只有 HotSpot 才有PermGen space
, 而比如 JRockit(Oracle)、J9(IBM) 虚拟机就没有PermGen space
。 -
针对 HotSpot 虚拟机 ,
JDK7及之前,PermGen space
就是 方法区。
JDK8及之后,PermGen space
被移除, 换成Metaspace
(元空间),也是对方法区
的新的实现。
总结:
JDK6、JDK7 时,方法区 就是PermGen(永久代)。
JDK8 时,方法区就是 Metaspace(元空间)
举例:
小王和小李都想买一辆汽车 (方法区),
因为家境不同,
小王买了一辆 轿车奥迪A6L (PermGen space),
小李买了一辆 面包车宝骏730 (Metaspace ) 。
轿车奥迪A6 和 面包车宝骏730 都是汽车;
PermGen space、Metaspace 对 方法区 的一种落地的实现。
1.2、方法区的使用
方法区是被所有线程共享。
所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。
简单说,所有定义的方法的信息都保存在该区域,此区属于共享区间。
静态变量
+ 常量
+ 类信息(构造方法/接口定义)
+ 运行时常量池存
在方法区中 。
但是, 实例变量
存在 堆内存
中,和方法区无关。
以上,只是逻辑上的定义。在HotSpot中,方法区仅仅只是逻辑上的独立,实际上还是包含在Java堆中,也是就说,方式区在物理上属于Java堆区中的一部分,而永久区(Permanent Generation)
就是方法区的实现。
1.3、方法区 和 字符串常量池存
的变化
JDK版本 | 方法区的实现 | 字符串常量池所在的位置 |
---|---|---|
JDK6 及之前 | PermGen space(永久代) | PermGen space(永久代) |
JDK7 | PermGen space(永久代) | Heap(堆) |
JDK8 | Metaspace(元空间) | Heap(堆) |
2、堆 (heap)
一个JVM实例只存在一个堆内存,堆内存的大小是可以调节的。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,保存所有引用类型的真实信息,以方便执行器执行。
堆 在逻辑上分为三部分 新生区 + 养老区 + 永久区(Perm)
- 新生代(Young Generation,常称为YoungGen),位于堆空间;
- 老年代(Old Generation,常称为OldGen、TenuringGen),位于堆空间;
- 永久代(Permanent Generation,常称为PermGen),位于非堆空间。
2.1、新生区(New/Young Generation)
新生代(Young Generation),常称为YoungGen,位于堆空间;
新生区 又分为 Eden区 和 Survior(幸存区)。
Eden : 新创建的对象
Survior 0、1:经过垃圾回收,但是垃圾回收次数小于15次的对象
2.2、养老代(Old Generation)
老年代(Old Generation),常称为OldGen,位于堆空间;
Old : 垃圾回收次数超过15次,依然存活的对象
以上是关于JVM之 方法区 和 堆 的总结(学习笔记)的主要内容,如果未能解决你的问题,请参考以下文章