垃圾回收,是java同c++的一个重大区别,也是编写java程序不用指针的一个重要保证。在c++中,当一个对象不再有价值的时候,我们需要手动的清除这个对象,以释放空间。在java中,这个工作由垃圾回收器自动完成,程序员不必考虑难缠的对象回收问题。
一、垃圾回收的好处:
垃圾回收使程序员从释放内存的重担中解脱,可以把更多的精力放在编程和逻辑上,提高了效率。
垃圾回收保证了程序的正常运行,不会出现如c++中的因为对象忘记释放而产生的内存泄露等诸多问题。
二、垃圾回收的基本方法:
所有的垃圾回收算法都要做两件事:检测出垃圾对象和删除垃圾对象并把堆空间归还程序。
1.引用计数器:
在堆中的每个对象都有一个对应的计数器,当创建一个对象并将此对象的引用指定到一个变量的时候,引用计时器为1。当此对象被其他对象引用的时候,计数器+1,其他对象对此对象的引用取消,计数器-1。当计数器为0的时候,这个对象就已经是没有被引用的了,垃圾回收器就可以收集它了。
引用计数器被用在早期的垃圾回收策略中,计数器不能处理循环引用(父对象引用子对象,自对象也引用父对象,这两个对象采用引用计数器不能被收集)。
2.跟踪收集器:
跟踪收集器将堆中的对象及引用映射成一个图。对象为图的节点,对象间的引用为图中的边。
垃圾回收从跟节点开始,通过历遍这个图找出图中的孤立节点,即为垃圾对象。
三、垃圾回收处理堆碎块的策略:
当一个对象被回收后,它的堆空间归还程序,当对个对象被回收后,就会出现一个问题,堆中的空间不连续了。如此,当创建一个新对象的时候,可能由于堆中前面的空白空间不够而不得不继续分配后面连续的空间,这样不仅浪费堆空间,而且可能造成对空间不足,内存溢出。
一般情况下,采用以下几种回收器来解决这个问题:
1.压缩收集器:
压缩收集器把活动的对象移动到堆的一段,那么在堆的另一端就好出现连续的大片空白空间。
2.拷贝收集器:
拷贝收集器将活动对象拷贝到一个新的区域,在拷贝过程中,这些活动的对象将被紧凑的放在新的区域,这样就消除了旧区域的空隙。当新区域满的时候,再将活动对象拷贝到旧区域,如此往复。
由于对象拷贝需要程序停止运行,区域中对象的拷贝很耗时,会影响程序的正常运行。
3.按代收集器:
在程序中大对象有这样的特点,大部分对象的生命周期比较短,小部分的对象生命周期比较长。考虑到这个原因,可以把堆分成若干个子堆,每个子堆称为一代(由低到高一代,二代三代……)。把生命周短的对象放在底代中,生命周期长的放在高代中。这样,底代的对象收集会更频繁一点,高代的则收集频率少一点,保证了收集的效率。在每次收集的时候,如果发现这个代中的对象是活动的,则把它放到更高的代中,否则收集。
4.自适应收集器:
自适应收集会根据堆中的对象情况选择适当的收集器或调整收集器的参数,以实现更高的效率。
以上即是java垃圾回收的基本方法。如有不足和错误欢迎大家指正。
- 大小: 5.4 KB
- 大小: 8 KB
- 大小: 7.2 KB
分享到:
相关推荐
浅谈 JAVA 垃圾回收机制 Java 垃圾回收机制是 Java 语言中的一种自动内存管理机制,它可以自动回收内存中的垃圾,避免代码运行时由于忘记释放对象而带来的内存泄漏问题。 Java 中的垃圾回收机制主要通过两种算法来...
Java垃圾回收的实现过程 Java垃圾回收是一种自动化的过程,用来管理程序所使用的运行时内存。通过这一自动化过程,JVM解除了程序员在程序中分配和释放内存资源的开销。启动Java垃圾回收作为一个自动的过程,程序员...
浅谈Java垃圾回收机制.doc文档可能会涵盖以下几个关键点: 1. **对象生命周期**:当一个对象被创建后,它会在内存中占据一定的空间。如果对象不再被任何引用指向,那么这个对象就成为垃圾。 2. **垃圾收集器**:...
### 浅谈Java语言评价胜出的8大技术优势 #### 1. 强大的API支持 Java提供了非常丰富的API支持,包括网络编程中的Socket API、数据库操作中的SQL API、图形用户界面的Swing和AWT API等。这些API不仅功能强大而且...
### 浅谈Java集合框架 Java集合框架是一个用于存储、操作和检索一组对象的强大工具集。集合框架的设计目的是为了提供一套高效且灵活的数据结构来满足不同的应用需求。本篇文章将详细探讨Java集合框架中的一些核心...
浅谈Java堆外内存之突破JVM枷锁 本文主要介绍了Java堆外内存的概念,包括JVM内存分配、JVM垃圾回收、堆外内存的垃圾回收等相关内容。Java开发者都知道,Java中不需要手动申请和释放内存,JVM会自动进行垃圾回收;而...
4. **无用单元收集堆(Garbage-collected heap)**:Java对象在堆内存中分配,JVM负责自动管理内存,包括对象的创建和销毁,通过无用单元收集(Garbage Collection)机制来回收不再使用的内存,避免内存泄露。...
Java的垃圾回收机制负责清理不再使用的对象,因此实例变量的生存期可能因多个引用的存在而延长。 5. **Java虚拟机中的内存布局**: JVM在运行时将内存划分为不同的区域,如程序计数器、Java堆、栈、方法区和本地...
有些开发者认为Java天生慢,但实际上,Java虚拟机(JVM)提供了高效的内存管理和垃圾回收机制。通过合理的内存管理、算法优化以及使用并发处理,可以实现高性能的Java应用。同时,过度优化也可能导致代码可读性和可...
Java垃圾回收机制是Java语言的一大特性,它负责自动管理程序中的内存,避免程序员手动处理内存分配和释放。本文主要探讨的是对象的标记和二次标记过程,这是垃圾收集器确定对象是否可回收的关键步骤。 一、对象的...
理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理、程序集加载、安全性、异步处理和线程同步。 CTS(Common Type ...
Java的垃圾回收(GC)是Java虚拟机(JVM)管理内存的重要机制,它自动识别并清理不再使用的对象,以防止内存泄漏。本文主要探讨Java GC的基本概念,涉及JVM内存模型以及不同的垃圾回收算法。 首先,让我们了解几种...
浅谈Java引用和Threadlocal的那些事 本文主要介绍了Java引用和Threadlocal的知识点,包括Java中的引用类型、Threadlocal的使用等。 Java中的引用类型: Java中有四种引用类型:强引用(Strong Reference)、软...
浅谈Java程序运行机制及错误分析 Java程序运行机制是指Java虚拟机(JVM)的运行机制和Java程序的执行过程。Java虚拟机是可运行Java代码的假想计算机,以实现Java语言的跨平台特性。Java程序的运行需要经过编写、...
Java虚拟机(JVM)中的垃圾回收(Garbage Collection, GC)是自动内存管理的关键机制,它负责识别并清理不再使用的对象,以便回收内存资源。本文将深入探讨JVM的垃圾回收策略,尤其是基于分代的内存回收算法。 在...
`finalize`是Java中一个特殊的方法,它会在垃圾收集器准备回收一个对象时被调用。设计此方法的初衷是为对象提供最后一次清理的机会。例如,当一个`FileInputStream`对象不再被引用时,如果其`close`方法没有被显式...
"浅谈 JVM 原理" JVM(Java Virtual Machine)是一种虚拟机,它可以模拟完整的硬件系统功能,运行在一个完全隔离的环境中,提供了一个完整的计算机系统。JVM 可以分为三类:VMWare、Visual Box 和 JVM。其中,...
强引用可以保护对象不被垃圾回收器回收,只要对象还有强引用存在,垃圾回收器就不会回收它。 软引用 软引用是一种特殊的引用类型,它用来描述一些还有用但非必需的对象。在内存即将发生内存溢出之前,会把这些对象...