欢迎来到天天文库
浏览记录
ID:59417330
大小:1.86 MB
页数:31页
时间:2020-09-19
《java内存管理讲义ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、終端研發部門/刘永红日期:2010/7名稱:java内存管理引言你是否曾见过这个?Exceptioninthread"main"java.lang.OutOfMemoryError:Javaheapspace引言然后你将怎么办呢?引言我们会做什么?增加heap的大小希望问题被解决….-Xmx64m-Xmx80m引言但这并没有解决问题Exceptioninthread"main"java.lang.OutOfMemoryError:Javaheapspaceatapp.leaking.UhOh(leaking.java:41)atapp.leak
2、ing.WeHadHoped(leaking.java:51)atapp.leaking.IfWeKeptIncreasing(leaking.java:55)atapp.leaking.TheHeapSize(leaking.java:59)atapp.leaking.ThenMaybeThisProblemWouldGoAway(leaking.java:63)atapp.leaking.LooksLikeItHasNotGoneAway(leaking.java:67)atapp.leaking.Bummer(leaking.java:6
3、1)atapp.leaking.main(leaking.java:31)引言我们将会非常生气…JVM对内存的管理Java中的内存泄露(memoryleak)YourKit使用分析案例Java内存使用建议讲解主题JVM构造存储垃圾回收JVM对内存的管理JVM的内存结构JVM的构造1、Heap(堆):一个Java虚拟实例中只存在一个堆空间2、MethodArea(方法区域):被装载的class的信息存储在Methodarea的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件内容并把它传输到虚拟机中
4、。3、JavaStack(java的栈):虚拟机只会直接对Javastack执行两种操作:以帧为单位的压栈或出栈4、ProgramCounter(程序计数器):每一个线程都有它自己的PC寄存器,也是该线程启动时创建的。PC寄存器的内容总是指向下一条将被执行指令的饿地址,这里的地址可以是一个本地指针,也可以是在方法区中相对应于该方法起始指令的偏移量。5、Nativemethodstack(本地方法栈)总结class文件,静态属性,静态方法,对象的引用存放在stack中.方法本身是指令的操作码部分,方法内部变量(对象类型的引用),保存在stack中
5、类的动态属性存放在heap中存储提问非静态方法在调用前,必须先new一个对象实例?非静态方法有一个隐含的传入参数,该参数是JVM给它的,和我们怎么写代码无关,这个隐含的参数就是对象实例在stack中的地址指针。因此非静态方法(在stack中的指令代码)总是可以找到自己的专用数据(在heap中的对象属性值)。当然非静态方法也必须获得该隐含参数,因此非静态方法在调用前,必须先new一个对象实例,获得stack中的地址指针,否则JVM将无法将隐含参数传给非静态方法。为什么需要垃圾回收?回收什么?可以控制垃圾回收吗?System.gc();finali
6、ze()垃圾回收思考垃圾回收的双刃剑正是由于垃圾回收机制,java程序员可以更加轻松的写出健壮的程序,而无需考虑内存的分配和回收.但另一方面,这成为和c,c++程序在效率上,实时上,并发上的差距的一个重要原因.如何写出节省内存的程序?1.对象的申请for(inti=0;i<10000;++i){Objectobj=newObject();System.out.println("obj="+obj);}publicclassA{privateHashtabletable=newHashtable();publicA(){table=newHash
7、table();}}思考….voidf(){inti;Aa=newA();if(…){a.showMessage();}}2.数组的使用3.StringBuffer4.静态变量,静态方法5.对象池6.缓存使用内存溢出和内存泄露的区别内存溢出可能是由内存泄露引起的,但内存泄露未必会造成内存溢出.什么时候会内存溢出?什么时候会内存泄露?内存泄露,是因为在程序中可能存在垃圾回收器无法收集的持续存在的无用引用.长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收
8、,这就是java中内存泄露的发生场景.Java中的内存泄露情景本机内存泄露情景堆内存泄露情景内存溢出情景栈内存泄露情景Java中的内存泄露本机内存泄露
此文档下载收益归作者所有