JAVA优化编程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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。
内存管理
• 当eden的空间被分配完时,GC会在eden中进行 一次minor collection,将仍然被引用的对象复制 到old generation中,并更新指向这些对象的引用。 然后将eden全部清空。 • 标记GC
在old generation中,通常使用标记GC,这种GC会从一 组根引用开始,遍历所有的对象,如果一个对象被根引用, 那么就被标记为“存活”,而存活对象引用的对象也标记 为“存活”,如此循环,其余的对象则被标记为“死亡”。 死亡对象的内存会被回收。
内存管理
• JAVA虚拟机的内部体系结构
class文件 类装载器 子系统
方法区
堆
Java栈
PC 寄存器
本地方 法栈
运行时数据区
执行引擎
本地方法 接口
本地方 法库
内存管理
• Java虚拟机的内存模型
Thread Stack Thread Stack Thread Stack
Garbage Collector
ss=survivor space young generation=eden+2*ss 堆包括所有的这4种空间,大小由参数-Xms和-Xmx控制。 -Xms指定堆大小的下限,也就是创建JVM时堆的大小; -Xmx指定堆大小的上限,即JVM在运行时可以扩展的堆 的大小。如果-Xms和-Xmx相等,则堆的大小将不会发生 变化。-Xms268435456 -Xmx268435456就表示启动JVM 时堆的大小为256MB,并且在运行过程中堆的大小始终为 256MB。
内存管理
• 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 • 手工清除短期对象的引用 所谓短期对象,是相对其引用的生存时间而言的。如:
• 在这一次次要垃圾收集之后,JVM继续在eden中创建对象。当eden 的空间再次分配完时,又会发生一次次要垃圾收集。这次次要垃圾收 集将eden中存活的对象复制到ss2,并且为ss1中的每一个对象计算 age和threshold。age是对象在被复制到old generation之前经历过的 次要垃圾收集的次数。threshold则表示在这一次的次要垃圾收集中, 凡是age等于threshold的对象将成为tenured对象。会从ss中复制到 old generation中,age小于threshold的对象将被复制到ss2中,这些 对象也称为aged对象。清空了的ss1将成为下一次次要垃圾收集中复 制的目的地。
permenent old generation free space generation eden ss ss
内存管理
• 当eden的空间被分配完时,就会发生一次次要垃圾收集。 eden中仍然存活的对象会被复制到survivor space1中,其 他对象则直接被丢弃,其占用的内存也被回收。
permenent old generation free space generation eden ss1 ss2
内存管理
• 分代复制(Generational Copying)
HotSpot Java虚拟机采用了分代复制算法。分代复制算法 基于这样一个事实:即超过95%的对象的生存期都非常短。 分代复制算法根据对象的生存期将对象分为两代。所有新 创建的对象都在一个类似栈的内存区域进行分配,这块区 域叫做Eden。这首先使得内存分配的速度提高了,因为 此时只需要更新eden指针和检查eden溢出就可以了。当 这块内存已经全部分配给对象时,其中大多数对象已经 “死亡”了。GC只要把少数未“死亡”的长期对象复制 到另一块内存中去,然后直接更新eden的指针就可以了, 这些为“死亡”的对象称为tenured对象。生存于eden中 的对象称为young generation对象,生命较长的对象生存 区域称为old generation。
内存管理
• 虚拟机中对象的状态
已创建(created) 活跃(strongly reachable) 隐形(invisible) 不可达(unreachable) 已收集(collected) 最终化(finalized) 已回收(deallocated)
1
已创建 活跃 不可达
3 2
已收集
5
最终化
内存管理
permenent old generation free space generation
eden
ss1
ss2
• 当old geneneration中的内存也告罄时,就会发生一次主要垃圾收集。 主要垃圾收集采用标记紧缩的方法,在old generation中标记出所有 存活对象,然后将其余的对象回收。主要垃圾收集比次要垃圾收集的 时间长的多,因为标记和回收都是很费时的操作。在典型的配置中, old generation也比young generation要大。
内存管理
• 扩展参数-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
内存管理
• Minor Collection和Major Collection
HotSpot JVM的内存堆包括4种空间:permanent generation; old generation; eden和2个survivor space
permanent generation olg generation free space eden ss ss
内存管理 • 内存监视工具: 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
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");
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
内存管理
• young generation包括一个eden和两个survivor space。参数-XX:NewRatio是old generation和 young generation之比。也可以用参数-Xmn直接 指定young generation的大小。-Xmn64MB • eden用来存放新创建的对象。ss用来存放尚未 tenured的对象。 eden和ss的大小由-XX:SurvivorRatio决定。 程序在刚开始运行时,对象都在eden中创建。
内存管理
• 消除对过期对象(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进行控制
内存管理
• 根据对存活对象处理方法不同,标记GC又分为两 类: Mark-and-Compat Collector:将所有存活的对象 复制到一个连续的内存区域中,可以有效减少内 存碎片。 Mark-and-Sweep collector:保留所有存活对象, 而将所有死亡对象的内存记录到一个自由空闲列 表中,虽然连续的死亡对象空间会被合并,但与 标记紧缩GC相比,仍然会产生较多的内存碎片。 这两种方式主要用来收集old generation,即 major collection
内存管理
• 在多线程和服务端应用中,通常都会存在一些生命周期很 长的方法和对象,被这些方法和对象引用的对象,其生命 也会相应的延长。大量的内存占用会导致应用程序的性能 下降,在极端的情况下,会使Java虚拟机发生堆溢出的错 误。程序员必须显式的通知GC对象不需要了,即把指向 对象的引用赋值为null.也可以利用Reference对象更加精 确的控制GC。
内存管理
• 当eden的空间被分配完时,GC会在eden中进行 一次minor collection,将仍然被引用的对象复制 到old generation中,并更新指向这些对象的引用。 然后将eden全部清空。 • 标记GC
在old generation中,通常使用标记GC,这种GC会从一 组根引用开始,遍历所有的对象,如果一个对象被根引用, 那么就被标记为“存活”,而存活对象引用的对象也标记 为“存活”,如此循环,其余的对象则被标记为“死亡”。 死亡对象的内存会被回收。
内存管理
• JAVA虚拟机的内部体系结构
class文件 类装载器 子系统
方法区
堆
Java栈
PC 寄存器
本地方 法栈
运行时数据区
执行引擎
本地方法 接口
本地方 法库
内存管理
• Java虚拟机的内存模型
Thread Stack Thread Stack Thread Stack
Garbage Collector
ss=survivor space young generation=eden+2*ss 堆包括所有的这4种空间,大小由参数-Xms和-Xmx控制。 -Xms指定堆大小的下限,也就是创建JVM时堆的大小; -Xmx指定堆大小的上限,即JVM在运行时可以扩展的堆 的大小。如果-Xms和-Xmx相等,则堆的大小将不会发生 变化。-Xms268435456 -Xmx268435456就表示启动JVM 时堆的大小为256MB,并且在运行过程中堆的大小始终为 256MB。
内存管理
• 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 • 手工清除短期对象的引用 所谓短期对象,是相对其引用的生存时间而言的。如:
• 在这一次次要垃圾收集之后,JVM继续在eden中创建对象。当eden 的空间再次分配完时,又会发生一次次要垃圾收集。这次次要垃圾收 集将eden中存活的对象复制到ss2,并且为ss1中的每一个对象计算 age和threshold。age是对象在被复制到old generation之前经历过的 次要垃圾收集的次数。threshold则表示在这一次的次要垃圾收集中, 凡是age等于threshold的对象将成为tenured对象。会从ss中复制到 old generation中,age小于threshold的对象将被复制到ss2中,这些 对象也称为aged对象。清空了的ss1将成为下一次次要垃圾收集中复 制的目的地。
permenent old generation free space generation eden ss ss
内存管理
• 当eden的空间被分配完时,就会发生一次次要垃圾收集。 eden中仍然存活的对象会被复制到survivor space1中,其 他对象则直接被丢弃,其占用的内存也被回收。
permenent old generation free space generation eden ss1 ss2
内存管理
• 分代复制(Generational Copying)
HotSpot Java虚拟机采用了分代复制算法。分代复制算法 基于这样一个事实:即超过95%的对象的生存期都非常短。 分代复制算法根据对象的生存期将对象分为两代。所有新 创建的对象都在一个类似栈的内存区域进行分配,这块区 域叫做Eden。这首先使得内存分配的速度提高了,因为 此时只需要更新eden指针和检查eden溢出就可以了。当 这块内存已经全部分配给对象时,其中大多数对象已经 “死亡”了。GC只要把少数未“死亡”的长期对象复制 到另一块内存中去,然后直接更新eden的指针就可以了, 这些为“死亡”的对象称为tenured对象。生存于eden中 的对象称为young generation对象,生命较长的对象生存 区域称为old generation。
内存管理
• 虚拟机中对象的状态
已创建(created) 活跃(strongly reachable) 隐形(invisible) 不可达(unreachable) 已收集(collected) 最终化(finalized) 已回收(deallocated)
1
已创建 活跃 不可达
3 2
已收集
5
最终化
内存管理
permenent old generation free space generation
eden
ss1
ss2
• 当old geneneration中的内存也告罄时,就会发生一次主要垃圾收集。 主要垃圾收集采用标记紧缩的方法,在old generation中标记出所有 存活对象,然后将其余的对象回收。主要垃圾收集比次要垃圾收集的 时间长的多,因为标记和回收都是很费时的操作。在典型的配置中, old generation也比young generation要大。
内存管理
• 扩展参数-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
内存管理
• Minor Collection和Major Collection
HotSpot JVM的内存堆包括4种空间:permanent generation; old generation; eden和2个survivor space
permanent generation olg generation free space eden ss ss
内存管理 • 内存监视工具: 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
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");
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
内存管理
• young generation包括一个eden和两个survivor space。参数-XX:NewRatio是old generation和 young generation之比。也可以用参数-Xmn直接 指定young generation的大小。-Xmn64MB • eden用来存放新创建的对象。ss用来存放尚未 tenured的对象。 eden和ss的大小由-XX:SurvivorRatio决定。 程序在刚开始运行时,对象都在eden中创建。
内存管理
• 消除对过期对象(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进行控制
内存管理
• 根据对存活对象处理方法不同,标记GC又分为两 类: Mark-and-Compat Collector:将所有存活的对象 复制到一个连续的内存区域中,可以有效减少内 存碎片。 Mark-and-Sweep collector:保留所有存活对象, 而将所有死亡对象的内存记录到一个自由空闲列 表中,虽然连续的死亡对象空间会被合并,但与 标记紧缩GC相比,仍然会产生较多的内存碎片。 这两种方式主要用来收集old generation,即 major collection