`
abc20899
  • 浏览: 929021 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

System.gc()

 
阅读更多
1.垃圾收集算法的核心思想

  Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。

  垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能,因此需要开发人员做比较深入的了解。

  2.触发主GC(Garbage Collector)的条件

  JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大。更值得关注的是主GC的触发条件,因为它对系统影响很明显。总的来说,有两个条件会触发主GC:

  ①当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。

  ②Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求,则 JVM将报“out of memory”的错误,Java应用将停止。

  由于是否进行主GC由JVM根据系统环境决定,而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行的。

  3.减少GC开销的措施

  根据上述GC的机制,程序的运行会直接影响系统环境的变化,从而影响GC的触发。若不针对GC的特点进行设计和编码,就会出现内存驻留等一系列负面影响。为了避免这些影响,基本的原则就是尽可能地减少垃圾和减少GC过程中的开销。具体措施包括以下几个方面:

  (1)不要显式调用System.gc()

  此函数建议JVM进行主GC,虽然只是建议而非一定,但很多情况下它会触发主GC,从而增加主GC的频率,也即增加了间歇性停顿的次数。

  (2)尽量减少临时对象的使用

  临时对象在跳出函数调用后,会成为垃圾,少用临时变量就相当于减少了垃圾的产生,从而延长了出现上述第二个触发条件出现的时间,减少了主GC的机会。

  (3)对象不用时最好显式置为Null

  一般而言,为Null的对象都会被作为垃圾处理,所以将不用的对象显式地设为Null,有利于GC收集器判定垃圾,从而提高了GC的效率。

  (4)尽量使用StringBuffer,而不用String来累加字符串(详见blog另一篇文章JAVA中String与StringBuffer)

  由于String是固定长的字符串对象,累加String对象时,并非在一个String对象中扩增,而是重新创建新的String对象,如 Str5=Str1+Str2+Str3+Str4,这条语句执行过程中会产生多个垃圾对象,因为对次作“+”操作时都必须创建新的String对象,但这些过渡对象对系统来说是没有实际意义的,只会增加更多的垃圾。避免这种情况可以改用StringBuffer来累加字符串,因StringBuffer 是可变长的,它在原有基础上进行扩增,不会产生中间对象。

  (5)能用基本类型如Int,Long,就不用Integer,Long对象

  基本类型变量占用的内存资源比相应对象占用的少得多,如果没有必要,最好使用基本变量。

  (6)尽量少用静态对象变量

  静态变量属于全局变量,不会被GC回收,它们会一直占用内存。

  (7)分散对象创建或删除的时间

  集中在短时间内大量创建新对象,特别是大对象,会导致突然需要大量内存,JVM在面临这种情况时,只能进行主GC,以回收内存或整合内存碎片, 从而增加主GC的频率。集中删除对象,道理也是一样的。它使得突然出现了大量的垃圾对象,空闲空间必然减少,从而大大增加了下一次创建新对象时强制主GC 的机会。

摘自:http://blog.csdn.net/bocaicbl/archive/2010/02/23/5319915.aspx

-------------------------------------------------------------

趁着今天写程序的热乎劲儿,小谈一下System.gc()这个神秘的东东~

很多人把Java的“效率低下”归咎于不能自由管理内存,但我们也知道将内存管理封装起来的好处,这里就不赘述。

Java中的内存分配是随着new一个新的对象来实现的,这个很简单,而且也还是有一些可以“改进”内存回收的机制的,其中最显眼的就是这个System.gc()函数。

乍一看这个函数似乎是可以进行垃圾回收的,可事实并不是那么简单。
其实这个gc()函数的作用只是提醒虚拟机:程序员希望进行一次垃圾回收。但是它不能保证垃圾回收一定会进行,而且具体什么时候进行是取决于具体的虚拟机的,不同的虚拟机有不同的对策。

那么下一个问题就是:gc()进行回收的准则是什么?也就是说什么样的对象可以被回收?
简单来说就是:没有被任何可达变量指向的对象。这里的可达是我发明的……意思就是能够找到的,那什么样的是不可达的呢?
比如说:
a.v = b;
b.v = c;
/*
*Watch out !
*/
a.v = d;
看一下这段代码:
第一行:对象a的变量v指向了对象b
第二行:对象b的变量v指向了对象c
第六行:对象a的变量v指向了变量d。
这个时候,虽然变量c指向的对象有c 以及b.v指向它,但是它们都已经不可达了,为什么?因为唯一可以找到它们的是a.v,但是现在a.v指向了d,所以他们就是不可达的了。

理由也很直观:没有任何可达变量指向你,你还有活下去的理由吗?你就算活下去谁能找得到你呢?

所以说,C++中将释放了的指针置为null的习惯要保留到Java中,因为这有可能是你释放内存的唯一途径。
分享到:
评论

相关推荐

    Android垃圾回收机制及程序优化System.gc

    - 避免显式调用`System.gc()`,因为这可能会增加主GC的频率。 - 尽量减少临时对象的使用,避免无谓的对象创建和销毁。 - 不再使用对象时,将其显式设置为`null`,帮助GC判断对象是否可回收,提高效率。 - 使用`...

    System System命名空间源码

    .NET的垃圾回收机制是通过System.GC类实现的。通过查看GC的源码,我们可以学习到.NET如何自动管理内存,以及如何避免常见的内存泄漏问题。 六、泛型与类型转换 System命名空间中的泛型类,如List和Dictionary, ...

    android 知识汇总

    在Android开发中,掌握以下几个核心知识点至关重要:Activity、Service、Thread、AsyncTask以及系统垃圾回收(system.gc)。这些是Android应用程序中的基础元素,理解和熟练运用它们对于构建高效、稳定的App至关重要...

    16_垃圾回收相关概念.pptx

    当我们提到`System.gc()`时,这是Java提供的一种建议JVM进行垃圾回收的方法。然而,需要注意的是,调用这个方法并不保证立即触发垃圾回收,因为JVM可能会根据自己的策略和需要来决定何时执行垃圾回收。 在描述中的...

    详解C#中的System.Timers.Timer定时器的使用和定时自动清理内存应用

    最后,我们使用ElapsedEventHandler来处理定时器触发事件,在这个事件中,我们使用GC.Collect()和GC.WaitForPendingFinalizers()来清理内存。 三、优点和缺点 使用System.Timers.Timer定时器来定时清理内存有以下...

    jvm-full-gc.zip

    3. 显式调用System.gc():虽然不推荐,但手动调用会请求进行Full GC。 4. G1垃圾收集器的混合收集(Mixed GC)失败:G1在尝试进行混合收集时,如果无法满足目标空间需求,会退化为Full GC。 5. CMS(Concurrent Mark...

    垃圾回收相关概念.pdf

    Java虚拟机(JVM)中的垃圾回收(Garbage Collection,简称GC)是自动管理内存的重要机制...在实际开发中,应尽量减少对`System.gc()`的依赖,利用JVM的默认GC策略,并合理设计对象引用,以实现高效、健壮的内存管理。

    JAVA中销毁一个对象的方法.doc

    - **紧急情况**:当程序遇到内存不足的情况时,可以尝试调用`System.gc()`来尝试释放一些内存。 - **测试目的**:在开发阶段,为了模拟特定的运行环境,可能会手动触发垃圾回收以观察程序的行为。 **3.3 注意事项**...

    android内存管理

    尽管可以尝试通过调用`System.gc()`来触发垃圾回收,但这并不总是最佳实践。调用此方法会导致当前线程暂停,等待GC完成,这可能会影响用户体验。而且,GC的工作方式是分批回收,可能导致内存并未完全清理,反而可能...

    java计时器

    - **强制垃圾回收**:在计时前后的`System.gc()`调用虽然可以减少垃圾回收的影响,但也会增加额外的时间消耗。 - **系统时间精度**:`System.currentTimeMillis()`返回的是当前系统时间,其精度取决于操作系统的时钟...

    Java入门及faq__1(3)

    综上所述,Java中的日期格式化、静态与非静态内部类的区别、字符和数字的判断方法以及`finalize()`与`System.gc()`的区别都是Java编程中非常重要的知识点。掌握这些内容对于编写高效、可靠的Java应用程序至关重要。

    奇迹通讯面试题目.doc

    - `System.gc();` 触发垃圾回收,但并不立即执行。即使执行了垃圾回收,`B.num` 的值也不会改变,因为它是静态的。 #### 3. 生产者消费者模型 **知识点概述:** - **生产者消费者模式:** 一种经典的并发编程...

    安全彻底关闭实例Excel.Application后产生的进程方法

    - 将`_xlApp`设为`null`,然后通过`System.GC.Collect(generation)`触发垃圾回收机制,确保资源被及时释放。 - 最后,将`oMissing`设为`null`。 #### 总结 以上代码展示了如何安全且彻底地关闭`Excel....

    Java的垃圾收集器(GC)参考.pdf

    6. **System.gc()的使用**:尽管可以调用`System.gc()`建议JVM进行垃圾收集,但不应过度依赖这个方法,因为垃圾收集器何时执行、是否执行是不确定的,过度调用可能会增加系统开销,影响性能。 7. **内存泄漏与内存...

    JAVA面试题垃圾收集机制

    1.介绍下垃圾收集机制(在什么时候,对什么,做了什么)?...System.gc()默认也是触发Full GC。 heap dump带GC默认也是触发Full GC。 CMS GC时出现Concurrent Mode Failure会导致一次Full GC的产生。

    jvm-full-gc调优-jvm-full-gc.zip

    本资料"jvm-full-gc调优-jvm-full-gc.zip"显然是针对如何减少和优化JVM的Full GC进行深入探讨的。以下将详细介绍JVM Full GC的相关知识点。 1. **理解JVM内存结构**:Java内存主要分为堆内存(Heap)和非堆内存...

    Android中高级面试必知必会.pdf

    垃圾回收算法(JVM)..........63 7、垃圾回收机制和调用 System.gc()的区别? .64 8. 类加载过程90 9. 反射..........101 10. 多线程和线程池........112 11.HTTP、HTTPS、TCP/IP、Socket 通信、三次握手四次挥手...

Global site tag (gtag.js) - Google Analytics