最近整理GC相关原理,发现各种文章都太乱,于是整理一份自己看得懂,不废话,具体如下。
GC主要用于管理JVM的堆区,所以先来介绍一下JVM的内存分配。
1、程序计数器(Program Conuter Register)
程序计数器是一块较小的内存空间,它是当前线程执行字节码的行号指示器,字节码解释工作器就是通过改变这个计数器的值来选取下一条需要执行的指令。它是线程私有的内存,也是唯一一个没有OOM异常的区域。
2、Java虚拟机栈区(Java Virtual Machine Stacks)
也就是通常所说的栈区,它描述的是Java方法执行的内存模型,每个方法被执行的时候都创建一个栈帧(Stack Frame),用于存储局部变量表、操作数栈、动态链接、方法出口等。每个方法被调用到完成,相当于一个栈帧在虚拟机栈中从入栈到出栈的过程。此区域也是线程私有的内存,可能抛出两种异常:如果线程请求的栈深度大于虚拟机允许的深度将抛出StackOverflowError;如果虚拟机栈可以动态的扩展,扩展到无法动态的申请到足够的内存时会抛出OOM异常。
3、本地方法栈(Native Method Stacks)
本地方法栈与虚拟机栈发挥的作用非常相似,区别就是虚拟机栈为虚拟机执行Java方法,本地方法栈则是为虚拟机使用到的Native方法服务。
4、堆区(Heap)
所有对象实例和数组都在堆区上分配,堆区是GC主要管理的区域。堆区还可以细分为新生代、老年代,新生代还分为一个Eden区和两个Survivor区。此块内存为所有线程共享区域,当堆中没有足够内存完成实例分配时会抛出OOM异常。
5、方法区(Method Area)
方法区也是所有线程共享区,用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。GC在这个区域很少出现,这个区域内存回收的目标主要是对常量池的回收和类型的卸载,回收的内存比较少,所以也有称这个区域为永久代(Permanent Generation)的。当方法区无法满足内存分配时抛出OOM异常。
6、运行时常量池(Runtime Constant Pool)
运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。
针对GC的原理机制,主要搞清楚下面三个问题。
1、什么时候回收?
2、哪些需要回收?
3、怎么回收?
1、什么时候回收?
上面提到GC主要管理的是堆区,堆区主要分为新生代和老年代。大概解释一下这两个区域。
新生代:分为一个Eden和两个Survivor区。新new的对象都放在这里,很快消亡。
老年代:新new的大对象直接丢到这里(为了避免在Eden区和两个Survivor区发生大量的内存拷贝),其余就是在新生代多次回收没被干掉过来变成老家伙的对象了。
①对象优先分配到新生代的Eden区,当不够空间的时候进行一次Minor GC,清理频率很高。
②Full GC发生在老年代,当不够空间的时候进行一次Full GC,伴随着也会进行一次Minor GC。
③进行Minor GC时,会判断每次变成晋升到老年代的对象平均值是否大于老年代剩余空间,如果大于,则进行一次Full GC,如果小于就会去判断HandlePromotionFailure设置是否允许担保失败,如果允许,则进行Minor GC,不允许则改为Full GC。
2、哪些需要回收?
为了下面内容更好理解,首先来了解一下finalize方法。
什么是finalize()方法?
每次进行GC之前系统都会调用一次finalize()方法,用以清理所有活动并且释放资源。
什么时候调用finalize()方法?
1、GC调用之前,例如运行System.gc();(调用System.gc()只是建议JVM去执行,是否执行还得JVM去判断)
2、程序退出时,每个对象都会调用finalzie
3、显式调用finalize
--------------------------------------------------------------------------------------------------------------------------------
引用根搜索算法(GC ROOT Tracing),当一个对象没有任何引用连接的时候,则说明对象不可达,即对象不可用,这个时候就需要进行GC清理。
判断对象是否可达的依据是有没必要执行finalize()方法。如果finalize()方法没有被覆盖或者已经被系统调用过一次了(每个对象生命周期内只能调用一次),则被不可达,需要进行GC清理,否则进行自救,恢复引用连接。
--------------------------------------------------------------------------------------------------------------------------------
3、怎么回收?
不同区域回收算法不同。
新生代:停止-复制。
老年代:标记-清理、标记-整理。
新生代:新生代分为一个Eden区、两个Survivor区(Survivor0、Survivor1)。回收时先把Eden存活对象复制到Survivor0区,清空Eden区,当Survivor0区满了以后,把Eden和Survivor0区的存活对象复制到Survivor1区,清空Eden区和Survivor0区,之后交换Survivor0和Survivor1区,保持Survivor1区是空的,如此往复。
老年代:这两个没什么说的,字面理解。
相关推荐
【Java GC机制详解】 Java垃圾回收(Garbage Collection, GC)是Java虚拟机(JVM)的核心特性之一,它负责自动管理程序运行时的内存,有效地避免了内存泄露和溢出的问题。Java GC机制主要涉及以下几个关键方面: 1...
在介绍Java GC机制之前,我们首先要了解垃圾回收的目的和意义。在任何程序中,内存的分配与释放是两个基本的内存管理操作。Java通过垃圾回收机制来帮助开发者自动管理内存,减轻了手动内存管理的负担。 一、为什么...
Java垃圾回收(GC)机制是Java编程语言中的一个重要特性,它自动管理程序的内存空间,负责识别并清除不再使用的对象,以防止内存泄漏。本文将深入探讨Java GC的工作原理、类型、过程以及优化策略。 一、Java垃圾...
书中可能会涉及类加载机制、垃圾回收(GC)以及性能优化策略。对于高级开发者,这部分内容有助于理解Java程序的运行机制,并能解决实际开发中的性能问题。 另外,本书可能还会涵盖多线程编程,这是Java的一个强大...
### Java垃圾回收机制详解 #### 一、引言 在软件开发领域,特别是对于像Java这样的面向对象语言,内存管理一直是开发者关注的核心问题之一。Java的出现极大地简化了这一过程,其中最为突出的特点之一就是其内置的...
总结,理解并掌握JVM参数和GC机制是Java开发中的重要技能。通过合理配置JVM参数,我们可以有效控制内存使用,优化程序性能,并减少垃圾收集带来的负面影响。同时,根据应用特性选择合适的垃圾收集策略,能进一步提高...
Java虚拟机(JVM)中的GC机制会定期检查堆内存中的对象,判断它们是否仍处于活动状态。如果某个对象不再被任何变量引用,即认为该对象已经“不可达”,GC就会回收这些对象所占用的内存空间。 **2.2 对象的分配与回收*...
总结,理解和掌握JVM的工作原理以及GC机制,对于优化Java应用性能至关重要。通过细致的调优,可以有效减少垃圾收集的开销,提升系统的稳定性和响应速度。同时,持续监控和分析JVM运行状态,能帮助我们及时发现并解决...
了解和掌握GC机制与内存分配策略对于Java开发者来说至关重要,因为这有助于优化应用程序的性能和稳定性。 1. **垃圾收集器**: - **垃圾收集器**是实现GC的具体工具,不同的JVM实现可能有不同的垃圾收集器。例如,...
总之,《JVM、GC详解及调优》这份资料将带你深入了解JVM的工作原理,帮助你掌握GC的运作机制,并提供实用的调优技巧,提升Java应用程序的性能。通过持续学习和实践,你将能够更好地管理和优化你的Java应用。
Java垃圾回收机制是Java虚拟机(JVM)中至关重要的组成部分,它的主要任务是自动管理内存,回收不再使用的对象以避免内存泄漏。垃圾回收机制在Java中自动化了内存管理,使得程序员无需手动管理内存,降低了编程复杂...
Java的垃圾回收(GC)机制是Java编程中一个至关重要的概念,它负责自动管理内存,回收不再使用的对象,以防止内存泄漏。理解GC的工作原理和优化策略对于开发高性能的Java应用至关重要。 首先,GC的基本目标是识别并...
在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项自动化的内存管理机制。它能够自动检测并释放那些不再被程序使用的对象所占用的内存空间,从而有效地避免了内存泄漏问题。与C++等需要程序员手动管理...
《JVM和GC详解及调优》是一本深入解析Java虚拟机(JVM)和垃圾收集(Garbage Collection,简称GC)的专业书籍,对于Java开发者来说,是进阶提升的必备资料。书中详尽地阐述了JVM的工作原理,以及如何进行有效的性能...
Java垃圾回收机制是Java编程语言中的一个重要特性,它负责自动管理程序运行时的内存,确保内存资源的有效利用和避免内存泄露。以下是对Java垃圾回收机制的详细解释: 1. **垃圾回收的意义** - **自动内存管理**:...
Java垃圾回收机制是Java编程语言中的一个重要特性,它负责自动管理程序中的内存,避免程序员手动进行繁琐且容易出错的内存释放操作。垃圾回收的主要目标是识别并清理那些不再被程序使用的对象,以释放内存资源。以下...
### Java虚拟机(JVM)详解 #### 一、引言 Java虚拟机(JVM)作为Java编程语言的核心组件之一,其重要性不言而喻。本文将深入剖析JVM的基本概念、架构及其内存管理机制,重点解读堆和栈内存溢出的情况及案例分析。 ##...
#### 二、Java堆内存详解 **Java堆内存**是Java运行时环境(JRE)中最为关键的部分,它主要用于存储Java对象实例和数组。每一个Java应用程序启动时都会创建一个独立的Java虚拟机(JVM)实例,每个JVM实例都会有自己...