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(永久代)
JDK7PermGen space(永久代)Heap(堆)
JDK8Metaspace(元空间)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之 方法区 和 堆 的总结(学习笔记)的主要内容,如果未能解决你的问题,请参考以下文章

Java GC的工作原理详解

关于JVM了解学习心得总结记录

JVM内存管理和JVM垃圾回收机制

JVM学习-之对象的创建和内存分配

JVM 内存区域总结:方法区+堆内存+本地方法栈+元空间——JVM系列

JVM 内存区域总结:方法区+堆内存+本地方法栈+元空间——JVM系列