JVM中GC

1、GC触发的条件

触发的条件有两种:(1)程序调用System.gc()时可以触发;(2)系统自身来决定GC触发的时机。

2、jvm内存分配

(1)对象分配:

    优先在Eden区分配:在大多数情况下,对象在新生代Eden区中分配,当Eden区中没有足够空间的分配时,系统调用一次Minor GC,将Eden中存活的对象和其中一块survivor中存活的对象移动到另一块的survivor区域,如果在Minor GC期间发现新生代存活对象无法放入空闲的survivor区,则会通过空间分配担保机制使对象提前进入老年代。

    大对象直接进入老年代:某些收集器提供了-XX:PretenureSizeThreshold的参数,大于该值的大对象直接在老年代分配,避免在Eden区和Survivor区之间产生大量的内存复制(例:需要大量连续内存的JAVA对象),因此大对象导致还有不少空闲内存就提前触发GC以获取足够的连续空间。

(2)对象晋升:

    年龄阈值:VM为每个对象定义了对象年龄(Age)计数器,对象在Eden出生并经过第一次Minor GC之后仍存活,且被Survivor区中每经过一次Minor GC后Age就+1,当增加到一定程度(MaxTenuringThreshold),将会晋升老年代。

    提前晋升:若在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代。

3、jvm对象生死判定(何时回收)

    在java语言,都是通过可达性分析算法(并没有采用引用计数法,引用计数法无法解决循环引用的问题)进行对象存活与否的判定:通过称之为GC Root是的对象作为起点,然后向下搜索,搜索走过的路径称之为引用链,当一个对象到GC Roots没有任何引用链相连时,即说明该对象不可达。

 在java中,可作为GC Roots的对象包括:

(1)方法区:类静态属性引用的对象;

(2)方法区:常量引用的对象;

(3)虚拟机栈(本地变量表)中引用的对象;

(4)本地方法栈JNI(Native方法)中引用的对象;

4、VM常用参数整理

JVM(Java虚拟机)中的垃圾回收机制是其自动内存管理的核心部分,负责检测并释放不再使用的对象以避免内存泄漏和资源浪费。它通过一系列算法和策略来实现高效的内存管理。 ### 垃圾回收的工作原理 在JVM中,垃圾回收主要基于两个核心概念:**如何判断对象是否为垃圾**以及**何时进行垃圾回收**。 1. **判断对象是否为垃圾** - **引用计数法**是一种简单但存在缺陷的方法,它为每个对象维护一个计数器,当有新的引用指向该对象时计数器加一,当引用失效时计数器减一。如果计数器为零,则认为该对象可以被回收[^3]。 - **可达性分析算法**则是目前主流的垃圾检测方法。此方法从一组称为“GC Roots”的对象开始出发,沿着这些根对象遍历整个对象图,所有能被访问到的对象都被标记为存活对象,而未被访问到的对象则被认为是垃圾[^3]。 2. **垃圾回收过程** JVM使用不同的垃圾收集器执行实际的垃圾回收操作。常见的垃圾收集器包括Serial Collector, Parallel Scavenge, CMS (Concurrent Mark Sweep), G1 (Garbage-First)等。每种收集器都有其特定的工作方式和适用场景,例如G1设计用于处理大堆内存的应用程序,并且旨在提供高吞吐量的同时保持较低的暂停时间。 3. **分代假说与分区策略** JVM将堆划分为新生代(Young Generation)和老年代(Old Generation),有时还包括永久代或元空间(Metaspace)。新生代又细分为Eden区和两个Survivor区。这种划分基于这样的假设:大多数对象都是短命的,因此它们很快就会变成垃圾。根据这个假设,不同代采用了不同的回收策略。比如,在新生代通常采用复制算法快速回收大量短期存在的对象;而在老年代则可能采用标记-整理或标记-清除算法处理长期存在的对象。 4. **触发条件** 当应用程序尝试分配新对象而堆没有足够的连续空间时,会触发一次垃圾回收事件。此外,某些情况下即使内存充足也可能主动发起垃圾回收以维持系统性能稳定。 5. **优化考量** 为了提升效率,现代JVM实现了多种优化技术,如并发收集、增量更新等,使得垃圾回收可以在不影响或最小影响应用正常运行的前提下完成。 综上所述,JVM垃圾回收机制是一个复杂但至关重要的组成部分,它不仅确保了Java程序能够有效利用有限的内存资源,而且对于提高程序的整体性能有着不可忽视的作用。 ```java // 示例代码:简单的Java类演示了创建对象的过程 public class GarbageCollectionExample { public static void main(String[] args) { // 创建一些临时对象 for (int i = 0; i < 100000; i++) { String temp = new String("Temporary Object"); } // 显式请求垃圾回收(注意这只是一个建议,JVM决定是否执行) System.gc(); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值