Java的虚拟机存储 堆栈与GC概要

本文深入解析Java内存管理机制,重点阐述了内存中的新生带与老年带如何划分,对象如何在两者之间迁移,以及全代垃圾回收器的运作原理。通过理解这些核心概念,有助于优化GC调优,减少内存泄漏和提高程序运行效率。

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

  Java中的内存主要分为栈、堆、常量池、静态域这几部分。

  1栈主要存放基本类型数据(int、double、……)和对象的引用(类似C语言的指针)。

  2堆主要存放对象实体。而Java的对象是数据处理的核心,因而堆又具体划分为如下几个部分:

  2.1  新生带(new generation),使用的垃圾收集器是MinorGC,而新生带又划分为Eden Space(伊甸区)、2个SurvivorSpace幸存者区(FromSpace和ToSpace),幸存者区主要是用于MinorGC做对象复制时使用的。

  2.2  老年带(old generation),使用的垃圾收集器是FullGC。当FullGC满了的时候可能会出现outofmemory的异常。

 

  关于对象在堆中的移动:

  新创建的对象都放在新生带中,当新生带中的对象年龄达到一定程度后(由年龄计数器控制,默认15岁以后的算老年)会放到老年带中。对象晋升到老年带的阈值,可以通过参数-XX:MaxTenuringThreshold 来设置。

  年龄计数器的计算机制:如果对象在 Eden 出生并经过第一次 Minor GC 后仍然活着并且幸存者区也放得下,则把对象移动到幸存者区,并且年龄置为1。之后的对象每熬过一次MinorGC就长大一岁。年龄达到阈值就移动到老年区。

 

  GC调优的一些说明:

  当FullGC过于频繁说明老年带很快就被占满了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值