JVM —堆内存区域的认识

一个JVM只有一个堆,堆的大小是可以调节的。
堆中存放的内容:
当类加载器读取完类文件后,会把类,方法,常量,变量等存放在堆中,保存的是我们所有引用对象的真实对象,也就是真实引用对象的数据等。
堆内存中的三个区域:

  • 新生区
  • 老年区
  • 永久区
    堆中要进行垃圾回收(GC)

在这里插入图片描述

GC垃圾回收主要是在伊甸园区和老年区。
堆内存溢出就是OOM。就是在连老年区都溢出了之后,整个内存已经无法承受,就会报出堆内存溢出的错误。

JDK1.8以后,永久存储区叫做元空间。


对堆中区域的理解:

伊甸园区是对象创建的区域,但是伊甸园区如果满了的话会调用GC进行轻度垃圾回收,如果此时对象被引用就会幸存下来进入到幸存区,此时伊甸园区的内存清空,垃圾被回收。如果说幸存区也满了的话就会进入老年区。

永久区:
永久区是常驻内存的,是用来存放JDK自身携带的Class对象和interface元数据。这样这些数据就不会占用我们的空间。用于存储java运行时环境。
1、jdk1.6以前,叫做永久代 , 常量池在方法区
2、jdk1.7, 叫做永久代,常量池在堆中。提出了一个概念是去永久化。
3、jdk1.8,没有永久代,常量池在元空间。

堆中的结构:

在这里插入图片描述
元空间在逻辑上存在,在物理上不存在。

当程序报了OOM错误怎样解决:
1.尝试扩大堆内存空间
2.分析内存,使用专业工具进行分析。

我们可以来创建一个类来设置一下堆内存在这里插入图片描述
在这里,新生代和老年代的内存容量加一起正好是总的内存大小,所以元空间在逻辑上是存在的,但是在物理上不存在的,它是一个持久化的内存空间。

为了深入了解下堆,我们来实验一下:
创建一个类,将字符串的大小溢出堆,查看结果:
在这里插入图片描述
在这里插入图片描述
为了详细看到信息,我们设置下内存的容量并查看GC的详细信息
在这里插入图片描述
细节显示结果:
在这里插入图片描述


本文根据狂神讲解整理,只用于学习与复习。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值