当前位置:文档之家› JAVA优化编程

JAVA优化编程

permenent old generation free space generation eden ss ss
内存管理
• 当eden的空间被分配完时,就会发生一次次要垃圾收集。 eden中仍然存活的对象会被复制到survivor space1中,其 他对象则直接被丢弃,其占用的内存也被回收。
permenent old generation free space generation eden ss1 ss2
内存管理
• JAVA虚拟机的内部体系结构
class文件 类装载器 子系统
方法区

Java栈
PC 寄存器
本地方 法栈
运行时数据区
执行引擎
本地方法 接口
本地方 法库
内存管理
• Java虚拟机的内存模型
Thread Stack Thread Stack Thread Stack
Garbage Collector
System.out.println("start"); Vector v = new Vector(); for(int j = 0; j < 500000; j++){ v.add("weak reference test"); } WeakReference wr = new WeakReference(v); v = null; System.gc(); System.out.println("waiting..."); if (((Vector)wr.get()) == null){ System.out.println("Weak referenced object collected");
• 在这一次次要垃圾收集之后,JVM继续在eden中创建对象。当eden 的空间再次分配完时,又会发生一次次要垃圾收集。这次次要垃圾收 集将eden中存活的对象复制到ss2,并且为ss1中的每一个对象计算 age和threshold。age是对象在被复制到old generation之前经历过的 次要垃圾收集的次数。threshold则表示在这一次的次要垃圾收集中, 凡是age等于threshold的对象将成为tenured对象。会从ss中复制到 old generation中,age小于threshold的对象将被复制到ss2中,这些 对象也称为aged对象。清空了的ss1将成为下一次次要垃圾收集中复 制的目的地。
Vector v = new Vector(); for(int j=0; j<500000; j++){ v.add("longer reference test"); } while(true){ if(i > 100000){ break; } else { i++; } }
内存管理
• 在多线程和服务端应用中,通常都会存在一些生命周期很 长的方法和对象,被这些方法和对象引用的对象,其生命 也会相应的延长。大量的内存占用会导致应用程序的性能 下降,在极端的情况下,会使Java虚拟机发生堆溢出的错 误。程序员必须显式的通知GC对象不需要了,即把指向 对象的引用赋值为null.也可以利用Reference对象更加精 确的控制GC。
内存管理
• phantom reachable An object is phantom reachable if it is neither strongly, softly, nor weakly reachable, it has been finalized, and some phantom reference refers to it • 手工清除短期对象的引用 所谓短期对象,是相对其引用的生存时间而言的。如:
内存管理 • 内存监视工具: JAVA -Xprof -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -XX:+PrintTenuringDistribution .\>.\1.log JConsole(1.5) java -Dcom.sun.management.jmxremote JStat(1.5) HPROF java -agentlib:hprof=help java -Xrunhprof:cpu=samples,file=prof.txt
内存管理
• 根据对存活对象处理方法不同,标记GC又分为两 类: Mark-and-Compat Collector:将所有存活的对象 复制到一个连续的内存区域中,可以有效减少内 存碎片。 Mark-and-Sweep collector:保留所有存活对象, 而将所有死亡对象的内存记录到一个自由空闲列 表中,虽然连续的死亡对象空间会被合并,但与 标记紧缩GC相比,仍然会产生较多的内存碎片。 这两种方式主要用来收集old generation,即 major collection
内存管理
• young generation包括一个eden和两个survivor space。参数-XX:NewRatio是old generation和 young generation之比。也可以用参数-Xmn直接 指定young generation的大小。-Xmn64MB • eden用来存放新创建的对象。ss用来存放尚未 tenured的对象。 eden和ss的大小由-XX:SurvivorRatio决定。 程序在刚开始运行时,对象都在eden中创建。
内存管理
permenent old generation free space generation
eden
ss1
ss2
• 当old geneneration中的内存也告罄时,就会发生一次主要垃圾收集。 主要垃圾收集采用标记紧缩的方法,在old generation中标记出所有 存活对象,然后将其余的对象回收。主要垃圾收集比次要垃圾收集的 时间长的多,因为标记和回收都是很费时的操作。在典型的配置中, old generation也比you期对象(obsolete reference)的引用
public class Stack{ private Object[] elements; private int size = 0; public Stack(int initialCapacity){ this.elements = new Object[initialCapacity]; } public void push(Object e){ ensureCapacity(); elements[size++] = e; } public Object pop(){ if (size == 0) throw new EmptyStackException(); return elements[--size]; } private void ensureCapacity(){ if (elements.length == size){ Object[] oldElements = elements;
Heap
Method Area
Constant pool
Native method stack
内存管理
• 从静态存储区域分配。内存在程序编译时就分配 好了,如static变量 • 在栈上创建。各种原始数据类型的局部变量,都 是在栈上创建的。当程序退出该变量的作用范围 时,这些变量的内存会被自动释放 • 在堆中创建。对象都是在堆中创建的。程序在运 行时用new来创建对象,对象创建时会在堆中为 其分配内存。 • 堆空间由自动的存储管理系统--GC进行控制
内存管理
• 扩展参数-XX:MinHeapFreeRatio,指定了一个百分比。如 果在垃圾收集之后堆的剩余空间高于这个百分比,那么就 不扩展堆。如:-XX:MinHeapFreeRatio=40表示剩余空间 低于40%时扩展堆的大小。 • 扩展参数-XX:MaxHeapFreeRatio指定了一个百分比。如 果在垃圾收集之后堆的剩余空间高于这个百分比,那么就 减小堆。 • permanent generation保留给JVM存放类和方法的反射 (reflection)对象。扩展参数-XX:MaxPermSize可用来指定 其大小的上限。如-XX:MaxPermSize=64m • old generation用来存放tenured对象。参数-XX:NewRatio 用来指定old generation的大小。-XX:NewRatio=4表示old generation和young generation之比为4
2
已回收
隐形
4
1--建立强引用 2--垃圾收集 3--在finalize()创建新的强引用 4--对象包含可执行的finalize() 5--对象不包含可执行的finalize()
内存管理
• strong reachable An object is strongly reachable if it can be reached by some thread without traversing any reference objects. A newly-created object is strongly reachable by the thread that created it • soft reachable An object is softly reachable if it is not strongly reachable but can be reached by traversing a soft reference. • weak reachable An object is weakly reachable if it is neither strongly nor softly reachable but can be reached by traversing a weak reference
相关主题