欢迎来到天天文库
浏览记录
ID:30858193
大小:636.33 KB
页数:40页
时间:2019-01-04
《系统架构-性能篇章1(应用系统性能2:oom》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、系统架构■性能篇章1(应用系统性能厶00M&参数配置)-编程开发技术系统架构-性能篇章1(应用系统性能2:00M&参数配置)原文出处:xieyu_zy对于JVM的内存写过的文章已经冇点多了,而月•冇点烂了,不过说那么多大多数在解决00M的情况,于此,本文就只阐述这个内容,携带一些分析和理解和部分扩展内容,也就是JVM宕机屮的一些问题,0K,下面说下00M的常见情况(木文基于jdk1.6系列版本來编写,其余的版本未必完全适用):第一类内存溢出,也是大家认为最多,第一反应认为是的内存溢出,就是堆栈溢出:那什么
2、样的情况就是堆栈溢出呢?当你看到下面的关键字的时候它就是堆栈溢java.1ang・OutOfMemoryError:javaheapspace***.・也就是当你看到heap相关的时候就肯定是堆栈溢岀了,此时如果代码没有问题的情况下,适当调整-Xmx和-Xnis是可以避免的,不过一定是代码没有问题的前提,为什么会溢出呢,要么代码有问题,要么访问量太多并且每个访问的时间太长或者数据太多,导致数据释放不掉,因为垃圾回收器是耍找到那些是垃圾才能冋收,这里它不会认为这些东西是垃圾,自然不会去冋收了;主意这个溢出之
3、前,可能系统会提前先报错关键字为:java,lang・OutOfMemoryError:GCoverheadlimitexceeded这种情况是当系统处于高频的GC状态,而且冋收的效果依然不佳的情况,就会开始报这个错误,这种情况一般是产生了很多不可以被释放的对象,有可能是引用使用不当导致,或申请大对象导致,但是javaheapspace的内存溢出冇口J能提丽不会报这个错误,也就是可能内存就直接不够导致,而不是高频GC.第二类内存溢出,PermGen的溢出,或者PermGen满了的提示,你会看到这样的关键字
4、:关键信息为:java.1ang.OutOfMemoryError:PermGenspace原因:系统的代码非常多或引用的第三方包非常多、或代码小使用了大量的常量、或通过intern注入常量、或者通过动态代码加载等方法,导致常量池的膨胀,虽然JDK1.5以后可以通过设置对永久带进行冋收,但是我们希望的是这个地方是不做GC的,它够用就行,所以一般情况下今年少做类似的操作,所以在而对这种情况常用的手段是:增加-XX:PermSize和-XX:MaxPermSize的大小。第三类内存溢出:在使用ByteBuff
5、er中的allocateDirect()的时候会用到,很多javaNIO的框架中被封装为其他的方法溢出关键字:java.1ang・OutOfMemoryError:Directbuffermemory如果你在直接或间接使用了ByteBuffer屮的allocateDirect方法的时候,而不做clear的时候就会出现类似的问题,常规的引用程序10输出存在一个内核态与用户态的转换过程,也就是对应直接内存与非直接内存,如果常规的应用程序你要将一个文件的内容输出到客户端需要通过0S的直接内存转换拷贝到程序的非直
6、接内存(也就是hwp中),然后再输出到直接内存由操作系统发送出去,而直接内存就是由0S和应用程序共同管理的,而非直接内存可以直接由应用程序口己控制的内存,jvni垃圾冋收不会冋收掉直接内存这部分的内存,所以要注意了哦。如果经常有类似的操作,可以考虑设置参数:-XX:MaxDirectMemorySize第四类内存溢出错误:溢出关键字:java・lang・StackOverf1owError??这个参数直接说明一个内容,就是-Xss太小了,我们申请很多局部调用的栈针等内容是存放在用户当前所持冇的线程中的,线
7、程在jdk1.4以前默认是256K,1・5以后是1M,如果报这个错,只能说明-Xss设置得太小,当然有些厂商的JVM不是这个参数,本文仅仅针对HotspotVMjfijEl;不过在冇必要的情况下可以对系统做一些优化,使得-Xss的值是可用的。第五类内存溢出错误:溢出关键字:java.1ang.0utOfMemoryError:unabletocreatenewnativethread?上而第四种溢出错误,已经说明了线程的内存空间,其实线程基本只占用heap以外的内存区域,也就是这个错误说明除了heap以外
8、的区域,无法为线程分配一块内存区域了,这个要么是内存木身就不够,要么heap的空间设置得太大了,导致了剩余的内存已经不多了,而曲于线程本身要占用内存,所以就不够用了,说明了原因,如何去修改,不用我多说,你懂的。第六类内存溢出:溢出关键字java.1ang・OutOfMemoryError:request{}bytefor{}outofswap这类错误-般是由于地址空间不够而导致。六大类常见溢出已经说明JVM中99%的溢出情况,
此文档下载收益归作者所有