`
j2eemaster
  • 浏览: 9083 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

(网摘)解析Java对象引用与JVM自动内存管理

阅读更多
         对象引用应用程序设计接口是JDKTM1.2中新定义的。该应用程序设计接口允许应用程序以对象引用的方式与JVM的内存管理器进行交互。当应用程序需管理大量内存对象或者在新的Java对象创建之前需删除原有对象时,Java对象引用应用程序设计接口具有相当大的用途,例如:
  
  ● 基于Web的应用程序常常要求显示大量图片,当用户离开某一Web页时,往往不能确定是否能够顺利的返回。在这种程序中,应用Java对象引用API可以创建这样一个环境,即当堆内存以最小程度运行时,内存管理器创建对象。当用户返回时,应用程序就会重新载入已经创建的图片。
  
  ● 应用对象引用队列可以创建这样一个环境,当通过对象引用获得某一对象时,应用程序得到通知。然后,应用程序就可以对相关对象进行清除操作,同时使这些对象在内存管理器中合法化。
  
  内存管理器的工作机制
  
  下面将首先介绍未嵌入引用对象时内存管理器的工作机制,然后讨论引用对象加入之后Java堆发生的变化。
  
  内存管理器的作用就是识别程序中不再使用的对象,并且回收其内存。
  
  一个Java应用程序由一系列线程组成,每个线程执行一系列方法,而每个方法通过参数或局部变量来引用对象。这些引用属于引用集合中的一部分,直接进入应用程序。另外,引用集合中还包括类库中定义的静态引用变量,以及通过Java本地接口(JNI)API获得的引用。引用集合中的所有引用对象都可以被当前应用程序获取,而不必被回收。同样地,这些对象可能包含对其它对象的引用,也可以被应用程序获取,依此类推。Java堆中的其它对象视为不可获取的,而所有这些不可获取的对象在内存管理中也是合法的。如果一个不可获取的对象使用finalize()方法,任务就交给了对象所调用的收尾器(finalizer)。在内存回收期间,不具有收尾器的不可获取对象和已经调用收尾器的对象被简单回收。
  
  内存回收的算法是不断变化的,共性的方面是从引用集合中识别可获取的对象以及回收被其它对象占据的内存空间。
  
  加入引用对象之后的引用与常规引用的区别在于,引用对象中的引用专门由内存管理器来处理。引用对象封装了其它一些对象的引用,我们称之为指示对象。在引用对象创建的同时,也就定义了该引用对象的指示对象。
  
  Java对象引用
  
  图1所示为对象引用应用程序设计接口中定义的类层次。其中SoftReference类、WeakReference类和PhantomReference类中分别定义了三种引用对象以及相应的三种获取对象的能力。因此按照由强到弱,对象可获取程度可划分为如下五种类型:强获取(strongly reachable)、次获取(softly reachable)、弱获取(weakly reachable)、虚获取(phantomly reachable)和不可获取(unreachable)。
   
  图1 对象应用类层次
  
  根据应用程序要求,对象可以是强引用(strong references)、次引用(soft references)、弱引用(weak references)、虚引用(phantom references)的任意组合。为了确定对象的可获取程度,JVM内存管理器从引用集合出发遍寻堆中所有到对象的路径。当到达某对象的任意路径都不含有引用对象时,则称该对象具有强获取能力;当路径中含有一个或几个引用对象时,根据内存管理器所查询的引用对象的类型分别归为次获取、弱获取、虚获取。
  
  另外,对象引用API中还定义了引用对象队列(java.lang.ref.ReferenceQueue),这是内存管理器对引用对象进行管理的一种简单数据结构。值得注意的是,在进行引用对象定义时,要求phantom reference对象必须产生于一个引用对象队列,而soft reference和weak reference对象则无此限制,如:
  
  ReferenceQueue queue = new ReferenceQueue();
  PhantomReference pr = new PhantomReference(object, queue);
  Soft References 应用实例
  
  下面以在基于web的应用程序中使用soft references为例,来说明Java对象引用与JVM的内存管理器进行交互的原理。
  
  当用户打开某一web页时,applet代码获得图片并且得到显示。如果在代码中同时创建了该图片对象的soft references,那么当用户离开该web页时,内存管理器对图片所分配的内存是否回收做出选择。当用户返回该web页时,在applet代码中使用SoftReference.get方法就会得到图片才内存中是否仍存在的消息。如果在内存管理器中未创建该图片,在web页上会很快得到显示;否则,applet代码就会重新获取。
  
  下面是Example.java的完整源代码。
  
  import java.awt.Graphics;
  import java.awt.Image;
  import java.applet.Applet;
  import java.lang.ref.SoftReference;
  public class Example extends Applet {
    SoftReference sr = null;
    public void init() {
      System.out.println("Initializing");
    }
    public void paint(Graphics g) {
      Image im = (sr == null) ? null : (Image)(sr.get());
      if (im == null) {
        System.out.println("Fetching image");
        im = getImage(getCodeBase(),"yundong.gif");
        sr = new SoftReference(im);
      }
      System.out.println("Painting");
      g.drawImage(im, 25, 25, this);
      g.drawString("运动之美",20,20);
     im = null; 
    /* Clear the strong reference to the image */
    }
  
    public void start() {
      System.out.println("Starting");
    }
  
    public void stop() {
      System.out.println("Stopping");
    }
  }
  
  在上面的代码中,对象image是一个图片对象,传递给一个SoftReference对象sr。其中image对象是sr的指示对象,sr中的引用域是从次引用(soft reference)到 image。
  
  Weak References分析
  
  对于一个稳定的对象,比如说线程类对象,当需要获取外部数据时,在程序中应用weak references是非常理想的。如果利用引用队列创建了某一线程的weak reference,那么当线程不再具有强获取能力时,应用程序得到通知,根据此通知,应用程序才能执行相关数据对象的清除工作。
  
  当内存管理器未发现strong references 和 soft references 时,我们称对象具有弱获取能力,即在到达该对象的路径中至少包含一个weak reference。程序中weak references被清除一段时间后,弱获取对象被收尾器收集。由此也可以看出,soft reference和weak reference之间的区别在于,应用soft reference时,内存管理器利用算法决定是否创建弱获取对象,而应用weak reference时,内存管理器必须创建次获取对象。
  
  引用对象链
  
  当到达某一对象的路径中含有多个引用对象时,就构成了引用对象链。内存管理器按照由强到弱的顺序处理引用对象,具体处理步骤包括:Soft references、 Weak references、Finalization、Phantom references和创建对象五个部分。
  
  当内存管理器未发现前三种对象引用时,我们称对象具有虚获取能力,即在到达该对象的路径中至少包含一个phantom reference。虚引用对象直接被收尾器收集,而不被重新创建。当内存管理器发现只有phantom references时,对象就将处于等候phantom reference状态,应用程序向引用队列发出通知,然后对虚引用对象调用clear()方法,将其引用域设置为null,最后对不可获取对象执行收集清除处理任务。
  
  通常,对象所具有的获取能力与引用对象集合直接路径中的最弱连接者相同。据此可以看出:
  
  图2(a)中,虚引用对象具有强获取能力,其它对象均具虚获取能力;
  
  (b)中虚引用对象和弱引用对象均具强获取能力,故次引用对象和对象集合具有若获取能力;
  
  (c)中虚引用对象、弱引用对象和次引用对象均具强获取能力,那么对象集合则具次获取能力。
   
  图2 引用对象链
  小结
  ● 引用对象API是Java2平台中的特色之一。
  
  ● 在程序中使用引用对象API不但可以在一定程度上控制内存管理器,实现内存自动管理,还可以提高程序的稳定性和安全性。
  
  ● 引用对象链中各个对象的获取能力与整个链相关。
分享到:
评论
1 楼 jiakechong 2007-05-10  
谢谢,看不明白

相关推荐

    JVM-内存管理 2012-12.pdf

    Java堆是JVM内存管理中最大的一块区域,它负责存储对象实例及数组值。在虚拟机启动时创建,并且被所有线程共享。堆是垃圾收集器管理的主要区域,其大小可以通过-Xms和-Xmx参数进行控制。在JDK 1.2版本之后,Java堆被...

    jvm内存管理,pdf

    下面我们将重点介绍其中与内存管理密切相关的几个部分: 1. **程序计数器**:这是一个较小的内存空间,存储了当前线程正在执行的字节码指令地址。 2. **Java虚拟机栈**:用于存储局部变量表、操作数栈、动态链接、...

    java获得jvm内存大小

    在Java编程语言中,了解和控制JVM(Java虚拟机)的内存管理是至关重要的,尤其是在性能调优、资源管理和避免内存泄漏等方面。本文将深入探讨如何在Java中获取JVM内存大小,包括堆内存的总量、最大值以及剩余空间,并...

    JVM内存溢出问题解析

    JVM 内存溢出问题解析 JVM 内存溢出是指程序运行所需的内存大于虚拟机能提供的最大内存的情况。这种情况可能是由于数据量过大、死循环、静态变量和静态方法过多、递归、无法确定是否被引用的对象等原因引起的。同时...

    JVM内存管理白皮书

    在这份由Sun Microsystems公司出版的《JVM内存管理白皮书》中,我们可以找到关于Java虚拟机(JVM)内存管理的详细介绍和深入分析。这份文档对于想要深入了解JVM工作原理的读者来说是一份宝贵的学习资料。在这份...

    java虚拟机jvm及Tomcat中的jvm有关内存的设置与调优

    ### Java虚拟机(JVM)内存设置与调优详解 #### 引言 在现代软件开发中,Java虚拟机(JVM)作为执行Java字节码的核心组件,其性能直接影响到Java应用的运行效率与稳定性。特别是在大数据处理场景下,合理设置JVM内存...

    java中jvm内存分配相关资料总结整理

    Java虚拟机(JVM)是Java程序运行的基础,它负责解析字节码并管理程序的内存。本资料总结主要关注JVM内存分配及其运行原理,这对于理解和优化Java应用程序的性能至关重要。 1. **JVM内存结构** JVM内存分为几个...

    java -jvm 内存分配和jvm调优

    在Java应用中,JVM扮演着至关重要的角色,它负责解析字节码、管理内存以及执行线程等。本文将深入探讨JVM内存结构,以及如何进行有效的内存调优。 首先,我们需要了解JVM内存模型。Java内存主要分为五个区域:堆...

    JVM自动内存管理:内存区域基础概念

    在JVM中,内存管理是非常关键的一部分,特别是自动内存管理,它包括了垃圾收集和内存分配等机制,确保程序能够高效、稳定地运行。本文将详细探讨JVM的内存区域基础概念。 1. **程序计数器**(Program Counter ...

    JAVA jvm DUMP 内存分析

    性能测试,线程的 dump 看到线程的 死锁,等待 运行状态

    JAVA中的面向对象与内存解析

    栈内存主要存储基本类型和对象引用,生命周期短,随着方法调用的结束而销毁。堆内存则用于存储所有对象实例,其生命周期较长,由垃圾回收器(Garbage Collector,GC)管理。当一个对象不再被引用时,GC会自动回收该...

    JVM详解JVM详解

    下面是对 JVM 的详细解释,包括其运行机制、内存管理机制和 JVM 的两大职责-class loader 和 execution engine。 一、Java 介绍 Java 是一种高级的、基于对象的编程语言,由 Sun Microsystems 公司开发。Java 的...

    Java 虚拟机JVM内存模型

    Sun/Oracle JVM的内存管理机制包括垃圾收集、内存分配与回收策略等。优化方面,SUN/Oracle提供了多种优化技术,包括对JVM内存的优化,例如调整新生代和老年代的比例,选择合适的垃圾收集器等。 ##### 2.4 JVM内存...

    (源码)基于Java虚拟机(JVM)的内存管理与垃圾回收系统.zip

    # 基于Java虚拟机(JVM)的内存管理与垃圾回收系统 ## 项目简介 本项目深入探讨了Java虚拟机(JVM)的内存管理和垃圾回收机制。通过详细的代码示例和理论分析,项目展示了JVM如何管理内存、加载类、执行垃圾回收,...

    面向对象和JVM内存模型.pdf

    JVM通过垃圾回收机制自动管理内存,释放不再使用的对象所占用的内存空间。 综上所述,面向对象是一种编程范式,而JVM内存模型则是运行Java程序的虚拟环境的一部分,它们共同保证了Java程序的运行效率和稳定性。...

    解析JVM内存结构和6大区域

    Stack Frame,非基本类型的对象在 JVM 栈上仅存放一个指向堆上的地址,因此 Java 中基本类型的变量是值传递,而非基本类型的变量是引用传递,Sun JDK 的实现中 JVM 栈的空间是在物理内存上分配的,而不是从堆上分配...

    JVM内存空间分配笔记

    垃圾回收是JVM的一项重要特性,其主要目的是自动识别并回收不再使用的对象所占用的内存空间,从而避免内存泄漏。 - **回收策略**:从JVM方法栈和本地方法栈引出来的引用开始,把每一个引出来的引用作为根依次搜索...

    JVM内存结构、Java内存模型、Java对象模型1

    Java内存模型(JMM)与JVM内存结构不同,它是针对多线程环境下内存访问的抽象模型。JMM确保在多线程环境下,共享变量的读写操作具有正确的顺序和可见性,通过volatile、synchronized等关键字来实现这一目标。JMM关注...

    深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理).zip

    此外,JVM的垃圾收集机制是其内存管理的关键,它自动回收不再使用的对象,避免内存泄漏。 为了更好地理解和分析JVM行为,开发者通常会借助各种工具,如VisualVM、JProfiler和JConsole等。这些工具可以实时监控JVM的...

    java JVM 内存回收

    Java虚拟机(JVM)的内存回收,也称为垃圾收集(GC),是Java语言特性的重要组成部分,用于自动管理内存,释放不再使用的对象所占用的空间。虽然Java语言本身并不强制要求JVM实现GC,但现代JVM如Oracle的HotSpot JVM...

Global site tag (gtag.js) - Google Analytics