GC
gc:java的垃圾回收机制
在java中,内存的分配是由程序完成的,而内存的释放是由GC完成
调用System类的静态方法gc()可以进行垃圾回收,但它只是向JVM发出一个申请,到底是否真正执行垃圾收集,一切都是个未知数
垃圾回收的三种算法
-
标记清除算法:
- 标记阶段:先通过根节点,标记所有从根节点开始的对象,未标记的未垃圾对象
- 清除阶段:清除所有未标记的对象
缺点:标记和清除的效率都不高
清除之后会产生大量不连续的内存碎片,不连续的内存空间使用效率比较低
-
复制算法:(新生代使用的算法)
- 将原有的内存空间分为两块,每次只使用其中的一块,在垃圾回收时,将正在使用的内存块中的存活的对象复制到未使用的内存块中,然后清除正在使用的内存块中的所有对象
-
标记整理算法:(老年代使用的算法)
- 标记阶段:先通过根节点,标记所有从根节点开始的可达对象,未被标记的为垃圾对象
- 整理阶段:将所有存活的对象压缩到内存的一段,之后清理边界所有的空间
此外还有个古老的算法:引用计算法,其核心是对象在被引用时引用计数+1,而当引用不再使用时引用计数-1,当一个对象的引用计数为0时,则说明它将来不再被引用,因此可以释放对应的内存空间
三种算法比较
-
效率:复制算法>标记整理>标记清除(只是简单比较时间复杂度,实际情况不一定如此)
-
内存整齐度:复制算法=标记整理>标记清除
- 内存利用率:标记整理=标记清除>复制算法
GC引用可达性分析算法中,可作为GC Roots的对象
- java虚拟机栈中的对象
- 方法区中的静态成员
- 方法区中的常量引用对象
- 本地方法区中的JNI(Native方法)引用对象
GC的分代回收
-
新生代:(复制算法 GC:minor gc)
在方法中new一个对象,在这个方法调用完毕后,对象就会被回收,这就是一个典型的新生代对象。
新生代存放生命周期很短的对象,这部分对象在GC的时候很多已经是非活动对象,因此采用复制算法,只需将少量的存活对象copy到to space,存活越少,效率越高
新生代又分为:
- eden:每当对象创建的时候,总陪分配到这个区域
- survivor1:复制算法中的from space
- survivor2:复制算法中的to space
Hotspot默认将Eden区和两个survivor区按照8:2的比例划分
-
老年代:(标记整理算法 GC:major gc也叫full gc)
生命周期长,在新生代中经过多次minor gc依旧存活的对象。survivor空间不够用时,需要依赖老年代进行分配担保,所有大对象直接进入老年代。老年代区域比较大,需要时间长
-
永久代:(即方法区)
存放class信息,方法信息,常量池,静态变量
也会发生gc,这里的gc主要是对常量池的回收和对类的卸载
minor gc 与full gc
- minor gc是新生代的垃圾回收机制,复制算法,调用频繁,回收速度快
- full gc是老年代的垃圾回收机制,标记整理算法,调用不频繁,回收速度慢
- full gc发生的次数不会有minor gc那么频繁,但Time(full gc)>Time(minor gc)
- 当eden满了,就minor gc
- 当Eden+from space空间大于老年代剩余空间时,就会full gc
垃圾收集器
- Serial收集器:单线程独占
- 单线程收集器,不是只能使用一个CPU。在进行垃圾收集时,必须暂停其他所有的工作线程,直到收集结束
- 新生代–复制算法,老年代–标记整理算法
- 简单高效,client模式下默认的新生代收集器
- ParNew收集器:多线程独占
- ParNew收集器是Serial收集器的多线程版本
- 新生代–复制算法,老年代–标记整理算法
- server模式下首选新生代收集器
- ParNew Scanvenge收集器:
- 类似ParNew,但更加关注吞吐量
- G1收集器:
- 当今收集器发展的最前沿成果之一。对垃圾回收进行了划分优先级的操作,优先级的回收方式保证了他的高效率
- 最大的优点是结合了空间整合,不会产生大量的碎片,也降低了进行gc的频率
- CMS收集器: 多线程非独占
- 使用的是标记清除算法
- 一种以获得最短回收停顿时间为目标的收集器,适用于互联网站和B/S系统的服务器上
java中的内存泄漏
在Java中,内存泄漏就是存在一些被分配的对象,这些对象不会被GC回收,但它们却占用内存
这些对象有两个特点:
- 对象是可达的
-
对象是无用的
- 例子:循环申请Object对象并放入一个Vector中。如果仅仅释放引用本身,那么Vector仍然引用该对象,这个对象对于GC来说是不可回收的。如果对象加入到Vector后还要将其删除,最简单的办法就是将Vector对象置为null
Vector v = new Vector();
for (int i = 0; i < 100; i++) {
Object o = new Object();
v.add(o);
o = null;
}
v = null;
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
-
物理连接:例如数据库和网络连接,除非显示的关闭了连接,否则不会自动被GC回收。数据库的Connection这些连接是独立于JVM的,对于ResultSet 和Statement对象可以不进行显示回收,但Connection一定要显示回收,因为Connection在任何时候都无法自动回收,而Connection一旦回收,ResultSet和Statement就会立即为null。但是如果使用的是连接池的情况就不一样,处了要显示关闭连接,还要显示关闭ResultSet和Statement对象
-
单例模式:因为单例对象初始化后将在JVM的整个生命周期内存在,如果它持有一个外部对象的引用,那么这个外部对象就不能被回收,从而导致内存泄漏。如果这个外部对象还持有其他对象的引用,那么泄露更严重
相关推荐
### Java垃圾回收机制详解 #### 一、引言 Java作为一种高级编程语言,自问世以来便因其自动内存管理和垃圾回收机制而备受青睐。本篇文章旨在深入探讨Java垃圾回收(Garbage Collection, GC)机制的工作原理及其...
Java垃圾回收器(Garbage Collector, GC)是Java编程语言中的一个重要特性,它负责自动管理内存,自动回收不再使用的对象,以防止内存泄漏。在Java中,程序员无需手动释放内存,这一过程由JVM(Java虚拟机)自动完成...
### Java垃圾回收详解 #### 垃圾回收基础概念 在Java编程语言中,垃圾回收(Garbage Collection, GC)是一项自动化的内存管理机制。它能够自动检测并释放那些不再被程序使用的对象所占用的内存空间,从而有效地...
### Java垃圾回收及内存泄漏知识点详解 #### 一、Java内存管理 1. **运行时数据区**:Java虚拟机管理的内存主要分为以下几个部分: - **方法区(Method Area)**:存储类的信息(如类名、字段、方法等)、常量、...
Java垃圾回收机制(GC)是Java编程语言的关键特性,它自动管理内存,释放不再使用的对象,以防止内存泄漏。GC的运作方式主要有两种策略:引用计数和对象引用遍历。 引用计数是一种简单但不完美的方法。每个对象都有...
Java垃圾回收机制是Java编程中一个非常重要的概念,尤其在面试和实际开发中常常被讨论。垃圾回收(Garbage Collection, GC)是Java虚拟机自动管理内存的一种方式,旨在自动识别并释放不再使用的对象,从而避免内存...
Java垃圾回收(GC)机制是Java语言管理内存的自动化机制,它能够自动释放不再使用的内存空间,从而避免内存泄漏和程序崩溃等问题。在介绍Java GC机制之前,我们首先要了解垃圾回收的目的和意义。在任何程序中,内存...
Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收机制详解和调优.doc Java垃圾回收...
### Java垃圾回收原理详解 #### 一、引言 在现代软件开发中,Java作为一种广泛使用的编程语言,其垃圾回收机制是确保程序高效运行的关键技术之一。本文将深入探讨Java中的垃圾回收机制,包括其基本原理、不同类型...
Java中类的生命周期与java垃圾回收机制
Java垃圾回收机制的详细介绍,调理比较清晰,个人进行的总结。
【Java面试题】Java垃圾回收机制
Java垃圾回收机制是Java虚拟机(JVM)中一个至关重要的功能,它负责自动管理内存,释放不再使用的对象,防止内存泄漏,从而优化程序性能。本文将深入探讨Java垃圾回收的相关知识点。 首先,GC(Garbage Collection...
Java垃圾回收机制总结 Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于防止内存泄露和有效地使用空闲的内存。垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 ...
Java垃圾回收(Garbage Collection, GC)是Java编程语言中一个重要的特性,它自动管理程序运行过程中的内存分配和释放,避免程序员手动处理内存管理,从而减少错误和提高程序的可维护性。以下是对Java垃圾回收的深入...
Java垃圾回收(Garbage Collection, 简称GC)是Java虚拟机(JVM)管理内存的一种机制,它自动地识别并清理不再使用的对象,从而避免了程序员手动管理内存可能导致的内存泄漏问题。垃圾回收是Java语言的一个重要特性...
Azul Systems CTO & co-Founder, Gil Tene 在SpringOne2GX 2012大会上发表的演讲资料,全面深入地阐述Java垃圾回收的四种机制。并介绍了当今世界上性能与吞吐量最高的JVM产品Zing JVM。 如果希望深入了解Java的垃圾...