- 浏览: 110840 次
- 性别:
- 来自: 北京
-
文章分类
最新评论
1.垃圾收集算法的核心思想
Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。
垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能,因此需要开发人员做比较深入的了解。
2.触发主GC(Garbage Collector)的条件(2个条件)
JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大。更值得关注的是主GC的触发条件,因为它对系统影响很明显。总的来说,有两个条件会触发主GC:
1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。
2)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的机会。
摘自网络
Java语言建立了垃圾收集机制,用以跟踪正在使用的对象和发现并回收不再使用(引用)的对象。该机制可以有效防范动态内存分配中可能发生的两个危险:因内存垃圾过多而引发的内存耗尽,以及不恰当的内存释放所造成的内存非法引用。
垃圾收集算法的核心思想是:对虚拟机可用内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,反之,如果对象不再被引用,则为垃圾对象,可以回收其占据的空间,用于再分配。垃圾收集算法的选择和垃圾收集系统参数的合理调节直接影响着系统性能,因此需要开发人员做比较深入的了解。
2.触发主GC(Garbage Collector)的条件(2个条件)
JVM进行次GC的频率很高,但因为这种GC占用时间极短,所以对系统产生的影响不大。更值得关注的是主GC的触发条件,因为它对系统影响很明显。总的来说,有两个条件会触发主GC:
1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。
2)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的机会。
摘自网络
发表评论
-
was 8.5环境生成heapdump文件
2016-09-26 10:03 14661、我在/etc/profile里面增加参数: expor ... -
BTrace实际案例分析(转)
2016-03-28 17:09 519BTrace实际案例分析 问题表象 问题描 ... -
BTrace试用
2016-03-28 16:35 1357说明: BTrace是Java进程诊断分析工具,优点是无 ... -
XML节点当做文本处理
2014-10-31 08:45 685XmlHelper类中封装的方法,采用JDOM实现。 ... -
采用JDK自带的类库解析XML(转)
2014-07-01 16:43 38801,需求说明假设要查询一个图书列表,寻找TEST的著作. 2 ... -
玩转 XPath 和缺省命名空间(Default Namespaces)(转)
2014-07-01 16:38 2711诸如“为什么用 XPath 的表达式进行查询,却没有返回所期 ... -
java远程通讯协议对比(转载)
2013-12-25 11:04 1336在分布式服务框架中, ... -
java SPI机制(转)
2013-12-18 08:03 753From ServiceLoader javadoc: A ... -
java编码问题汇总(转载)
2013-12-05 09:20 449工作中经常遇到java编码问题,由于缺乏研究,总是无法给出 ... -
和Lambdas的第一次亲密接触(转载)
2013-05-21 11:18 819英文原文:Java 8: The First Tas ... -
获得javacore和dump文件
2013-02-01 17:31 1387linux环境下,尝试了如下方法获得javacore文件, ... -
采用jca分析javacore文件示例
2012-06-13 10:09 8975今天帮助项目组分析websphere 7下的线程挂起问题,现象 ... -
查看java class的编译版本
2012-03-31 15:38 949使用 UE 打开 class 文件,第一行内容:0000000 ... -
关于编码的详细分析(转载)
2012-02-27 08:53 884编码无处不在。Database, ... -
集群环境下的单例任务调度基类
2012-02-23 15:37 1377最近为公司框架提供了基于ID的单例的任务调度基类,用于集群的 ... -
JDK 1.5自带的几个小工具
2012-02-23 15:24 1045提供了jps,jmap,jconsole,jstat几个比较实 ... -
使用IBM heapAnalyzer分析内存泄露的原因(转载)
2012-02-23 15:21 3608大家在开发J2EE应用时可能经常碰到OOM的问题。出现这种问题 ... -
关于XML对特殊字符的编码
2012-02-23 15:13 1102项目中遇到这类问题,比如“优褅股份”,采用GBK编码可以,如果 ... -
sys_uuid()导致oracle的session缓慢增长
2012-02-09 10:19 1459最近负责的数据交换平 ... -
NIO技术
2011-12-20 11:12 654复习了一下 nio 技术,发现了一个不错的专题,留个记号: ...
相关推荐
在实际编程中,理解Python的垃圾回收机制对于编写高效、无内存泄漏的代码至关重要。通过掌握这些知识,开发者能够更好地理解和优化程序的内存使用,提升程序性能。在学习过程中,通过测试代码和分析测试结果,可以更...
**三、对象内存分配及垃圾回收机制** **对象内存分配**: - **栈内分配**:通过逃逸分析和标量替换技术,某些对象可以在栈上分配,提高效率并减少垃圾回收压力。 - **TLAB(Thread Local Allocation Buffer)**:每...
在"java垃圾回收机制介绍.doc"文档中,可能还会深入讨论如何监控和调试垃圾回收,包括使用JConsole、VisualVM等工具,以及分析GC日志,以理解垃圾回收的性能和行为,从而优化应用程序的内存使用。 了解和掌握Java...
Flex垃圾回收机制是ActionScript 3.0中的一个重要概念,主要应用于Adobe Flex应用程序的内存管理。在Flex开发中,理解并掌握垃圾回收的工作原理对于优化应用程序性能和避免内存泄漏至关重要。 1. **垃圾回收的基本...
Java垃圾回收机制的设计和实现是Java平台的一大亮点,它极大地简化了内存管理,同时也需要开发者理解其工作原理,以优化应用程序的性能和稳定性。通过选择合适的垃圾回收器,配置适当的参数,以及编写良好的代码习惯...
Java垃圾回收机制是Java虚拟机(JVM)中的一项核心功能,它的主要任务是自动管理内存,特别是识别并清理不再使用的对象,以防止内存泄漏。理解垃圾回收机制对于编写高效、可靠的Java应用程序至关重要。 手动内存...
本文将深入探讨JVM的垃圾回收机制,并分享一些优化GC性能的有效策略。 首先,理解JVM内存模型至关重要。JVM内存分为堆(Heap)、栈(Stack)、方法区(Method Area)等几个区域。其中,堆是GC的主要工作区域,用于...
Python的垃圾回收机制是其内存管理的关键组成部分,它自动清理不再使用的对象,以便释放内存资源。在Python中,当一个对象没有引用指向它时,这个对象就会被视为可被回收的垃圾。垃圾回收机制确保了程序不会因为内存...
Python的垃圾回收机制是其内存管理的关键组成部分,它确保了程序在运行过程中有效且安全地管理内存。在Python中,由于一切都是对象,内存管理...理解这些垃圾回收机制对于优化Python程序和编写内存高效的代码至关重要。
Java垃圾回收机制是Java编程中的核心概念,它自动管理程序中的内存分配与释放,从而避免了程序员手动管理内存可能导致的内存泄漏等问题。垃圾回收的主要任务是识别并清理不再被程序引用的对象,释放其所占用的内存...
总结,理解JVM的垃圾回收机制对于优化Java应用程序的性能至关重要。开发者应根据应用的特性和需求,选择合适的垃圾回收器,并通过调整相关参数,以达到最佳的系统性能。同时,编写代码时也要遵循良好的内存管理实践...
总之,理解并掌握Java垃圾回收机制对于编写高效、稳定的Java程序至关重要。通过实践和调整,我们可以有效地利用内存资源,提高应用的运行效率。在实际项目中,选择合适的垃圾回收器和调优策略是提升系统性能的关键。
总的来说,Java垃圾回收机制是Java语言的重要组成部分,它提供了一种自动的内存管理方案,简化了编程任务,同时也需要开发者理解其工作原理,以便更好地优化程序性能。在编写Java代码时,应尽量避免创建不必要的临时...
理解并优化垃圾回收机制对于高性能的Java应用程序至关重要,可以通过调整JVM参数来控制垃圾回收的行为,以平衡内存使用、性能和响应时间。例如,通过设置新生代和年老代的大小,调整垃圾回收策略,可以显著影响应用...
对象工厂是一种模式,用于统一创建对象,它可以用于集中管理对象的生命周期,有时也可以结合垃圾回收机制使用。 6. **内存池**:为了提高内存分配和释放的效率,可以使用内存池技术。内存池预先分配一大块内存,...
Java垃圾回收机制是Java语言中一个重要的特性,它自动管理程序的内存,释放不再使用的对象,从而避免内存泄漏。本文将深入探讨Java垃圾回收的基本原理、常见算法以及可能导致内存泄漏的一些场景。 首先,垃圾回收...
Java和C++是两种广泛应用的面向对象编程语言,它们在垃圾回收机制上有着显著的差异。垃圾回收机制是自动管理程序内存的一种方式,主要目的是自动识别并释放不再使用的内存空间,防止内存泄漏。 C++语言的设计哲学...
总之,理解Java的垃圾回收机制有助于编写更高效、更稳定的代码。通过合理设置JVM参数,我们可以优化内存使用,减少垃圾回收带来的性能影响,同时避免依赖不确定的`finalize()`方法来管理资源。在开发Java应用时,应...
【垃圾回收分类查询平台微信小程序端】是一款基于JavaScript开发的微信小程序应用,旨在提供便捷的垃圾分类查询服务。这款小程序能够帮助用户快速识别不同类型的垃圾,提高环保意识,推动垃圾分类的普及。通过微信小...
随着PHP版本的更新,垃圾回收机制也在不断优化。例如,PHP 7引入了更高效的垃圾回收策略,降低了内存开销和回收的延迟,提升了整体性能。 总的来说,PHP的引用计数器和垃圾回收机制是其内存管理的基石,确保了程序...