`
zhangyou1010
  • 浏览: 303308 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

PermGen space 溢出 使用jstat查看 Permsize 占用情况 并设置 PermSize和MaxPermSize

    博客分类:
  • java
阅读更多
网站以前经常java.lang.OutOfMemoryError,也没仔细去查看到底是哪里出了问题,昨晚又出现这个问题

了,今天就仔细查找了下资料,在这里总结下,如有不正确的地方,非常欢迎各位指出。

以前对java.lang.OutOfMemoryError的概念,只局限于jvm内存溢出了,

今天才发现java.lang.OutOfMemoryError 出现时,有多种情况,比如:PermGen space ,Java heap space  。

我现在遇到的是java.lang.OutOfMemoryError: PermGen space ,查了下资料,一般的说法是内存的永久保

存区域溢出了,永久保存区域是存放class信息和meta信息

的,分配了后,jvm是不会去回收的。必须让jvm分配更多的permsize,才能解决这个问题。

问题来了,我的应用这个permsize一般占用多少呢? 我该在catalina.sh或catalina.bat里面给这个值设置多少呢?

有人说用jconsole或其他内存监控程序来查看这些数据,但是我不想这么麻烦,要配置参数,监听端口什么的,因为在

Qieqie的一个回帖里面,他提到可以用命令查看permsize的占用情况(http://www.iteye.com/topic/80620#289390)

所以我倾向于用一条简单的命令就可以知道permsize的占用情况,结果这方面的命令还真不少,jstat就是其中之一,

我使用的命令是: jstat -gcpermcapacity pid ,pid是进程的编号,关于jstat的使用说明可以查看 sun的网站:

http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html

jstat输出的数据都是以kb为单位的。在我的应用中,permsize占用情况

PGCMN      PGCMX       PGC         PC      YGC   FGC    FGCT     GCT   
   16384.0    65536.0    65536.0    65536.0   132     3    1.866    2.977


所以我决定把PermSize设为128M, MaxPermSize设为256M。

应用在linux服务器上,所以设置catalina.sh如下:
JAVA_OPTS='-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m '


请大家多多指教。
分享到:
评论
8 楼 iany 2011-03-04  
用JDK1.6 的 JVISUALVM 也可帮助你分析JVM的内存情况.
7 楼 liwenjie 2011-03-04  
sdh5724 写道
这个问题又几个因素:
2. 发生了classloader的泄露。 这个主要是在特定的cglib/jdk版本的结合会发生这类问题。 我曾经遇见过一次。 jdk不合理的使用class cache来保证某些操作的性能。




请问是什么版本的jdk和cglib??
jrockit为什么没有这样的问题
6 楼 iany 2011-03-04  
这个问题我也遇到过, 其实是有WEB应用程序的缓存和WEB服务器缓存,所引起的.利用监听器释放应用程序的缓存数据. 用JSTAT分析应用程序加载后的内存占用和卸载应用程序遗留所占内存的大小.
用JMAP记录内存映像, 用ECLIPSE的插件MAT分析映像数据. 然后在监听器中强制释放父级CLASS LOADER 所缓存的CLASSES.
5 楼 sdh5724 2011-03-04  
这个问题又几个因素:
1. permsize 的确太小不够用了。 通常如果你引入的代码包很多, 自己的代码很大, 还有大规模使用cglib, 都可能造成perm使用比较多的情形。
2. 发生了classloader的泄露。 这个主要是在特定的cglib/jdk版本的结合会发生这类问题。 我曾经遇见过一次。 jdk不合理的使用class cache来保证某些操作的性能。
3. 主要是应用程序不合理的cache了class对象, 和原因2是一样的。 比如使用cglib每次都创建一个新类,然后还一直持有这个被创建的类对象。

要想精确的确定问题, 我建议你在java启动命令行加入 class verbose参数, 长期运行后, 统计下用户类就明白, 究竟怎么回事情了。

4 楼 aa00aa00 2011-03-03  
这个问题,我以前也遇到过,总是提示溢出,后来上网,查了查资料,和楼主说的一样,呵呵,正解!!
3 楼 zhangyou1010 2011-03-02  
dotaking 写道
检查内存泄露。


permsize溢出,和内存泄漏没关系吧。
2 楼 dotaking 2011-03-02  
检查内存泄露。
1 楼 zhangyou1010 2011-03-02  
大家都没遇到过这种情况吗?

相关推荐

    解决OutOfMemoryError: PermGen space

    启动JConsole后,选择目标进程并查看内存页面下的“Perm Gen”部分,可以直观地看到当前PermGen space的使用情况,从而判断设置是否生效。 4. **优化代码**: - 减少不必要的类加载和字符串常量池的使用。例如,...

    java.lang.OutOfMemoryError: PermGen space及其解决方法

    这意味着即使不再使用的类也会占用PermGen space的空间。 3. **动态代理或注解处理**:在使用诸如Spring AOP这样的框架时,会生成大量的代理类,这些代理类也会消耗PermGen space的空间。 4. **配置不当**:默认情况...

    PermGen space

    4. **监控和分析**:使用性能监控工具定期检查PermGen Space的使用情况,以便及时发现问题并进行调整。 #### Heap Space与PermGen Space的区别及调整 Heap Space是指JVM用来存储对象实例的内存区域,包括年轻代...

    Caused by: java.lang.OutOfMemoryError: PermGen space解决方案

    总之,"java.lang.OutOfMemoryError: PermGen space"错误是由于Java虚拟机的 PermGen 区域内存不足造成的,可以通过增大 PermGen 区域的大小、升级JVM版本、优化类加载和库的使用等方式来解决。对于任何内存管理问题...

    java.lang.OutOfMemoryError: PermGen space

    - `-XX:PermSize` 参数用于设置JVM初始的非堆内存(即PermGen空间)大小,如 `-XX:PermSize=64M` 指定 PermGen 初始分配64MB。 - `-XX:MaxPermSize` 参数则是设定 PermGen 空间的最大值,如 `-XX:MaxPermSize=128M` ...

    解决JVM中得PermGen spac问题

    GC(Garbage Collection)不会在主程序运行期对 PermGen space 进行清理,这意味着如果应用程序加载了很多 Class,那么 PermGen space 就可能会溢出,导致 OutOfMemoryError。 解决 PermGen space 问题的方法: 1....

    Eclipse中通过Tomcat运行J2EE项目java.lang.OutOfMemoryError PermGen space的解决方案

    * -XX:MaxPermSize=256m:设置 PermGen space 的最大大小为 256M 通过添加这些参数,可以增加 JVM 的内存空间,避免 PermGen space 溢出,解决 java.lang.OutOfMemoryError: PermGen space 异常。 在实际应用中,...

    OutOfMemoryError-PermGen-space-的解决方案亲测有效

    ### OutOfMemoryError: PermGen space 错误详解与解决方案 #### 一、问题背景及症状 在开发或运行基于Java的应用程序时,有时会遇到一个常见的错误提示:“OutOfMemoryError: PermGen space”。该错误通常发生在...

    java.lang.OutOfMemoryError: PermGen space解决方案

    java.lang.OutOfMemoryError: PermGen space 解决方案

    认识 java JVM虚拟机选项 Xms Xmx PermSize MaxPermSize 区别

    Java JVM 虚拟机选项 Xms Xmx ...如果 MaxPermSize 设置过小,可能会导致 java.lang.OutOfMemoryError: PermGen space。 因此,合理地配置 JVM 的内存参数是非常重要的,可以避免内存溢出错误和提高应用的性能。

    PermGen space错误解决方法

    讲述了PermGen space错误解决方法以及PermGen space的出现的几张情况

    eclipse 内存溢出解决办法

    - **减少第三方Jar包的数量和大小**:尽可能减少项目中第三方Jar包的数量,并尽量选择轻量级的库,以降低PermGen Space的占用。 - **启用字符串池的共享**:通过使用`String.intern()`方法可以有效地减少字符串在...

    Java内存不足PermGen space错误探究.pdf

    当应用程序加载的类数量过多或者类的元数据占用空间过大时,就会导致PermGen space错误。 Java程序的运行机制与传统的C++或C程序不同。Java源代码首先被编译为平台无关的字节码(Bytecode),这些字节码可以在任何...

    Tomcat给我的java.lang.OutOfMemoryError: PermGen

    在Tomcat的配置文件中(如`catalina.bat`或`catalina.sh`),可以通过添加`-XX:PermSize`和`-XX:MaxPermSize`参数来设定 PermGen 的初始大小和最大大小,例如设置为`-XX:PermSize=128M`和`-XX:MaxPermSize=512m`。...

    myeclipse内存溢出问题解决方案

    而Tomcat的启动脚本`catalina.bat`中设置的`JAVA_OPTS`则是针对Tomcat服务器的内存配置,这两者并不冲突,因为MyEclipse集成的Tomcat使用的是独立的JVM配置。 了解Java内存模型对于理解上述设置至关重要。Java内存...

    Java内存溢出的详细解决方案

    * 设置 PermSize 和 MaxPermSize:可以使用 JVM 选项 -XX:PermSize 和 -XX:MaxPermSize 来设置 PermGen space 的大小。 * 减少Class数量:在应用中尽量减少Class的数量,避免使用大量的第三方 jar 文件。 * 使用 ...

    Java8新特性之再见Permgen_动力节点Java学院整理

    PermGen space,全称为Permanent Generation space,是早期Java HotSpot虚拟机中的一个内存区域,主要用来存放类和元数据。然而,这个区域经常因为类加载器的内存泄漏或频繁的类加载而导致`java.lang....

Global site tag (gtag.js) - Google Analytics