java内存管理的原理

java内存管理的原理

ID:36570087

大小:87.15 KB

页数:17页

时间:2019-05-12

java内存管理的原理_第1页
java内存管理的原理_第2页
java内存管理的原理_第3页
java内存管理的原理_第4页
java内存管理的原理_第5页
资源描述:

《java内存管理的原理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、总述作为java开发人员,很少会去关心内存是如何分配与回收,java虚拟机为我们做好了一切,但并不代表开发人员可以对java内存管理的原理一无所知,java应用程序是很消耗内存的,特别是对Sever模式的应用程序,当并发高,运行时间长的时候,代码中内存的浪费也会导致应用程序的停顿、事务执行的失败。因此,了解java内存的管理对于编码的习惯,jvm垃圾回收器的选择等有助于应用程序效率的提高有很大的帮助。基础知识—java内存块简述Java虚拟机的内存主要分为以下几块堆内存堆内存是java内存块中最大的一块

2、内存,也是java虚拟机内存管理的主要内存块,它存放对象的实例,线程共享。想想看,我们应用程序中有成千上万个对象,每个对象可能被实例化成几十个乃至上百个,可能还更多。我们来做一个简单的计算:一个bean对象有7个string型属性,对象是简单的getter/setter方法,大小是187byte。通过如下代码可以判断一个对象的大小:如果一个应用程序有5W个这样的对象,实例化100个。那么它占据堆内存大小为:(187*50000*100)/(1024*1024)=891.69M这个数据可以简单的想象下,当

3、创建大量string对象,那么内存的消耗相当可观,因此在程序当中,要注意对象的创建,能重用的就重用,如String的对象最好用stringbuffer来代替等等。那么堆内存是如何管理的呢,先从堆内存的结构说起:内存结构堆内存可以分为新生代和老年代,新生代又可以分为Eden区、FromSurvivor区、ToSurvivor区。异常会抛出OutOfMemoryError并进一步提示Javaheapspace.抛出异常原理及例子请看“管理与回收原理”.管理与回收原理Jvm对新生代和老年代有不同的管理方式和算

4、法,也有不同的垃圾回收器进行回收。新生代这个区的大小可以通过-XX:NewRatio来设置,例如:-XX:NewRatio=4表示新生代和老代的比例是1:4。新生代的垃圾回收管理一般采用复制算法。这个算法是将内存按容量划分为大小相等的两块,每次只使用其中的一块。当这块内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。基于这种算法,JVM把新生代分为一块较大的Eden空间和两块较小的Survivor空间.1)实例化一个对象时,首先会优先在Eden区域分配内存,但当这个

5、对象很大的时候则直接进入老年代。a)对象大到什么程度才会进入老年代呢?默认的大小是Eden的大小,但是可以通过-XX:PretenureSizeThreshold参数设置,如-XX:PretenureSizeThreshold=3145728,这个参数不能与-Xmx之类的参数一样直接写3MB.看如下代码./***参数:-Xms20M-Xmx20M-Xmn10M-XX:+PrintGCDetails-XX:MaxTenuringThreshold=15-XX:SurvivorRatio=8-XX:+Pri

6、ntTenuringDistribution-XX:PretenureSizeThreshold=3145728B*/privatevoidbigObject(){int_1M=1024*1024;byte[]allo1;//分配3M,直接进入老年代.allo1=newbyte[3*_1M];}a)如何设置Eden的大小?通过比例Eden:Survivor的比例来设置,默认是8:1.例如-XX:SurvivorRatio=8,表示1个Survivor和Eden的比值为1:81)在Eden分配内存,首先要

7、判断空间是否足够,如果不够则会进行一次MinorGC,以释放内存。释放内存后还是不够分配,则直接进入老年代。MinorGC中内存的调配,发生了以下动作:a)JVM会进行一次复制算法,把不能回收的对象,也就是还有引用的对象复制到第二块Survivor,这时要注意当第二块Survivor空间不足以存放复制对象时,则复制对象会晋升到老年代。请看如下代码:/***新生代不够分配,就直接分配到老年代,老年代还是不够直接报错*参数:-Xms30M-Xmx30M-Xmn10M-XX:+PrintGCDetails*/

8、privatevoidnotEnoughEdenAndOld(){int_1M=1024*1024;//1:分配6M到新生代:Eden和一个Survivorbyte[]_6M=newbyte[6*_1M];//2:欲分配7M空间。//3:发现新生代空间不够,触发一次MinorGC,//先前分配的6M空间对象还有引用,故不能GC掉,基于复制的算法,//把6M的对象复制到第二块Survivor,第二块Survivor只有1M空间,不够存放6M的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。