文档章节

解码OutOfMemoryError:PermGen Space

longbadx
 longbadx
发布于 2013/12/27 09:31
字数 1586
阅读 158
收藏 15
点赞 0
评论 0

本文由 ImportNew - Peter Pan 翻译自 javacodegeeks。如需转载本文,请先参见文章末尾处的转载要求。

ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 Java开发 小组。参与方式请查看小组简介。

垃圾回收是Java开发人员理解得最不彻底的地方之一。他们觉得既然JVM负责垃圾回收,那么便不必担心内存的分配跟回收等问题。但是当应用变得复杂的时候,垃圾回收同样变得复杂起来,而且一旦垃圾回收变得复杂,程序的性能就会受到影响。所以,这篇文章将会帮助Java开发人员更好地理解垃圾回收机制是怎样工作的,以及如何修复Java中的“Out of Memory”问题。有两个十分普遍的导致“Out of Memory”问题的因素。第一个是堆大小,第二个就是PermGen Space。

永久代和类加载器

Java对象是Java类的实例。每一次创建一个新的Java对象,JVM就会创建一个该对象的内部标识并把该对象存储在堆中。如果是首次访问该类,JVM就必须加载它。类加载是定位相关类文件、在硬盘上找到该文件、加载该文件并解析文件结构的一系列过程。确保类的正确加载是类加载器(ClassLoader)的责任。一个Java程序中的每一个类都必须被相同的类加载器加载。类加载器是java.lang.ClassLoader类的实例。类加载器把Java类暂时加载到Perm Space中。

JVM也创建了Java类的内部标识并把java类存储在永久代中。在垃圾回收期间,对象跟类都被看作对象且用相同的方式进行垃圾回收。最初,类和对象都被存储在堆空间。

作为优化性能,会创建永久代并将被放在永久代中。类是我们的JVM实现的一部分,并且我们不应该用数据结构填满Java堆。永久代内存分配在堆之外,包含以下类的信息:

  • 类的方法

  • 类的名字

  • 常量池信息

  • 跟类有关的对象数组和类型数组

  • JVM使用的内部对象

  • 编译器优化的使用信息

既然现在我们已经理解了永久代是什么,那么就让我们看一看是什么引发了内存问题。

PermGen Space

当JVM需要加载一个新类的定义的却发现在PermGen没有足够的空间时,”java.lang.OutOfMemoryError: PermGen Space”错误便发生了。默认分配的永久代内存空间(PermGen Space),服务器模式是64M,客户端模式是32M。有两个可能原因导致永久代内存空间问题。

第一个原因可能是你的应用程序或服务器拥有太多的类,而已有永久代内存空间不足以容纳所有的类。

-XX:MaxPermSize=XXXM

如果出现OOM,这是因为类太多而引起的永久代内存空间不足,那么你可以通过增加 +XX:MaxPermGenSize=XXXM 大小的方式来增加永久代的内存空间。这样做会加大存储类的空间变量的大小,并且 +XX:MaxPermGenSize 参数应该设置为256M。

-XX:+CMSClassUnloadingEnabled

这个参数显示在使用CMS GC时,未加载类是否可用。该参数默认值为false,由此,你需要在java选项中显示设置下面选项:

1
-XX:+CMSClassUnloadingEnabled

如果你启用 CMSClassUnloadingEnabled ,JVM进行GC时便会清除永久代,并且删除不再使用的类。这个选项只会在 UseConcMarkSweepGC 可用时才起作用。通过以下选项使 UseConcMarkSweepGC 可用:

1
-XX:+ UseConcMarkSweepGC

-XX:+CMSPermGenSweepingEnabled

这个参数显示清除永久代是否可用。默认情况下这个参数是不可用的,所以要协调永久代问题,就必须显示设置这个参数。这个参数在Java 6里面被删除,所以如果你在使用Java 6或以上版本,你将不得不使用 -XX:+CMSClassUnloadingEnabled 选项。所以,为了解决永久代空间的内存问题,被添加的选项看起来如下:

1
-XX:MaxPermSize=128M –XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled

内存泄漏

第二个原因可能是内存泄露。被加载的类定义如何变成没有被使用?

正常情况下,在Java中类是永久存在的。所以一旦类被加载,他们将一直停留在内存中,即便其所在应用服务器端已经停止运行。像cglib这样的动态类产生库,在他们动态创建了大量类之后,会使用大量永久代内存空间。在运行时创建的代理类被广泛地使用。当单个类定义被用于产生多个实例时,创建新的代理类将会很容易。

Spring和Hibernate经常产生某个类的代理,这些代理类被类加载器加载。产生的类定义从不被清理,导致永久性堆空间迅速填满。

为了解决永久代内存空间问题,你需要识别出泄露的原因并修补它。增大永久代内容空间不会有益于解决却只会延缓这类问题,因为在某种意义上,永久代内存空间终将被填满。

如果你正在使用Tomcat且经常遇到内存溢出问题,最新版本的Tomcat已经有足够的容量来解决某些内存溢出问题。

总结

一旦你遇到永久代内存空间问题,你需要找出这个问题是否是由于你的应用程序加载了大量的类或出现了内存泄露。如果是由于类太多,精确地协调分配永久代内存空间能够解决。如果是由于内存泄露,你需要找到泄露的根本原因并标记出来。像cglib、Spring、Hibernate这样的框架会动态生成大量的类,所以在使用这些框架时分配更多的永久代内存空间是更好的选择。

原文链接: javacodegeeks 翻译: ImportNew.com - Peter Pan
译文链接: http://www.importnew.com/8133.html

© 著作权归作者所有

共有 人打赏支持
longbadx
粉丝 6
博文 37
码字总数 35515
作品 0
杭州
程序员
【java异常】java.lang.OutOfMemoryError: PermGen space

问题描述 java程序运行时报PermGenspace错误 错误信息 Exception in thread "DispatcherThread" java.lang.OutOfMemoryError: PermGen space Exception in thread "ContainerBackgroundProce......

季_苗
2016/09/13
182
2
Linux下启动tomcat报java.lang.OutOfMemoryError: PermGen space

一、错误信息 java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMeth......

lar555
2016/08/23
56
0
java.lang.OutOfMemoryError: PermGen space及其解决方法

Tomcat – java.lang.OutOfMemoryError: PermGen space http://www.mkyong.com/tomcat/tomcat-javalangoutofmemoryerror-permgen-space/ java.lang.OutOfMemoryError: PermGen space及其解决......

十一11
2016/02/19
16
0
OutOfMemoryError系列(3): Permgen space

说明: Permgen(永久代) 属于 JDK1.7 及之前版本的概念; 为了适应Java程序的发展, JDK8以后的版本采用限制更少的 MetaSpace 来代替, 详情请参考下一篇文章: OutOfMemoryError系列(4): Metas...

renfufei
2017/09/15
0
0
Metaspace in Java8

Metaspace in Java8 One of the new features that we will see in Java8 is the introduction of Metaspace. Metaspace is nothing but a replacement of our old friend PermGen (Permanen......

秋风醉了
2016/03/25
38
0
java.lang.OutOfMemoryError: PermGen space及其解决方法

java.lang.OutOfMemoryError: PermGen space及其解决方法 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出...

风中帆
2016/10/21
5
0
heap space 和 permgen space 溢出的简单解决方法和原理笔记

1 . PermGenspace 全称是Permanent Generationspace,是指内存的永久保存区域. 用于存放,Class和Meta的信息,Class在被 Load的时候被放入PermGenspace区域.所以当我们的应用服务器在启动的时候...

orpheus
2009/11/18
0
0
Android OutOfMemoryError异常解决方法

java.lang.OutOfMemoryError异常解决方法 原因: 常见的有以下几种: 1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 2.集合类中有对对象的引用,使用完后未清空,使得JVM不能...

SRain215
2016/03/15
148
0
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结

本来想写一写项目中遇到的内存溢出的问题,看了好多博客,发现有一篇特别好的博客,拾人牙慧,共享分享。 转载:http://outofmemory.cn/c/java-outOfMemoryError java.lang.OutOfMemoryErro...

mengdonghui123456
2017/02/07
0
0
java.exe占用的内存越来越多……直到出现java.lang.OutOfMemoryErr...

最近才发现TOMCAT启动一段时间后,总是出现java.lang.OutOfMemoryError PermGen space这个错误,后来搜索到答案称:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen s...

temp1898
2011/05/19
4.2K
8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Call to undefined function Workerman\posix_getpid

workerman 在centos下报PHP Fatal error: Call to undefined function Workerman\posix_getpid posix在下面这个包中php-process...

dragon_tech
5分钟前
0
0
mysql 7.4 创建表 时  所建表 字段太多 导致失败

报错:[Err] 1118 - Row size too large (> 8126). Changing some columns to TEXT or BLOB may help. In current row format, BLOB prefix of 0 bytes is stored inline. 解决方法:把表的引......

qimh
7分钟前
0
0
语法补漏

1.if...elif...else... 代码示例: test=10 if test>9: print(1) elif test>8: print(2) elif test>7: print(3) else: print('nothing') 输出代码: 1...

十年磨一剑3344
7分钟前
0
0
Python -re模块及正则表达式解析

传送门: https://blog.csdn.net/pipisorry/article/details/25909899 ps:上面文章中"命名分组"的语法格式不能执行。正确的如下: (?P<name>正则表达式) #name是一个合法的标识符 除了使用别名...

一口今心
15分钟前
0
0
mybatis中session.getMapper方法源码分析

0开始代码AuthorMapper mapper = session.getMapper(AuthorMapper.class); 1 DefaultSqlSession类 @Override public <T> T getMapper(Class<T> type) { //最后会去调用MapperRegistry.getMap......

writeademo
23分钟前
1
0
spring cloud zuul网关的作用

zuul一般有两大作用,1是类似于Nginx的网址重定向,但zuul的重定向的一般是整个spring cloud里在Eureka注册中心的模块. zuul: ignored-services: '*' sensitiveHeaders: routes: ...

算法之名
23分钟前
9
0
java按比例之原图生成缩略图

package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; import sun.......

恋码之子
33分钟前
1
0
SpringCloud 微服务 (十五) 服务容错 Hystrix

壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应 有A服务调用B服务,B服...

___大侠
35分钟前
1
0
Spring框架中的设计模式(五)

Spring框架中的设计模式(五) 通过以前的4篇文章,我们看到Spring采用了大量的关于创建和结构方面的设计模式。本文将描述属于行为方面的两种设计模式:命令和访问者。 前传: Spring框架中的...

瑞查德-Jack
38分钟前
1
0
解决phpstorm运行很卡问题!

phpStorm一旦达到这个临界值,所有智能提示、自动补全都失效了 这TM就很尴尬了,顿时感觉自己就是个废人了,纯手写代码跟便秘一样 众所周知phpStorm基于JAVA,那么这个内存限制肯定跟JAVA的虚...

sjcehui2010
41分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部