`
stupen
  • 浏览: 13351 次
  • 性别: Icon_minigender_1
  • 来自: 成都
最近访客 更多访客>>
社区版块
存档分类
最新评论

Java的垃圾回收总结

阅读更多

内存是稀缺的资源,哪怕内存一块钱一条!如果在编程中使用不当,再大的内存也会耗光。
    一、认识Java的自动垃圾回收

    垃圾回收是Java语言的一大特性,方便了编程,是以消耗性能为代价的。而垃圾在这里只无用的对象。而C++是需要程序员自己写析构函数来释放内存的,麻烦,也有可能忘记而导致内存泄露。
    Java语言对内存的分配管理是通过JVM内部机制决定的。程序员可以不关心其处理。

    二、垃圾回收的原理和意义

    Java虚拟机中有个称之为垃圾回收器的东西,实际上这个东西也许真正不存在,或者是已经集成到JVM中了,但这无关紧要,我们仍然可以称为为垃圾回收器。
    垃圾回收器的作用是查找和回收(清理)无用的对象。以便让JVM更有效的使用内存。
    垃圾回收器的运行时间是不确定的,由JVM决定,在运行时是间歇执行的。虽然可以通过System.gc()来强制回收垃圾,但是这个命令下达后无法保证 JVM会立即响应执行,但经验表明,下达命令后,会在短期内执行你的请求。JVM通常会感到内存紧缺时候去执行垃圾回收操作。
    垃圾回收过于频繁会导致性能下降,过于稀疏会导致内存紧缺。这个JVM会将其控制到最好,不用程序员担心。但有些程序在短期会吃掉大量内存,而这些恐怖的对象很快使用结束了,这时候也许有必要强制下达一条垃圾回命令,这是很有必要的,以便有更多可用的物理内存。
    从上面了解到,没有用的对象就是垃圾。准确的说,当没有任何线程访问一个对象时,该对象就符合垃圾回收的条件。
    对于String,存在一个字符串池,这个不属于本文讨论的范围,字符串池中的垃圾回收,算法和这里所讨论的垃圾回收完全是两码事。但是不得不说的是,字符串的胡乱拼接,往往导致性能急剧下降,尤其是在庞大的循环语句中,拼接字符串就是在让程序慢性自杀。这也是很多Java程序员容易犯的毛病。
    字符串既然是池,就是为了缓冲,为了有更高的命中率,因此垃圾回收的频率也许会比JVM对象垃圾回收器要低很多。
    垃圾回收器仅仅能做的是尽可能保证可用内存的使用效率,让可用内存得到高效的管理。程序员可以影响垃圾回收的执行,但不能控制。

    三、通过编程影响垃圾回收
    虽然程序员无法控制JVM的垃圾回收机制。但是可以通过编程的手段来影响,影响的方法是,让对象符合垃圾回收条件。

    分别说来有一下几种:
    1、将无用对象赋值为null.
    2、重新为引用变量赋值。比如:

复制代码
  1. Person p = new Person("aaa");
  2. p = new Person("bbb");



    这样,new Person("aaa")这个对象就是垃圾了——符合垃圾回收条件了。

    3、让相互联系的对象称为“岛”对象

复制代码
  1. Person p1 = new Person("aaa");
  2. Person p2 = new Person("bbb");
  3. Person p3 = new Person("ccc");
  4. p1=p2; p2=p3; p3=p1;
  5. p1=null; p2=null; p3=null;



    在没有对p1、p2、p3置null之前,它们之间是一种三角恋关系。分别置null,三角恋关系依然存在,但是三个变量不在使用它们了。三个Person对象就组成了一个孤岛,最后死在堆上——被垃圾回收掉。

    4、强制的垃圾回收System.gc()

    实际上这里的强制,是程序员的意愿、建议,什么时候执行是JVM的垃圾回收器说了算。
    调用垃圾回收也不一定能保证未使用的对象一定能从内存中删除
    唯一能保证的是,当你内存在极少的情况,垃圾回收器在程序抛出OutofMemaryException之前运行一次。
四、很神秘的finalize()方法

    finalize()方法的确很神秘,是因为你不了解其原理。

    原理:1、finalize()方法是Object中的方法。

    2、finalize()方法会在对象被垃圾回收之前被垃圾回收器调用一次,这是Java语言的一种机制。

    3、finalize()方法在任何对象上最多只会被垃圾回收器调用一次。

    陷阱:1、垃圾回收器无法保证垃圾对象能被回收,因此,finalize()方法也无法保证运行。建议不要重写finalize()方法,即使重写,也不要在finalize()方法中写关键的代码。

    2、finalize()方法中可以把自己传递个别的对象,这样就不是垃圾了,避免了被回收。但是当下次这个对象又符合垃圾回收的时候,finalize()方法不会被调用第二次了,而是直接被清理掉了。

    总结:
    理解了垃圾回收的前提是理解Java运行时的内存堆栈模型。
    理解Java垃圾回收的目的是为了对Java内存管理有个认识,在编程时更有效的使用内存。
    不建议为了垃圾回收,手动编写大量代码,这是很愚蠢的做法。可以通过简单的方式去影响即可。
    本文的讨论的垃圾回收排除String对象。String的垃圾回收与String池有很很大关系,目前还没有研究。但是文中已经提及String使用中容易出现的问题。

分享到:
评论

相关推荐

    Java垃圾回收机制总结

    Java垃圾回收机制总结 Java垃圾回收机制是Java虚拟机(JVM)中的一种机制,用于防止内存泄露和有效地使用空闲的内存。垃圾回收机制的主要目的是为了回收无用的对象占用的内存空间,使该空间可被程序再次使用。 ...

    java垃圾回收机制

    ### Java垃圾回收机制详解 #### 一、引言 Java作为一种广泛应用的编程语言,其自动内存管理机制一直是其显著特点之一。垃圾回收机制(Garbage Collection, GC)是Java自动内存管理的重要组成部分,负责自动回收不再...

    java垃圾回收机制简述

    ### Java垃圾回收机制详解 #### 一、引言 Java作为一种高级编程语言,自问世以来便因其自动内存管理和垃圾回收机制而备受青睐。本篇文章旨在深入探讨Java垃圾回收(Garbage Collection, GC)机制的工作原理及其...

    JAVA垃圾回收面试个人总结.doc

    Java垃圾回收机制是Java编程中一个非常重要的概念,尤其在面试和实际开发中常常被讨论。垃圾回收(Garbage Collection, GC)是Java虚拟机自动管理内存的一种方式,旨在自动识别并释放不再使用的对象,从而避免内存...

    Java垃圾回收原理

    ### Java垃圾回收原理详解 #### 一、引言 在现代软件开发中,Java作为一种广泛使用的编程语言,其垃圾回收机制是确保程序高效运行的关键技术之一。本文将深入探讨Java中的垃圾回收机制,包括其基本原理、不同类型...

    java垃圾回收及内存泄漏.pptx

    ### Java垃圾回收及内存泄漏知识点详解 #### 一、Java内存管理 1. **运行时数据区**:Java虚拟机管理的内存主要分为以下几个部分: - **方法区(Method Area)**:存储类的信息(如类名、字段、方法等)、常量、...

    Java垃圾回收机制

    Java垃圾回收机制的详细介绍,调理比较清晰,个人进行的总结。

    java高级之垃圾回收机制

    ### Java高级之垃圾回收机制详解 #### 一、引言 在现代软件开发中,Java因其平台无关性、丰富的库支持以及自动内存管理等特性,成为企业级应用开发的首选语言之一。其中,垃圾回收机制(Garbage Collection, GC)是...

    JAVA垃圾回收个人总结

    ### JAVA垃圾回收个人总结 #### 一、垃圾回收(GC)概述 垃圾回收(Garbage Collection,简称GC)是Java虚拟机(JVM)提供的一种自动内存管理机制,它负责自动回收不再使用的对象所占用的内存空间,从而避免了手动管理...

    java 垃圾回收机制详细介绍

    垃圾收集器是Java语言区别于其他程序设计语言的一大特色。它把程序员从手工回收内存空间的繁重工作中解脱了...鉴于此,笔者总结了这个垃圾收集器的专题,希望对广大Java技术的爱好者和准备认证考试的考生们有所帮助。

    java垃圾回收技术,面试会问

    ### Java垃圾回收技术详解 #### 一、引言 在现代软件开发中,Java作为一种广泛使用的编程语言,其垃圾回收机制(Garbage Collection, GC)是面试和技术交流中经常提及的话题之一。尤其对于那些深入研究Java内存...

    Java垃圾回收精粹-Part4Java开发Java经验技

    总结,理解并掌握Java垃圾回收机制是提升Java应用程序性能的关键。通过选择合适的垃圾回收器、合理调整参数以及遵循良好的编程实践,我们可以有效管理内存,减少系统停顿,提高应用的稳定性和响应速度。

    JAVA垃圾回收个人总结.docx

    Java垃圾回收机制是Java编程中一个重要的概念,它主要用于自动管理程序运行时的内存,确保内存的有效利用并防止内存泄漏。垃圾回收主要关注Java堆和方法区,特别是堆区域,因为这是对象的主要存储区域。 垃圾收集器...

    Java与C#的垃圾回收机制

    ### Java与C#的垃圾回收机制 #### 一、引言 在现代编程语言中,内存管理是一项重要的功能,能够显著提升程序的稳定性和效率。本文将深入对比Java与C#这两种广泛使用的编程语言中的垃圾回收机制,帮助开发者更好地...

    Java 垃圾回收小结(一)

    本文将对Java垃圾回收进行小结,探讨其基本原理、类型以及常见算法。 1. 基本原理: Java中的内存分为堆(Heap)和栈(Stack)两部分,垃圾回收主要关注堆内存。当一个对象不再被任何引用指向时,它被视为可回收的...

    Java垃圾回收机制详解

    ### Java垃圾回收机制详解 #### 一、引言 在软件开发领域,特别是对于像Java这样的面向对象语言,内存管理一直是开发者关注的核心问题之一。Java的出现极大地简化了这一过程,其中最为突出的特点之一就是其内置的...

    java垃圾回收以及jvm参数调优概述

    Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象...本文主要对java垃圾回收机制以及jvm参数等方面做个综述,也算是自己做开发这几年对这方面的一个总结。

    Java 详解(JVM) 垃圾回收机制原理(csdn)————程序.pdf

    以下是关于Java垃圾回收机制的详细解释: 一、垃圾定义 在JVM中,垃圾指的是那些在堆内存中已经无法被任何存活的引用所触及的对象。也就是说,如果一个对象不再被程序中的任何变量直接或间接引用,那么它就被认为是...

    java垃圾回收(gc)机制详解

    总结,Java垃圾回收机制是Java平台的一个核心特性,它使得开发者无需关心内存管理细节,但理解其工作原理和优化策略对于提高应用性能至关重要。通过选择合适的GC类型,调整参数,以及良好的编程习惯,我们可以有效地...

Global site tag (gtag.js) - Google Analytics