1背景知识

来源:互联网 发布:中华网络一条龙 编辑:程序博客网 时间:2024/06/05 05:38

1  背景知识

1.1.  Java如何管理内存

Java的内存管理就是对象的分配和释放问题。在Java中,程序员需要通过关键字new为每个对象申请内存空间 (基本类型除外),所有的对象都在堆 (Heap)中分配空间。另外,对象的释放是由GC决定和执行的。在Java中,内存的分配是由程序完成的,而内存的释放是有GC完成的,这种收支两条线的方法确实简化了程序员的工作。但同时,它也加重了JVM的工作。这也是Java程序运行速度较慢的原因之一。因为,GC为了能够正确释放对象,GC必须监控每一个对象的运行状态,包括对象的申请、引用、被引用、赋值等,GC都需要进行监控。

监视对象状态是为了更加准确地、及时地释放对象,而释放对象的根本原则就是该对象不再被引用。

为了更好理解GC的工作原理,我们可以将对象考虑为有向图的顶点,将引用关系考虑为图的有向边,有向边从引用者指向被引对象。另外,每个线程对象可以作为一个图的起始顶点,例如大多程序从main进程开始执行,那么该图就是以main进程顶点开始的一棵根树。在这个有向    图中,根顶点可达的对象都是有效对象GC将不回收这些对象。如果某个对象 (连通子图)与这个根顶点不可达(注意,该图为有向图),那么我们认为这个(这些)对象不再被引用,可以被GC回收。

以下,我们举一个例子说明内存管理。对于程序的每一个时刻,我们都有一个有向图表示JVM的内存分配情况

以下右图,就是左边程序运行到第6行的示意图。


Java 使用有向图的方式进行内存管理,可以消除引用循环的问题,例如有三个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的。这种方式的 优点是管理内存的精度很高,但是效率较低。另外一种常用的内存管理技术是使用计数器,例如COM模型采用计数器方式管理构件,它与有向图相比,精度行低 (很难处理循环引用的问题),但执行效率很高。

1.1.  Java Heap Dump 是什么?

我们知道Java Heap 是所有类实例和数组对象分配的一个运行时数据区,其间所有Java VM线程在执行期间共享Heap 中的数据。那么一个Java heap dump相当于在一个特殊的时间点上生成的一个快照,它就像给一个繁忙的数据仓库在给定的时间上来了一个照片,我们通过这张快照可以识别哪些组件在那快照的那时间点上是可用的。

 

由于Java 说明文档并没有提及到Java heap dump,在各个不同的JVM厂商,存在各个对Java heap dump的介绍。 如IBM JVM的Java heap dump 提供的信息大至和Java Heap差不多。

Sun公司提供的信息基本上是JVM Stack,运行时常量池和Java Heap等.