文档章节

tomcat的reloadable特性引发的PermGen space

小小草猫猫
 小小草猫猫
发布于 2016/05/10 16:05
字数 1636
阅读 30
收藏 0
点赞 2
评论 0

这两天遇到Tomcat  报java.lang.OutOfMemoryError: PermGen space 的问题,解决办法分享给大家!

  1. PermGen space 是什么

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。

SUN JVM分代垃圾回收器把堆空间分成3块:

  • Young Gen:年轻代,包括1个Eden区和2个Suvivor区,新创建的对象(大部分为短周期的对象)将进入这个区,虚拟机会频繁地对这个区进行垃圾回收。
  • Old Gen:年老代,当对象在Young Gen呆地足够久(经过几次的垃圾回收仍然存在)或Young Gen空间不足时,对象将进入Old Gen,由于一般是生命周期比较长的对象,因此虚拟机对这块内存的回收频度会比较低,一旦回收,使用的将是一个耗时的Full GC,另外,一旦堆空间不足时,虚拟机也会尝试去回收这个区。
  • Perm Gen:持久代,一些常量定义和类、方法声明及其bytecode都会放在这个区

 

 2.通常什么情况下出现PermGen space 

OutOfMemoryError: PermGen space从表面上看就是内存益出。说说为什么会内存益出:这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGen space错误。

 

 3. visualvm、jstat  分析jvm工具

     jvisualvm

     jvisualvm:监控内存泄露,跟踪垃圾回收,执行时内存、cpu分析,线程分析...

    在JDK_HOME/bin目录下面,有一个jvisualvm.exe文件,双击打开

 

  监控项总共分为概述,监视,线程和一个抽样。

 

  • 概述包括 jvm启动参数,系统参数)

如果选择Eclipse还可以可以看到eclipase 的启动参数;

  • 监视

左上:cpu利用率,gc状态的监控

右上:堆利用率,永久内存区的利用率

左下:类的监控

右下:线程的监控

performGC:gc的详细运行状态

HeapDump:堆的详细状态(可以看到堆的概况,里面所有的类,还能点进具体的一个类查看这个类的状态)

 

  • 线程

能够显示线程的名称和运行的状态,在调试多线程时必不可少,而且可以点进一个线程查看这个线程的详细运行情况

参考:http://blog.csdn.net/a19881029/article/details/8432368

          http://www.ibm.com/developerworks/cn/java/j-lo-visualvm/

 

Jstat

 

Jstat 是JDK自带的一个轻量级小工具。全称“Java Virtual Machine statistics monitoring tool”,它位于java的bin目录下,主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控。可见,Jstat是轻量级的、专门针对JVM的工具,非常适用。

可以列出当前JVM版本支持的选项,常见的有

  • l  class (类加载器) 
  • l  compiler (JIT) 
  • l  gc (GC堆状态) 
  • l  gccapacity (各区大小) 
  • l  gccause (最近一次GC统计和原因) 
  • l  gcnew (新区统计)
  • l  gcnewcapacity (新区大小)
  • l  gcold (老区统计)
  • l  gcoldcapacity (老区大小)
  • l  gcpermcapacity (永久区大小)
  • l  gcutil (GC统计汇总)
  • l  printcompilation (HotSpot编译统计)

 

参考:http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html#class_option

          http://nassir.iteye.com/blog/1517484

 

 

4.解决内存溢出的问题

1.手动设置MaxPermSize的大小, TOMCAT_HOME/bin/catalina.bat(Linux上为catalina.sh)文件

set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG% -Xms256m -Xmx512m -XX:MaxNewSize=256m -XX:MaxPermSize=256m

常见配置汇总 
堆设置 
-Xms:初始堆大小 
-Xmx:最大堆大小 
-XX:NewSize=n:设置年轻代大小 
-XX:NewRatio=n:设置年轻代和年老代的比值.如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值.注意Survivor区有两个.如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 
-XX:MaxPermSize=n:设置持久代大小
收集器设置 
-XX:+UseSerialGC:设置串行收集器 
-XX:+UseParallelGC:设置并行收集器 
-XX:+UseParalledlOldGC:设置并行年老代收集器 
-XX:+UseConcMarkSweepGC:设置并发收集器
垃圾回收统计信息 
-XX:+PrintGC 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-Xloggc:filename
并行收集器设置 
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数.并行收集线程数. 
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间 
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比.公式为1/(1+n)
并发收集器设置 
-XX:+CMSIncrementalMode:设置为增量模式.适用于单CPU情况. 

-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数.并行收集线程数.

2.检查代码(不多说了)

3.Tomcat便于开发者开发,tomcat支持 热加载,但是当热加载次数变多也会造成内存溢出(也是本宝宝此次遇到的问题!~~~~(>_<)~~~~)

    原因是由于运行项目的classes目录文件变更引起tomcat reload,同时reload时没有释放资源引起的宕机。

  当您重新部署您的应用程序时,Tomcat 将创建新的类加载器。旧类加载器必须是垃圾回收 ,但是tomcat 每次热加载GC(Garbage Collection)不会在主程序运行期对 PermGen space进行清理 ,导致每次都又重新    加载一次所有的    class,最后加载的多了,就出现了PermGen space;

现象:用VisualVM时候,PermGen已经满了达到最大值了,类区的装入类总数达到了应用正常类的好多倍!最后程序直接挂掉!

 

 这种情况下无论你MaxPermSize改变的多大都不管用的,解决办法修改tomcat 的server.xml文件,让项目变更时不reload。

reloadable 改成 false; 就这么简单! tomcat 的坑啊!

 

  1. 这是应该用的不多吧,网上看到的,并且试了试  是好用的,只是程序响应比较慢,解决的不是本质的问题,但是还是有必要知道下,原理我并不懂,衰!

   参考地址:http://www.tuicool.com/articles/6BJJzin

5.tomcat 的 classload 机制

   网上文章比较多,不写了!哈哈,好懒!

 

最后看到JVM8 已经没有PermGen 了!参考:Java PermGen 去哪里了?

参考地址:http://ifeve.com/java-permgen-removed/

参考书籍:

1、分布式java应用基础

2、深入理解JVM

© 著作权归作者所有

共有 人打赏支持
小小草猫猫
粉丝 0
博文 1
码字总数 1636
作品 0
杭州
tomcat下内存溢出的解决办法

tomcat服务下报java.lang.OutOfMemoryError: PermGen space异常 引发的原因: java虚拟机jvm的内存不够: 解决办法一:JDK内存优化(Tomcat默认可以使用的内存为128MB) windows环境下,tom...

EDIAGD ⋅ 2013/09/13 ⋅ 0

tomcat6.0.28 内存溢出PermGen Space

我在tomcat 6.0.28 的servlet.xml设置了虚拟主机分了三个站点, ................. <Host name="www.ruijicn.com" appBase="aaaapps" unpackWARs="true" autoDeploy="true" xmlValidation="......

走啊 ⋅ 2010/07/22 ⋅ 5

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 ⋅ 0

tomcat多应用之间如何共享jar

在上一篇博客中介绍了如何在一个tomcat中创建多个应用,但是往往在项目中会包含很多相同的jar包,这样,tomcat加载多个项目的时候会经常出现java.lang.OutOfMemoryError: PermGen space内存溢...

FuYung ⋅ 2014/03/07 ⋅ 1

内存泄露java.lang.OutOfMemoryError: PermGen space解决方法

内存泄露java.lang.OutOfMemoryError: PermGen space解决办法 今天访问web服务器,点击几个网页,tomcat服务就瘫痪了,通过查看日志,发现java.lang.OutOfMemoryError: PermGen space错误,如...

lcdmusic ⋅ 2015/01/20 ⋅ 0

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

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

风中帆 ⋅ 2016/10/21 ⋅ 0

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

这个问题是我的工程中加入了Birt报表在Linux环境下运行出现的问题,从网上搜索了一下看到这文章发现并不是由于Birt的原因造成的 引用 1、 PermGen space的全称是Permanent Generation space,...

曹_翔 ⋅ 2010/11/16 ⋅ 0

java.exe占用的内存越来越多……直到出现java.lang.OutOfMemoryErr...

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

temp1898 ⋅ 2011/05/19 ⋅ 8

tomcat中jvm内存溢出解决方案

常见的内存溢出有以下两种: java.lang.OutOfMemoryError: PermGen space java.lang.OutOfMemoryError: Java heap space 一、java.lang.OutOfMemoryError: PermGen space PermGen space的全称......

jin_6868 ⋅ 05/25 ⋅ 0

Java 的 PermGen 概念的认识,以及相关问题的处理方法

本文转自:http://blog.csdn.net/xiaojianpitt/archive/2008/11/11/3276790.aspx PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space......

红薯 ⋅ 2010/06/09 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL 数据库设计总结

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节...

OSC_cnhwTY ⋅ 57分钟前 ⋅ 0

多线程(四)

线程池和Exector框架 什么是线程池? 降低资源的消耗 提高响应速度,任务:T1创建线程时间,T2任务执行时间,T3线程销毁时间,线程池没有或者减少T1和T3 提高线程的可管理性。 线程池要做些什...

这很耳东先生 ⋅ 今天 ⋅ 0

使用SpringMVC的@Validated注解验证

1、SpringMVC验证@Validated的使用 第一步:编写国际化消息资源文件 编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制 [java] view plain copy edit.userna...

瑟青豆 ⋅ 今天 ⋅ 0

19.压缩工具gzip bzip2 xz

6月22日任务 6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具 6.1 压缩打包介绍: linux中常见的一些压缩文件 .zip .gz .bz2 .xz .tar .gz .tar .bz2 .tar.xz 建立一些文...

王鑫linux ⋅ 今天 ⋅ 0

6. Shell 函数 和 定向输出

Shell 常用函数 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用 Shell函数格式 linux ...

AHUSKY ⋅ 今天 ⋅ 0

单片机软件定时器

之前写了一个软件定时器,发现不够优化,和友好,现在重写了 soft_timer.h #ifndef _SOFT_TIMER_H_#define _SOFT_TIMER_H_#include "sys.h"typedef void (*timer_callback_function)(vo...

猎人嘻嘻哈哈的 ⋅ 今天 ⋅ 0

好的资料搜说引擎

鸠摩搜书 简介:鸠摩搜书是一个电子书搜索引擎。它汇集了多个网盘和电子书平台的资源,真所谓大而全。而且它还支持筛选txt,pdf,mobi,epub、azw3格式文件。还显示来自不同网站的资源。对了,...

乔三爷 ⋅ 今天 ⋅ 0

Debian下安装PostgreSQL的表分区插件pg_pathman

先安装基础的编译环境 apt-get install build-essential libssl1.0-dev libkrb5-dev 将pg的bin目录加入环境变量,主要是要使用 pg_config export PATH=$PATH:/usr/lib/postgresql/10/bin 进......

玛雅牛 ⋅ 今天 ⋅ 0

inno安装

#define MyAppName "HoldChipEngin" #define MyAppVersion "1.0" #define MyAppPublisher "Hold Chip, Inc." #define MyAppURL "http://www.holdchip.com/" #define MyAppExeName "HoldChipE......

backtrackx ⋅ 今天 ⋅ 0

Linux(CentOS)下配置php运行环境及nginx解析php

【part1:搭建php环境】 1.选在自己需要安装的安装包版本,wget命令下载到服务器响应目录 http://php.net/releases/ 2.解压安装包 tar zxf php-x.x.x 3.cd到解压目录执行如下操作 cd ../php-...

硅谷课堂 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部