- 浏览: 114090 次
- 性别:
- 来自: 北京
文章分类
最新评论
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 14981、我在/etc/profile里面增加参数: expor ... -
BTrace实际案例分析(转)
2016-03-28 17:09 553BTrace实际案例分析 问题表象 问题描 ... -
BTrace试用
2016-03-28 16:35 1402说明: BTrace是Java进程诊断分析工具,优点是无 ... -
XML节点当做文本处理
2014-10-31 08:45 707XmlHelper类中封装的方法,采用JDOM实现。 ... -
采用JDK自带的类库解析XML(转)
2014-07-01 16:43 39071,需求说明假设要查询一个图书列表,寻找TEST的著作. 2 ... -
玩转 XPath 和缺省命名空间(Default Namespaces)(转)
2014-07-01 16:38 2744诸如“为什么用 XPath 的表达式进行查询,却没有返回所期 ... -
java远程通讯协议对比(转载)
2013-12-25 11:04 1371在分布式服务框架中, ... -
java SPI机制(转)
2013-12-18 08:03 768From ServiceLoader javadoc: A ... -
java编码问题汇总(转载)
2013-12-05 09:20 487工作中经常遇到java编码问题,由于缺乏研究,总是无法给出 ... -
和Lambdas的第一次亲密接触(转载)
2013-05-21 11:18 874英文原文:Java 8: The First Tas ... -
获得javacore和dump文件
2013-02-01 17:31 1465linux环境下,尝试了如下方法获得javacore文件, ... -
采用jca分析javacore文件示例
2012-06-13 10:09 9108今天帮助项目组分析websphere 7下的线程挂起问题,现象 ... -
查看java class的编译版本
2012-03-31 15:38 996使用 UE 打开 class 文件,第一行内容:0000000 ... -
关于编码的详细分析(转载)
2012-02-27 08:53 943编码无处不在。Database, ... -
集群环境下的单例任务调度基类
2012-02-23 15:37 1428最近为公司框架提供了基于ID的单例的任务调度基类,用于集群的 ... -
JDK 1.5自带的几个小工具
2012-02-23 15:24 1086提供了jps,jmap,jconsole,jstat几个比较实 ... -
使用IBM heapAnalyzer分析内存泄露的原因(转载)
2012-02-23 15:21 3664大家在开发J2EE应用时可能经常碰到OOM的问题。出现这种问题 ... -
关于XML对特殊字符的编码
2012-02-23 15:13 1134项目中遇到这类问题,比如“优褅股份”,采用GBK编码可以,如果 ... -
sys_uuid()导致oracle的session缓慢增长
2012-02-09 10:19 1512最近负责的数据交换平 ... -
NIO技术
2011-12-20 11:12 744复习了一下 nio 技术,发现了一个不错的专题,留个记号: ...
相关推荐
本文将详细介绍Java中的垃圾回收机制及其工作原理,并探讨JVM如何管理和优化垃圾回收过程。 #### 二、JVM内存模型 JVM内存模型主要包括永久代(Permanent Generation, PermGen)、堆(Heap)和栈(Stack)三大部分。值得...
在实际编程中,理解Python的垃圾回收机制对于编写高效、无内存泄漏的代码至关重要。通过掌握这些知识,开发者能够更好地理解和优化程序的内存使用,提升程序性能。在学习过程中,通过测试代码和分析测试结果,可以更...
【C#垃圾回收机制GC】深入解析 垃圾回收(Garbage Collection, GC)是现代编程语言中用于自动管理内存的一种机制。它的核心思想是通过跟踪和回收那些不再被程序引用的对象,以避免内存泄漏和提高内存利用率。在.NET...
本文将详细探讨GC的实现原理、不同算法的细节以及其在JVM中的应用,并通过代码示例展示如何在Java中实践垃圾回收机制。 Java中的垃圾回收机制是一个复杂而高效的内存管理机制,它通过自动回收不再被程序使用的内存...
### Java垃圾回收机制详解 #### 一、Java垃圾回收机制概览 Java作为一种现代的、面向对象的编程语言,其一大特色就是引入了自动垃圾回收机制。这一特性极大地简化了开发人员的工作,使得他们不再需要手动管理内存...
JVM的工作原理及其垃圾回收机制对于理解和优化Java应用程序至关重要。通过对JVM内存管理的理解,我们可以更好地控制对象的生命周期,减少不必要的内存消耗,并提高程序的性能。此外,了解不同的垃圾回收算法可以帮助...
**三、对象内存分配及垃圾回收机制** **对象内存分配**: - **栈内分配**:通过逃逸分析和标量替换技术,某些对象可以在栈上分配,提高效率并减少垃圾回收压力。 - **TLAB(Thread Local Allocation Buffer)**:每...
在"java垃圾回收机制介绍.doc"文档中,可能还会深入讨论如何监控和调试垃圾回收,包括使用JConsole、VisualVM等工具,以及分析GC日志,以理解垃圾回收的性能和行为,从而优化应用程序的内存使用。 了解和掌握Java...
Flex垃圾回收机制是ActionScript 3.0中的一个重要概念,主要应用于Adobe Flex应用程序的内存管理。在Flex开发中,理解并掌握垃圾回收的工作原理对于优化应用程序性能和避免内存泄漏至关重要。 1. **垃圾回收的基本...
Java垃圾回收机制的设计和实现是Java平台的一大亮点,它极大地简化了内存管理,同时也需要开发者理解其工作原理,以优化应用程序的性能和稳定性。通过选择合适的垃圾回收器,配置适当的参数,以及编写良好的代码习惯...
### Java中内存泄露及垃圾回收机制 #### 一、内存泄露概述 在计算机科学领域,内存泄露是指在程序运行过程中,不再使用的内存未被及时释放,导致这部分内存无法被重复利用,进而影响程序性能甚至导致程序崩溃的...
### 垃圾回收机制详解 #### 一、引言 在现代软件开发过程中,内存管理是确保程序高效稳定运行的关键因素之一。垃圾回收(Garbage Collection,简称GC)作为自动内存管理的一部分,在Java等高级语言中扮演着至关...
Java垃圾回收机制是Java虚拟机(JVM)中的一项核心功能,它的主要任务是自动管理内存,特别是识别并清理不再使用的对象,以防止内存泄漏。理解垃圾回收机制对于编写高效、可靠的Java应用程序至关重要。 手动内存...
### 单例模式与垃圾回收机制 #### 一、引言 在软件开发领域,设计模式作为一种被广泛接受的最佳实践,对于提高代码质量和可维护性起着重要作用。单例模式作为23种经典设计模式之一,确保了某个类只有一个实例,并...
本文将深入探讨JVM的垃圾回收机制,并分享一些优化GC性能的有效策略。 首先,理解JVM内存模型至关重要。JVM内存分为堆(Heap)、栈(Stack)、方法区(Method Area)等几个区域。其中,堆是GC的主要工作区域,用于...
Python的垃圾回收机制是其内存管理的关键组成部分,它自动清理不再使用的对象,以便释放内存资源。在Python中,当一个对象没有引用指向它时,这个对象就会被视为可被回收的垃圾。垃圾回收机制确保了程序不会因为内存...
Python的垃圾回收机制是其内存管理的关键组成部分,它确保了程序在运行过程中有效且安全地管理内存。在Python中,由于一切都是对象,内存管理...理解这些垃圾回收机制对于优化Python程序和编写内存高效的代码至关重要。
Java语言内置的垃圾回收机制是自动管理内存的关键特性,它负责清理不再使用的对象,防止内存泄漏,并确保系统的稳定运行。 1. **垃圾收集算法的核心思想** 垃圾收集的目的是识别并回收不再被任何引用指向的对象,...
本文将深入探讨 Go 语言的垃圾回收机制,包括其背后的原理和实现方式,并通过具体的代码示例来展示其在实际应用中的表现。 #### 二、Go 语言内存管理基础 在深入了解垃圾回收机制之前,我们需要先理解 Go 语言的...
Java垃圾回收机制是Java编程中的核心概念,它自动管理程序中的内存分配与释放,从而避免了程序员手动管理内存可能导致的内存泄漏等问题。垃圾回收的主要任务是识别并清理不再被程序引用的对象,释放其所占用的内存...