jvm 内存管理-常见异常 OutOfMemoryError

OutOfMemoryError

jvm内存中,除程序计数器外,堆,栈(本地方法栈,虚拟机栈),方法区,都会存在OutOfMemoryError,也就是常说的OOM。

堆溢出:不断创建对象,且GC Roots 到对象之间有可达路径,对象不会被GC,对象数量达到堆最大容量限制时候出现OOM,紧接着会出现java heap space 错误。

在JVM中如果98%的时间是用于GC且可用的 Heap size 不足2%的时候将抛出此异常信息。

没有内存泄露的情况下,内存溢出

  1. 从参数上,调整-Xms -Xmx参数可以解决
  2. 从代码上,检查是否某些对象生命周期过长,持有状态时间过长,尝试减少程序运行起内存消耗

-Xms:初始堆大小   -Xmx:最大堆大小

-Xms -Xmx一般配置成一样比较好比如set JAVA_OPTS= -Xms1024m -Xmx1024

内存泄漏:设置JVM参数-XX:+HeapDumpOnOutOfMemoryError,在虚拟机OOM时,dump当前内存堆转储快照,用eclipse memory analyzer分析,

下载地址:http://www.eclipse.org/mat/downloads.php。

或  在 eclipse ->install new software -> http://download.eclipse.org/mat/1.6/update-site/ 进行安装

StackOverflowError

如果当前线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。 如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。

设置-Xss参数

永久保存区域溢出

内存的永久保存区域,存放class相关信息,如类名,访问修饰符,常量池,字段描述,方法描述,当程序产生大量的类,jvm的gc是不会清理PemGen space

spring,hibernate,类增强时,使用CGLIB等字节码技术,大量JSP文件都会产生此类异常

本文内容主要是学习周志明老师的《深入理解Java虚拟机》一书的学习笔记,仅作学习巩固整理知识点使用,在此感谢周老师。

猜你喜欢

转载自blog.csdn.net/ghostwuxiao/article/details/81078221
今日推荐