浏览 12078 次
精华帖 (0) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-03-02
最后修改:2011-03-02
了,今天就仔细查找了下资料,在这里总结下,如有不正确的地方,非常欢迎各位指出。 以前对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 ' 请大家多多指教。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-03-02
大家都没遇到过这种情况吗?
|
|
返回顶楼 | |
发表时间:2011-03-02
检查内存泄露。
|
|
返回顶楼 | |
发表时间:2011-03-02
dotaking 写道 检查内存泄露。
permsize溢出,和内存泄漏没关系吧。 |
|
返回顶楼 | |
发表时间:2011-03-03
这个问题,我以前也遇到过,总是提示溢出,后来上网,查了查资料,和楼主说的一样,呵呵,正解!!
|
|
返回顶楼 | |
发表时间:2011-03-04
这个问题又几个因素:
1. permsize 的确太小不够用了。 通常如果你引入的代码包很多, 自己的代码很大, 还有大规模使用cglib, 都可能造成perm使用比较多的情形。 2. 发生了classloader的泄露。 这个主要是在特定的cglib/jdk版本的结合会发生这类问题。 我曾经遇见过一次。 jdk不合理的使用class cache来保证某些操作的性能。 3. 主要是应用程序不合理的cache了class对象, 和原因2是一样的。 比如使用cglib每次都创建一个新类,然后还一直持有这个被创建的类对象。 要想精确的确定问题, 我建议你在java启动命令行加入 class verbose参数, 长期运行后, 统计下用户类就明白, 究竟怎么回事情了。 |
|
返回顶楼 | |
发表时间:2011-03-04
这个问题我也遇到过, 其实是有WEB应用程序的缓存和WEB服务器缓存,所引起的.利用监听器释放应用程序的缓存数据. 用JSTAT分析应用程序加载后的内存占用和卸载应用程序遗留所占内存的大小.
用JMAP记录内存映像, 用ECLIPSE的插件MAT分析映像数据. 然后在监听器中强制释放父级CLASS LOADER 所缓存的CLASSES. |
|
返回顶楼 | |
发表时间:2011-03-04
sdh5724 写道 这个问题又几个因素:
2. 发生了classloader的泄露。 这个主要是在特定的cglib/jdk版本的结合会发生这类问题。 我曾经遇见过一次。 jdk不合理的使用class cache来保证某些操作的性能。 请问是什么版本的jdk和cglib?? jrockit为什么没有这样的问题 |
|
返回顶楼 | |
发表时间:2011-03-04
用JDK1.6 的 JVISUALVM 也可帮助你分析JVM的内存情况.
|
|
返回顶楼 | |