从前面的博客知道,类实例化产生的对象在堆区中存储,而堆区不可能无限大,因此需要有垃圾收集器。
JVM的垃圾收集器干两件事:
1 碎片整理:整理内存碎片
2 垃圾回收:以某种算法发现垃圾,并使用某种算法清除垃圾。
JVM常见的垃圾发现算法包括引用计数和追踪。其中,
引用计数就是为每个对象维护一个数字,这个数字记录了当前对象被引用的次数。当这个数字变为0的时候,说明该对象可以被垃圾回收了。但是引用计数无法发现那些循环引用的垃圾对象,比如垃圾对象a和垃圾对象b,两者互相引用,这个时候,虽然他们都是垃圾,但由于引用计算都是1,因此无法被发现。
此时,可以使用
追踪算法,JVM会维护一个从根节点开始的对象引用图,当需要垃圾收集的时候,会从根节点开始追踪。能追踪到的对象会被打上标记。当追踪结束的时候,还没有被标记的对象可以被回收。
下面介绍一个典型的分代垃圾收集算法:
在这种垃圾收集机制下,
jvm的堆区被分为young代,old代和永久代。这里主要讨论young代和old代。如图所示:(年轻代包括Eden,和Survivor0,survivor1)
当对象创建的时候,首先被放到Eden中(很大的对象有可能直接到old中),随着不断有对象被放入,当Eden满的时候,就会发生一次minor gc.在垃圾回收之前,JVM会使用垃圾发现算法,发现那些活着的对象(young代中活着的对象很少),然后将他们复制到S0区(如果S0放不下,会放到old代中),接着将Eden清空。
当再有对象被创建的时候,会放到Eden区中(很大的对象有可能直接到old中),当Eden满的时候,会发生一次minor gc.在垃圾回收之前,JVM会找出Eden和S0中活着的对象,然后将他们复制到S1中(如果S1放不下,会放到old代中),接着清空Eden和S0.
当再有对象被创建的时候,会放到Eden区中(很大的对象有可能直接到old中),当Eden满的时候,会发生一次minor gc.在垃圾回收之前,JVM会找出Eden和S1中活着的对象,然后将他们复制到S0中(如果S0放不下,会放到old代中),接着清空Eden和S1.
大家会发现,S0和S1中总有一个是空着的。当一个对象经历了多次gc(达到一定的阈值)仍然活着的时候,JVM就会考虑把他们放到old代中去。
我们需要做的就是使JVM尽可能少的发生old代的full gc.适当的发生young代的minor gc.因为在young中活着的对象很少,在gc前需要复制的对象很少。而在old中活着的对象很多,在gc前需要复制的对象很多,因此full gc会影响性能。
- 大小: 38.4 KB
- 大小: 6.8 KB
分享到:
相关推荐
在Java世界中,JVM垃圾收集器是内存管理的重要组成部分,负责自动回收不再使用的对象,以释放内存空间。垃圾收集器的选取并非一成不变,而是需要根据具体应用的需求和环境来定制。本文将详细解析几种常见的JVM垃圾...
6. **垃圾收集器选择**:不同的JVM版本和应用场景,适合的垃圾收集器不同,如Serial、Parallel、Parallel Old、CMS、G1、ZGC、Shenandoah等。选择合适的收集器是优化的关键。 7. **CMS(Concurrent Mark Sweep)...
2. **GC活动追踪**:它会记录垃圾收集器的活动,如Minor GC和Major GC的触发次数、耗时,有助于理解垃圾回收对性能的影响。 3. **线程状态**:`jvm-mon`可展示当前运行的线程数量及状态,如RUNNABLE、WAITING、...
深入理解JVM垃圾收集算法与垃圾收集器
这个项目通过一个Java代理,能够收集Hadoop/Spark等基于JVM的进程的各种度量数据和堆栈跟踪信息,并将这些信息发送到Kafka、控制台或其他自定义报告器,提供了强大的监控和分析能力。 首先,我们来探讨JVM分析的...
3. **内存管理**:详细讲解堆内存、栈内存、方法区、程序计数器、本地方法栈等区域的分配与回收,特别是垃圾收集机制,如分代收集、标记-清除、复制算法、标记-整理、CMS和G1等。 4. **字节码执行**:解释字节码...
1. 垃圾收集器:JVM的内存管理主要依赖垃圾收集器,不同的收集器有不同的工作策略。例如,新生代的Serial、ParNew和G1,老年代的Parallel Old、CMS和ZGC等。理解这些收集器的工作机制是调优的基础。 2. 内存配置:...
2. **选择合适的垃圾收集器**:如新生代GC选择ParNew,老年代选择CMS或G1,以平衡吞吐量和响应时间。 3. **调整垃圾收集参数**:例如设置新生代和老年代的比例,开启并行或并发收集等。 4. **使用JIT编译**:让热点...
最后,JVM中提供了多种垃圾收集器,如Serial、Parallel、CMS、G1等,每种收集器都有其适用的场景和特点。例如,Serial收集器是单线程的,适用于小内存环境;而CMS(Concurrent Mark Sweep)收集器是追求低停顿时间的...
JVM通过类加载器、运行时数据区、执行引擎、本地方法接口和垃圾收集机制等组件协同工作,确保Java程序的高效运行。 2. **类加载机制** JVM的类加载机制包括加载、验证、准备、解析和初始化五个阶段。"jvm-demo...
1.5CMS(Current Mark Sweep)收集器 1.6G1收集器 第六节:JVM参数调优 1.1 JVM重要参数介绍 1.2JVM参数调优 1.3JVM参数设置思路1.4JVM调优常用指令说明 第七节:JVM项目实战 1.1案例背景 1.2排查步骤 1.3....
"JVM垃圾收集器特点、优劣势及使用场景" JVM垃圾收集器是Java虚拟机(JVM)中的一种自动内存管理机制,负责回收Java程序中不再使用的对象,以避免内存泄漏和提高程序性能。Java中有多种垃圾收集器,每种垃圾收集器...
本文将深入探讨两个重要的垃圾收集器——ParNew和Concurrent Mark Sweep (CMS) ——以及它们在JVM性能调优中的作用,特别是基于三色标记算法的实现。 首先,ParNew垃圾收集器是新生代(Young Generation)的默认...
- **垃圾收集器的选择与配置**:不同的垃圾收集器有不同的性能特征,选择合适的垃圾收集器并进行合理配置,可以有效提升系统性能。例如,CMS(Concurrent Mark Sweep)适合低暂停时间需求,G1(Garbage-First)则...
Java虚拟机(JVM)是Java程序运行的基础,它的垃圾收集器(GC)是自动管理内存的核心机制。在Java应用程序中,尤其是对于大型系统或高并发环境,进行JVM GC调优是提升性能、减少系统停顿时间的关键步骤。"用于测试...
Java垃圾收集器是Java语言中一个关键的特性,它负责管理程序运行时的内存空间,尤其是对象的分配和回收。在传统的编程语言如C++中,堆内存的管理需要程序员手动进行,分配和释放对象可能会涉及到复杂的内存操作,...
- 垃圾收集算法:标记-清除、复制、标记-整理、分代收集等。 - CMS(Concurrent Mark Sweep):并发标记清除,降低Full GC的停顿时间。 - G1(Garbage-First):并行和并发的垃圾回收器,目标是减少停顿时间。 4...
Java虚拟机(JVM)是Java程序运行的基础,它的核心组成部分之一就是垃圾收集器(Garbage Collector, GC)。本文将全面解析JVM中的七种垃圾收集器,分析它们的特性和适用场景,帮助开发者理解如何优化Java应用的内存...