栈和堆的基本概念

本文介绍了Java中的栈和堆内存。栈主要用于程序运行,具有后进先出特点,对象引用、基本类型和方法运行都在栈中,栈溢出会导致StackOverFlowError。堆内存分为新生区、养老区和元空间,GC主要在新生区和养老区进行,堆满则抛出OutOfMemoryError。元空间存储JDK的Class对象和方法区,不参与垃圾回收,关闭JVM时释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

堆的组成


栈是一种数据结构,具有后进先出的特点。栈内存主管程序的运行,生命周期和线程同步。栈管运行,堆管存储

线程结束,栈内存也就释放,因此栈不存在垃圾回收问题

8大基本类型+对象引用变量+实例方法运行在栈中

栈满了:StackOverFlowError。原因是栈内存空间不断的添加栈帧,导致栈内存被撑爆

一个JVM只有一个堆,堆内存的大小可以调节

堆内存中细分三个区域:新生区(伊甸园区)、养老区、永久区(元空间),GC垃圾回收主要在伊甸园区和养老区

所有引用类型的真实对象保存在堆中,此外常量池的地址也保存在堆中

新生代占堆的1/3,老年代占堆的2/3。伊甸区和幸存者1区、幸存者2区的比例是8:1:1 

堆满了:OutOfMemoryError。原因是“养老区已满”,堆空间溢出

堆的组成

堆分三部分:新生区、老年区、元空间。新生区包括伊甸园区、幸存0区、幸存1区。当伊甸园区满了,会进行一次轻GC。轻GC后活下来的对象会进入幸存区,当幸存区和伊甸园区都满了之后,会触发一次重GC。重GC会把伊甸园区和幸存区全部清理一次,活下来的对象进入养老区。百分之99的对象在老年代满之前就嗝屁了~更详细的GC流程参考我的其他博客

如果老年代满了,会报OOM错误。堆内存即溢出,具体的例子有当加载大量第三方jar包时、tomcat部署了太多应用时,动态生成的反射类太多时

永久区&元空间

永久区即元空间,元空间里包含方法区,常量池又在方法区中。元空间用来存放JDK自身携带的Class对象,也就是JDK运行所必要的对象信息。存储的是Java运行时的一些环节或类信息元空间不存在垃圾回收,关闭JVM就会释放这个区域的内存

元空间和堆的关系:逻辑上元空间属于堆,但实现上堆中并不包括元空间。

==========

永久区名称演变

jdk1.6之前:永久区如图所示,常量池在方法区中

jdk1.7:永久区退化了,常量池直接扔到堆中

jdk1.8:永久区改名为元空间,常量池在其中

永久区和元空间最大的区别是:永久区位于JVM的内存中,而元空间(即jdk1.8后)位于物理机的内存中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值