permgen_打破PermGen神话

permgen

神话破灭 在我的最新文章中,我解释了可能导致java.lang.OutOfMemoryError:PermGen空间崩溃的原因 现在该讨论该问题的可能解决方案了。 或更确切地说,是关于互联网对可能解决方案的建议。 不幸的是,我只能说,当我通过关于该主题的不同“专家意见”时,来自MythBusters的内心Jamie Hyneman正在唤醒。

我搜索了有关解决java.lang.OutOfMemoryError:PermGen空间崩溃的方法的当前常识,并浏览了许多页面,这些页面似乎更适合Google结果。 幸运的是,大多数建议已经被提炼为备受推崇的StackOverflow的主题 。 如您所见,该主题非常受欢迎,并获得了一些颇受好评的答案。 但是具有讽刺意味的是,整个主题包含的零解决方案我可以向我推荐。 好吧,除了“查找内存泄漏的原因”外,这当然是绝对正确的,但对回答“如何解决内存泄漏”的问题不是很有帮助。 让我们回顾一下SO页面上提出的建议。

使用-XX:MaxPermSize = XXXM

导致java.lang.OutOfMemoryError的原因有两个:PermGen空间错误。

一种是应用程序服务器和/或应用程序确实确实使用了太多的类,以致它们不适合默认大小的永久代。 绝对有可能,但实际上并非如此。 在这种情况下,增加永久代的大小确实可以节省一天。 如果您唯一的问题是如何在太多的小房子里放太多家具,那就买更大的房子!

但是,如果您的爱心妈妈每周给您寄去新家具怎么办? 您可能无法一遍又一遍地搬到更大的房子。 正如我在上面提到的上一篇文章中所描述的,这正是内存泄漏以及类加载器泄漏的情况。 在此让我清楚:永久代大小的增加不会使您免于类加载器泄漏。 它只能推迟。 并更难预测服务器将淘汰多少次重新部署。

-XX:+ CMSPermGenSweepingEnabled

关于StackOverflow的最流行的答案是将这些选项添加到服务器的命令行中。 而且,他们说:“也可以添加-XX:+ UseConcMarkSweepGC。 只是要确定”。 这些JVM标志的第一个问题是没有关于它们真正作用的解释。 无论是在SO答案中(我都不喜欢告诉您在没有理由的情况下要做某事的答案),还是在整个Internet中都是如此。

确实,除了此页面之外,我找不到有关这些选项的任何文档。 但是,实际上,这甚至没有关系。 绝不会对垃圾收集器选项进行任何修补,以防在班机泄漏时发生。 因为按照定义, 内存泄漏是GC不足的情况。 如果从服务器的类加载器中的某个地方到应用程序的对象或类之间存在有效的实时硬引用,则GC永远不会将其视为垃圾,也永远不会对其进行回收。 当然,所有这些JVM标志看起来都很聪明和神奇。 在某些情况下可能确实需要它们 但是它们肯定还不够 ,不能解决您的永久代泄漏。

使用JRockit

下一个建议是切换到JRockit JVM。 理由是,由于JRockit没有永久代,因此无法用完它。 当然,这是一个有趣的主张。 不幸的是,它也不能解决我们的问题。

此“解决方案”的唯一结果将是获取java.lang.OutOfMemoryError:Java堆空间,而不是java.lang.OutOfMemoryError:PermGen空间。 在没有单独生成类定义的情况下,JRockit将通常的Java堆空间用于它们。 而且,只要泄漏的根本原因无法解决,只要有足够的时间,这些类定义就可以填满最大的堆。

重新启动服务器

假装问题已解决的另一种方法是不时重新启动应用程序服务器。 例如,无需重新部署应用程序,只需重新启动整个服务器即可。 但是,当您第一次看到部署了多个应用程序的应用程序服务器时,您会知道在生产环境中几乎不可能做到这一点。 这并不是真正的解决方案。 这是将您的头藏在沙子里的一种方法。

使用Tomcat

实际上,这并不是以前的绝望之作-最近的Tomcat版本确实尝试解决类加载器泄漏。 自己看看他们的文档 。 如果您可以将Tomcat用作目标服务器,并且如果您的泄漏是Tomcat可以成功应对的泄漏之一,那么也许,也许您很幸运,问题就为您解决了。

在此处使用<您最喜欢的探查器工具>

也可能是可行的解决方案。 但是,再加上几个IF 。 首先,您应该能够在受影响的环境中使用该探查器。 正如我之前在其他文章中提到的那样, 探查器施加的开销水平在(生产)环境中可能是不可接受的。 其次,您必须知道如何使用探查器提取所需的信息并确定泄漏的位置。 而我十多年的经验表明,这种情况很少发生。

结论

到目前为止,我们还没有看到java.lang.OutOfMemoryError:PermGen空间错误的任何确定解决方案。 在某些情况下,有些方法是可行的。 但是,令我震惊的是,大多数建议完全是无效的 ! 您可能会浪费数天或数周的时间来尝试它们,甚至没有开始解决真正的问题:找到流氓的根本原因,以防泄漏!

幸运的是,从1.1版本开始, Plumbr还发现了PermGen泄漏 。 它告诉您阻止类加载器被释放的根本原因,从而节省了寻找漏洞的时间。 因此,下一次,当面对java.lang.OutOfMemoryError:PermGen空间消息时, 下载Plumbr并永久摆脱该问题。

参考: Plumbr博客博客上来自JCG合作伙伴 Nikita Salnikov Tarnovski的《 破坏PermGen神话》 。

翻译自: https://www.javacodegeeks.com/2012/12/busting-permgen-myths.html

permgen

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

到底是32位系统运行快还是64位系统快

首先声明一下&#xff0c;这个标题“到底是32位系统运行快还是64位系统运行快”的提法本身就是存在问题的&#xff0c;主要是由于很多网友把这个问题提炼的层次太高&#xff0c;那就是“我现在的机子是装32位系统快还是64位系统更快&#xff1f;”&#xff0c;所以就拿这个问题…

linux系统证书存储,Linux系统下如何配置Nginx的SSL安全证书

刚刚介绍了ownCloud的安装&#xff0c;有朋友问我SSL是怎么配置的&#xff0c;哎&#xff0c;为什么不去官方找&#xff0c;却来找我要呢&#xff0c;好吧&#xff0c;我知道你懒得看那些英文&#xff0c;我就介绍一下我是怎么一步步在Nginx上配置SSL的吧。首先你要确保你安装了…

命令界面:使用Java中的动态API处理Redis

Redis是一个数据存储&#xff0c;支持190多个已记录命令和450多个命令排列。 社区积极支持Redis开发&#xff1b; 每个主要的Redis版本都附带新命令。 今年&#xff0c;Redis向第三方供应商开放&#xff0c;以开发可扩展Redis功能的模块。 对于客户端开发人员和Redis用户而言&a…

Python数据库连接池DBUtils

DBUtils是Python的一个用于实现数据库连接池的模块 此连接池有两种连接模式&#xff1a; DBUtils提供两种外部接口&#xff1a; PersistentDB &#xff1a;提供线程专用的数据库连接&#xff0c;并自动管理连接。 PooledDB &#xff1a;提供线程间可共享的数据库连接&…

够用的 Python 写日志的知识——标准日志模块logging简介

前一段工作的时候用到了python写后台系统&#xff0c;需要把一些系统的行为记录下来。本着不要去重复发明轮子的精神&#xff0c;就去搜索了一下python的系统库本身是否有写日志的模块。果然有。python语言作为一门接口简单&#xff0c;标准库强大的语言&#xff0c;果然没有令…

vivox7刷linux系统,Vivo 找来宋仲基帮你送 X7

虽说有极致的 Xplay5 用来打品牌&#xff0c;但真正跑起量来&#xff0c;Vivo 实际上靠得还是以明星代言、外型、自拍等特性为卖点的中端产品线。这不&#xff0c;他们刚刚又在北京发布了全新的 X7 系列&#xff0c;这次找来了大势韩星宋仲基&#xff0c;美其名曰「有了你就有了…

Gradle配置

配置远程仓库 在gradle目录下的init.d目录中创建名为init.gradle文件&#xff0c;内容如下&#xff1a; allprojects{repositories {def REPOSITORY_URL http://localhost:8081/nexus/content/groups/public/all { ArtifactRepository repo ->if(repo instanceof MavenArti…

UML类图实例

首先是复习一下UML中九种图的理解&#xff1a;http://xhf123456789plain.blog.163.com/blog/static/172880482201192222144421/ 画用例图&#xff1a;http://xhf123456789plain.blog.163.com/blog/static/172880482201192221826110/ 下面是类图的实例&#xff08;好像大话设计中…

836c语言程序设计,2017年辽宁师范大学计算机应用研究所836C语言程序设计考研强化模拟题...

一、选择题1&#xff0e; 以下叙述中正确的是( )。A. 在scanf 函数的格式串中&#xff0c;必须有与输入项一一对应的格式转换说明符B. 只能在printf 函数中指定输入数据的宽度&#xff0c;而不能在scanf 函数中指定输入数据占的宽度C.scanf 函数中的字符串是提示程序员的&#…

days to_days_Java2Days 2012:Java EE

days to_daysJava2Days会议是东欧的主要活动&#xff0c;目的是介绍Java开发的最新趋势。 今年&#xff0c;该活动于10月25日至26日在保加利亚的索非亚举行。 我在那里&#xff0c;并有机会与一些来自SAP的同事一起品尝了一些最新的Java&#xff0c;云和移动内容&#xff0c;这…

c语言静态成员变量重名会怎么样,C++中静态成员函数与静态成员变量(static )...

C中静态成员函数与静态成员变量(static )这篇介绍了静态成员函数与静态成员变量&#xff0c;是我的读书笔记&#xff0c;我希望它够简短但又比较全面&#xff0c;起到复习的作用。如果有一些C知识记不清楚了&#xff0c;它可以帮你很快回忆起来。复习C语言的static关键字(1)加在…

JVM简单学习

jvm与字节码 jvm只需关注字节码文件 jvm由哪些部分构成 1.类加载子系统&#xff0c;将磁盘中的字节码文件加载到方法区的内存空间中 类加载器分两种&#xff1a;引导类加载器是jvm底层中用C和C语言写的 各个默认的类加载器的不同区别在于 各自默认负责要加载的类的目录不一…

谈一谈自己对依赖、关联、聚合和组合之间区别的理解

在学习面向对象设计对象关系时&#xff0c;依赖、关联、聚合和组合这四种关系之间区别比较容易混淆。特别是后三种&#xff0c;仅仅是在语义上有所区别&#xff0c;所谓语义就是指上下文环境、特定情景等。他们在编程语言中的体现却是基本相同的&#xff0c;但是基本相同并不等…

Java Bullshifier –生成大量随机代码库

生成大量随机Java应用程序的命令行工具 您一直在等待的命令行工具。 或不。 毕竟&#xff0c;这是很深奥的。 无论哪种方式&#xff0c;它对某些人都非常有用&#xff0c;而对其他人来说却是一个有趣的实用程序。 Bullshifier是由David Levanon和Hodaya Gamliel开发的内部Over…

二级c语言光盘,二级c语言(光盘).doc

1程序设计题&#xff1a; 请编写一个函数 unsigned fun (unsigned w ) w是一个大于10的无符号整数。例如&#xff1a;W值为5923&#xff0c;则函数返回923&#xff1b;W值为923&#xff0c;则函数返回23。if ( w >10000 ) w % 10000 ; 程序修改题: m i; 和 if( a[k]>a[m]…

设计模式六大原则(3):依赖倒置原则

定义&#xff1a; 高层模块不应该依赖低层模块&#xff0c;二者都应该依赖其抽象&#xff1b;抽象不应该依赖细节&#xff1b;细节应该依赖抽象。 问题由来&#xff1a;类A直接依赖类B&#xff0c;假如要将类A改为依赖类C&#xff0c;则必须通过修改类A的代码来达成。这种场景下…

Jirasearch 2.0狗粮:使用Lucene查找我们的Jira问题

几年前&#xff0c;我首先构建并发布了Jirasearch &#xff0c;它是用于薄型包装Lucene服务器的有趣的狗粮测试用例&#xff0c;以针对我们的Jira问题公开强大的搜索UI。 这很好地展示了Lucene的许多重要功能&#xff1a; 使用块联接查询来建模父文档&#xff08;原始的Jira问…

Highcharts教程--把js代码从html中抽离出来,放到单独的一个js文件中。由html页面调用...

1.html页面写法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>第一个 Highcharts 图表</title><!-- 引入 jquery.js --><script src"static/jquery-3.3.1.min.js"><…

数据结构c语言版第16页,数据结构c语言版

数据结构c语言版[编辑]概述《数据结构C语言版》本书的前半部分从抽象数据类型的角度讨论各种基本类型的数据结构及其应用;后半部分主要讨论查找和排序的各种实现方法及综合分析比较出版信息作/译者&#xff1a;严蔚敏&#xff0c;吴伟民 出版社&#xff1a;清华大学出版社出版日…

C语言申请内存时堆栈大小限制

一直都有一个疑问&#xff0c;一个进程可以使用多大的内存空间&#xff0c;swap交换空间以及物理内存的大小&#xff0c;ulimit的stack size对进程的内存使用有怎样的限制&#xff1f;今天特亲自动手实验了一次&#xff0c;总结如下&#xff1a; 开辟一片内存空间有2种方式&…