解码Java.Lang.OutOfMemoryError:PermGen空间

Java开发人员最不了解的领域之一是垃圾收集。 Java开发人员认为JVM负责垃圾收集,因此他们不必担心内存分配,释放等问题。但是,随着应用程序变得越来越复杂,垃圾收集也会变得越来越复杂,一旦性能变得复杂,性能便会受到影响。 因此,这将有利于Java开发人员了解垃圾回收的工作原理以及如何解决Java中的“内存不足”问题。 有2个非常常见的“内存不足”问题。 第一个是“堆大小”,第二个是“ PermGen空间”。

永久生成器和ClassLoader。

Java对象是Java类的实例。 每次创建新的Java对象时,JVM都会创建该对象的内部表示并将其存储在堆中。 如果是第一次访问该类,则必须由JVM加载它。 类加载是以下过程:查找相应的类文件,在磁盘上查找文件,加载文件并解析结构。 确保正确加载类是ClassLoaders的责任。java程序中的每个类都需要由同一ClassLoader加载。 ClassLoader是java.lang.ClassLoader类的实例。 现在,ClassLoader将Java类加载到Perm Space中。

JVM还创建了Java类的内部表示,这些类存储在永久代中。 在垃圾回收期间,java对象和类都被视为对象,并且以相同的方式进行垃圾回收。 最初,java对象和类都存储在堆空间中。
为了优化性能,创建了永久代,并在其中放置了类。类是我们JVM实现的一部分,我们不应该用数据结构填充Java堆。 永久代分配在堆大小之外。 永久世代包含以下类信息:

  • 一类的方法。
  • 类的名称。
  • 常量池信息。
  • 与类关联的对象数组和类型数组。
  • JVM使用的内部对象。
  • 编译器用于优化的信息。

现在我们了解了什么是永久生成,让我们看看是什么导致该区域的内存问题。

PermGen空间

当JVM需要加载新类的定义并且PermGen中没有足够的空间时,会发生“ Java.Lang.OutOfMemoryError:PermGen空间”。 服务器模式分配的默认PermGen空间为64 MB,客户端模式分配的默认为32 MB。 发生PermGen Space问题的原因可能有两个。

第一个原因可能是您的应用程序或服务器中的类太多,而现有的PermGen Space无法容纳所有类。

-XX:MaxPermSize = XXXM

如果问题是由于类数量过多而导致PermGen空间不足,则可以通过添加–XX:MaxPermSize = XXm参数来增加PermGen空间。 这将增加可用于存储类的空间,并且应-XX:MaxPermSize = 256m

-XX:+ CMSClassUnloadingEnabled

此参数指示使用CMS GC时是否启用类卸载。 默认情况下,此选项设置为false,因此要启用此功能,您需要在java options中显式设置以下选项。

-XX:+ CMSClassUnloadingEnabled

如果启用CMSClassUnloadingEnabled,则GC也会清除PermGen,并删除不再使用的类。仅当使用以下选项启用UseConcMarkSweepGC时,此选项才有效。

-XX:+ UseConcMarkSweepGC

-XX:+ CMSPermGenSweepingEnabled

此参数指示是否启用了扫描电烫。 默认情况下,此参数是禁用的,因此需要显式设置此参数以微调PermGen问题。 在Java 6中已删除此选项,因此,如果使用Java 6或更高版本,则需要使用-XX:+ CMSClassUnloadingEnabled。 因此,为解决PermGen Space内存问题而添加的选项如下所示

-XX:MaxPermSize = 128m -XX:+ UseConcMarkSweepGC XX:+ CMSClassUnloadingEnabled

内存泄漏

第二个原因可能是内存泄漏。 装入的类定义可能如何变得未使用。

通常在Java中,类是永远的。 因此,一旦加载了类,即使该应用程序在服务器上停止,它们也会保留在内存中。 像cglib这样的动态类生成库使用了许多PermGen Space,因为它们动态创建了很多类。 大量使用Proxy类,这些类是在运行时综合创建的。 当单个类定义可用于多个实例时,创建新的代理类很容易。

Spring和Hibernate通常代理某些类。 此类代理类由类加载器加载。 永远不会丢弃生成的类定义,从而导致永久堆空间快速填充。

对于PermGen空间问题,您将需要确定泄漏原因并加以解决。 增加PermGen空间将无济于事,只会延迟问题,因为在某些时候PermGen空间仍会被填满。

如果您使用的是Tomcat并因内存泄漏而困扰,那么最新版本的Tomcat可以修复某些内存泄漏问题。

  • http://wiki.apache.org/tomcat/MemoryLeakProtection

结论

一旦遇到PermGen Space问题,您将需要找出问题是由于您的应用程序正在加载大量类还是由于内存泄漏引起的。 如果是由于类数量过多,您可以进行微调以增加分配的PermGen空间,这将解决此问题。 如果问题是由于内存泄漏引起的,则需要找到泄漏的根本原因并加以解决。 某些框架的工作方式如cglib,Spring,Hibernate会创建大量动态生成的类,因此最好使用这些框架为项目分配更多的PermGen Space。

参考: 解码Java.Lang.OutOfMemoryError:来自我们JCG合作伙伴 Venkata Kiran的PermGen Space ,位于Coding方形博客上。

翻译自: https://www.javacodegeeks.com/2013/12/decoding-java-lang-outofmemoryerror-permgen-space.html

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

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

相关文章

Python_报错:IndexError: list assignment index out of range

今天发现一个报错,卡了好几个点,后来发现原因后,脸上三条黑线,尴尬啊!!! 报错:IndexError: list assignment index out of range 原因:split()写法转成列表就会认作一个整…

mysql跨服务器查询插入_Oracle跨服务器查询插入数据

想实现insert into 当前库表 select 远程库中的表数据这种方式的数据同步,于是配置了一下oracle服务,远程和本地服务都是oracle 一、在当前库中插入数据 1 2 create public database link remotedb connect to username identified by password using db…

angular-JS模仿Form表单提交

直接上示例代码,有不懂的欢迎留言: $http({url: "http://localhost:10086/yuanxin/Conference/ImportExcelDataForBusRoute",method: Post,headers: {Content-Type: multipart/form-data },data: { BusRoute: file, ConferenceID: "1&…

想要更快地使用AtomicLong? 等待它。

我经常听到Java原子类型(java.util.concurrent.atomic)超级快,可以很好地与高度并发的代码一起使用。 在大多数情况下,原子以健壮和高效的方式发挥作用。 但是,在某些情况下,原子类型上非托管争用的隐藏成本…

994. 腐烂的橘子

994. 腐烂的橘子 在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐…

python爬虫简历范文_爬虫数据解析,简历模板下载!想收我Q,不存在的!

目标网址代码基础代码:第一页模板下载import requestsfrom lxml import etreeif __name__ __main__:headers {User-Agent: Mozilla / 5.0(Windows NT 6.1; Win64; x64) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 86.0.4240.198 Safari / 537.36}# 免费下…

java获取页面标签_java获取网页源代码后,提取标签内容……

java获取网页源代码后,提取标签内容……关注:245 答案:2 mip版解决时间 2021-02-01 09:11提问者咏b琂败2021-01-31 13:49import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.ne…

C#数字,日期格式化:String.Format

C#:String.Format数字格式化输出 int a 12345678; //格式为sring输出// Label1.Text string.Format("asdfadsf{0}adsfasdf",a);// Label2.Text "asdfadsf"a.ToString()"adsfasdf";// Label1.Text string.Format("asdfadsf{0:C}adsfasdf…

jquery中点击切换的实现

项目中经常会遇到一种情况,就是点击切换,比如点击按钮,div样式为1,再点击一下按钮,div样式为2,再点击一下按钮,div样式为1。需要自定义jQuery方法toggle。 // toggle方法$.fn.toggle function(…

Spring Data MongoDB级联保存在DBRef对象上

默认情况下, Spring Data MongoDB不支持对带有DBRef注释的引用对象的级联操作,如引用所述 : 映射框架不处理级联保存 。 如果更改了Person对象引用的Account对象,则必须单独 保存 Account对象。 在Person对象上调用save 不会自动…

BZOJ4061/Gym100624F CERC2012 Farm and Factory 最短路、切比雪夫距离

传送门——BZOJCH 传送门——Vjudge 设\(f_i\)表示\(i\)到\(1\)号点的最短距离,\(g_i\)表示\(i\)到\(2\)号点的最短距离,\(s_i\)表示\(n1\)号点到\(i\)号点的最短距离,\(As_1,Bs_2\) 根据最短路三角形不等式,\(|f_i - A| \leq s_i…

scrapy安装_爬虫框架Scrapy简介与安装

Scrapy 框架Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容以及各种图片,非常之方便。Scrapy 使…

前端面试题(附上自己的回答)

一些开放性题目 1.自我介绍:除了基本个人信息以外,面试官更想听的是你与众不同的地方和你的优势。 2.项目介绍? 3.如何看待前端开发? 4.平时是如何学习前端开发的? 5.未来三到五年的规划是怎样的? position…

汇编语言的基础知识

汇编语言是在硬件上工作的编程语言,我们需要了解硬件系统的结构,才能有效的用汇编语言对其进行编程。 一:汇编语言的组成 1)汇编指令:机器码的助记符,有对应的机器码。 2)伪指令:没有…

亚马逊Simple Worklfow服务的骆驼演示

在上一篇文章中,我解释了为什么AWS SWF服务很好,并宣布了新的Camel SWF组件。 现在,组件文档已准备就绪, 这是一个简单的完全可用的演示。 它包含三个独立的独立骆驼路线: 工作流生产者允许我们与工作流进行交互。 它…

CODEVS 1205 单词反转

嗯.... 这道题看起来挺像一个字符串的题,但其实却错了,它实质上却用了一个栈进行了一个模拟(当然还有一种鬼畜的做法,下面也会介绍到..... 首先先看题: 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题…

python 定义函数为什么有个长线_关于格式化:如何在Python中打破这条长线?

如何设置这样的长行格式?我想让它的宽度不超过80个字符:logger.info("Skipping {0} because its thumbnail was already in our system as {1}.".format(line[indexes[url]], video.title))这是我最好的选择吗?url "Skipping …

NodeJS中resolve添加地址无效

今天一个朋友在群里问了这样一个问题,他使用url.resolve()添加地址无效,我看了一下,发现是他没有注意细节, resolve可以在二级目录下增加,他使用的时候只是一级目录,所以添加会有问题。他使用的是如下这种…

centos配置jdk的环境变量

1、首先呢,centos下的JDK环境配置分两种情况,一直是root用户级别的jdk配置,另一种是其他用户组级别的配置。这里讲解的是root用户级别的配置。 我们已经下载解压好了jdk的目录。如下 2、编辑环境变量的配置文件: vi /etc/profile…

Python之字符串转换为日期、结合时区的日期操作

一、字符串转换为日期 方法一 s 2019-01-20 print(datetime.strptime(s, %Y-%m-%d)) # 2019-01-20 00:00:00 方法二 def parse_ymd(s):year_s, mon_s, day_s s.split(-)return datetime(int(year_s), int(mon_s), int(day_s)) s 2019-01-20 res parse_ymd(s) print(res) …