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(永久代)
JDK7Heap(堆)

方法区的实现:

JDK版本方法区的实现
JDK7及之前PermGen space(永久代)
JDK8Metaspace(元空间)

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次,依然存活的对象

  • 8
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值