`
dapp66
  • 浏览: 24656 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Java的GC与内存管理

 
阅读更多

 

 

G C相信学过JAVA的人都知道这个是什么意思。但是他是如何工作的呢?

首先,JVM在管理内存的时候对于变量的管理总是分新对象和老对象。新对象也就是开发者new出来的对象,但是由于生命周期短,那么他占用的内存并不是马上释放,而是被标记为老对象,这个时候该对象还是要存在一段时间。然后由JVM决定他是否是垃圾对象,并进行回收。所以我们可以知道,垃圾内存并不是用完了马上就被释放,所以就会产生内存释放不及时的现象,从而降低了内存的使用。而当程序浩大的时候。这种现象更为明显,并且GC的工作也是需要消耗资源的。所以,也就会产生内存浪费。

 

下面我们从JVM中的对象生命周期里谈内存回收:

对象的生命周期一般分为7个阶段:创建阶段,应用阶段,不可视阶段,不可到达阶段,可收集阶段,终结阶段,释放阶段。

 

创建阶段

首先大家看一下,如下两段代码:

for int i=0; i<10000; i++

Object obj=new Object();

 

 

Object obj=null;

for( int i=0; i<10000; i++){

      obj=new Object();

} 

 

这两段代码都是相同的功能,但是显然第2段的性能要比第1段性能要好,内存使用率要高,这是为什么呢?原因很简单,第1段每次执行for循环都要创建一个Object的临时对象,但是这些临时对象由于JVMGC不能马上销毁,所以他们还要存在很长时间,而第2段则只是在内存中保存一份对象的引用,而不必创建大量新临时变量,从而降低了内存的使用。另外不要对同一个对象初始化多次。例如:

public class A{

       private Hashtable table = new Hashtable();

       public A(){

             table = new Hashtable(); // 这里应该去掉,因为已经被初始化。

       }

 }  

 

这样就new了两个Hashtable,但是却只使用了一个。另外一个则没有被引用。而被忽略掉。浪费了内存。并且由于进行了两次new操作。也影响了代码的执行速度。

 

应用阶段

即该对象至少有一个引用在维护他。

 

不可视阶段

即超出该变量的作用域。这里有一个很好的做法,因为JVMGC的时候并不是马上进行回收,而是要判断对象是否被其他引用在维护。所以,这个时候如果我们在使用完一个对象以后对其obj=null或者obj.doSomething()操作,将其标记为空,可以帮助JVM及时发现这个垃圾对象。

 

不可到达阶段

就是在JVM中找不到对该对象的直接或者间接的引用。

 

可收集阶段,终结阶段,释放阶段

此为回收器发现该对象不可到达,finalize方法已经被执行,或者对象空间已被重用的时候。

 

JAVA的析构方法

可能不会有人相信,JAVA有析构函数? 是的,有。因为JAVA所有类都继承至Object类,而finalize就是Object类的一个方法。一般来说可以通过重载finalize方法的形式才释放类中对象。如: 

 

public class A{

public Object a;

public A(){ a = new Object ;}

protected void finalize() throws java.lang.Throwable{

a = null; // 标记为空,释放对象

super.finalize(); // 递归调用超类中的finalize方法。

}

}

 

 

 

 

当然,什么时候该方法被调用是由JVM来决定的。

由于对象的创建是递归式的,也就是先调用超级类的构造,然后依次向下递归调用构造函数,所以应该避免在类的构造函数中初始化变量,这样可以避免不必要的创建对象造成不必要的内存消耗。当然这里也就看出来接口的优势。

 

共享静态存储空间

我们都知道静态变量在程序运行期间其内存是共享的,因此有时候为了节约内存工件,将一些变量声明为静态变量确实可以起到节约内存空间的作用。但是由于静态变量生命周期很长,不易被系统回收,所以使用静态变量要合理,不能盲目的使用。以免适得其反。因此建议在下面情况下使用:

1,变量所包含的对象体积较大,占用内存过多。

2,变量所包含对象生命周期较长。

3,变量所包含数据稳定。

4,该类的对象实例有对该变量所包含的对象的共享需求。(也就是说是否需要作为全局变量)。

 

不要提前创建对象

尽量在需要的时候创建对象,重复的分配,构造对象可能会因为垃圾回收做额外的工作降低性能。

 

JAVA中有关内存管理的其他经验

根据JVM内存管理的工作原理,可以通过一些技巧和方式让JVMGC处理时更加有效。,从而提高内存使用和缩短GC的执行时间。

1,尽早释放无用对象的引用。即在不使用对象的引用后设置为空,可以加速GC的工作。

2,尽量少用finalize函数,此函数是JAVA给程序员提供的一个释放对象或资源的机会,但是却会加大GC工作量。

3,如果需要使用到图片,可以使用soft应用类型,它可以尽可能将图片读入内存而不引起OutOfMemory.

4,注意集合数据类型的数据结构,往往数据结构越复杂,GC工作量更大,处理更复杂。

5,尽量避免在默认构造器(构造函数)中创建,初始化大量的对象。

6,尽量避免强制系统做垃圾回收。会增加系统做垃圾回收的最终时间降低性能。

7,尽量避免显式申请数组,如果不得不申请数组的话,要尽量准确估算数组大小。

       8,如果在做远程方法调用。要尽量减少传递的对象大小。或者使用瞬间值避免不必要数据的传递。

 

 

 

 

for int i=0; i<10000; i++

Object obj=new Object();

 

 

 

分享到:
评论

相关推荐

    java内存管理以及GC

    内存管理简介 内存管理的职责为分配内存,回收内存。 没有自动内存管理的语言/平台容易发生错误。 典型的问题包括悬挂指针问题,一个指针引用了一个已经被回收的内存地址,导致程序的运行完全不可知。 另一个...

    Java GC与性能调优

    JVM 的内存管理与内存回收是 Java GC 与性能调优的核心内容。JVM 的内存结构可以分为以下几个部分: * 栈:用于存放临时变量、参数和中间结果。 * 本地方法栈:用于支持 native 方法的执行,存储了每个 native 方法...

    Java的内存管理机制分析

    ### Java的内存管理机制分析 #### 一、Java内存区域划分 Java的内存管理机制将内存分为以下几个区域: 1. **栈(Stack)**: - 存储局部变量(如基本类型的变量和对象的引用)。 - 每个线程拥有一个独立的栈。 ...

    Java 内存区域和GC机制

    Java内存区域和垃圾收集(GC)机制是Java编程中至关重要的一部分,它关乎程序的性能、稳定性和资源管理。本文将深入探讨Java虚拟机(JVM)中的内存划分、垃圾收集的工作原理以及相关工具的使用。 1. **Java内存区域...

    Java GC的过程

    Java垃圾收集(Garbage Collection, 简称GC)是Java编程中的一项重要特性,它自动管理内存,释放不再使用的对象,避免了程序员手动管理内存可能导致的内存泄露问题。本篇将深入探讨Java中的GC过程。 一、Java内存...

    java内存管理详细介绍.doc

    Java内存管理是Java编程中至关重要的一环,它与C++等其他语言的内存管理机制有着显著的区别。在C++中,程序员需要手动管理内存,包括分配和释放,而在Java中,这一过程则由Java虚拟机(JVM)自动进行,通过垃圾收集...

    java内存管理精彩概述

    Java内存管理是Java核心技术的重要组成部分,对于每个开发者来说,理解其工作原理都是十分必要的。这一主题既实用又有趣。以下是对Java内存管理的精彩概述,主要基于Sun Hotspot JVM,但请注意,不同JVM可能有不同的...

    java内存管理 ppt

    **垃圾收集(Garbage Collection, GC)**是Java内存管理的重要部分,其目标是自动识别并回收不再使用的对象,释放内存。Java提供多种垃圾收集算法,如标记-清除、复制、标记-整理和分代收集。其中,分代收集将堆内存...

    Java虚拟机内存管理总结

    Java虚拟机内存管理总结 Java虚拟机(JVM)中的内存管理是指Java语言中对象的分配和释放问题。Java中的内存管理可以分为两部分:对象的分配和释放。 对象的分配是由程序完成的,程序员需要通过关键字new为每个对象...

    JAVA虚拟机的内存管理

    ### JAVA虚拟机的内存管理详解 #### 一、引言 在Java 2平台的强大支持下,J2SE能够自动管理内存,这大大减轻了开发者的负担,让他们不必再进行复杂的显式内存管理工作。本文档旨在对Sun J2SE 5.0版本中的Java ...

    Java_GC垃圾回收调优指南

    垃圾回收是一种自动化的内存管理机制,它负责回收不再使用的对象所占用的内存空间。Java虚拟机(JVM)内置了高效的垃圾回收器来执行这项任务。不同的垃圾回收策略适用于不同场景下的应用程序,因此了解这些策略的...

    Java GC 专题

    Java垃圾收集(GC)专题针对的是Java编程语言中内存管理机制的重要组成部分。Java自1996年推出以来,其最大的改进之一就是引入了受管内存。在Java之前,C和C++语言中的内存泄漏问题十分常见,这导致开发稳定和安全的...

    Java基础[Java基础]--Java GC工作原理

    Java的自动内存管理机制是其一大亮点,尤其体现在垃圾收集(Garbage Collection, GC)方面。GC能够自动地识别不再使用的对象,并释放其占用的内存空间,从而避免了手动管理内存所带来的潜在问题。本文将深入探讨Java...

    java IBM 分析工具(线程、gc、内存)

    IBM提供了几个强大的分析工具,专注于线程、垃圾收集(GC)和内存管理,以帮助开发者更好地理解和解决问题。这些工具包括IBM Thread and Monitor Dump Analyzer for Java、HeapAnalyzer以及可能的GA441(可能是另一...

    VisualGC 内存监控工具

    总的来说,VisualGC是Java开发者不可或缺的内存监控工具,它通过直观的图形界面,帮助我们理解JVM的内存管理机制,有效预防和解决内存相关问题,提高应用的性能和稳定性。对于任何对JVM内存管理有兴趣或面临内存问题...

    Java程序员必须了解的GC工作原理

    Java程序员在进行内存管理时,垃圾收集(Garbage Collection, GC)是一个不可或缺的部分。理解GC的工作原理对于优化程序性能、防止内存泄漏以及提高系统稳定性至关重要。这篇文章将深入探讨Java中的垃圾收集机制,...

    java实现内存动态分配

    Java 实现内存动态分配主要涉及Java内存模型以及内存管理机制,包括堆内存和栈内存的分配,以及垃圾回收等概念。下面将详细解释这些知识点。 1. **Java内存模型** Java程序运行时,内存分为堆内存(Heap)和栈内存...

Global site tag (gtag.js) - Google Analytics