Linux环境部署项目引起Out of Memory Error: PermGen Space的解决方案
1. 背景
前几天,在搭建项目时遇到到一些问题,现在整理记录一下。
Linux环境:Red Hat Enterprise Linux Server release 6.4;
# 查看命令
cat /etc/issue
JDK版本:jdk1.7.0_80;
Tomcat版本:apache-tomcat-7.0.79;
2.经过
由于之前曾使用Tomcat容器部署过项目,所以没有觉得有什么特别值得注意的地方,就是将web项目打成war包,放到Linux服务器tomcat容器下,然后启动Tomcat就OK了。
然而,现实并不如想象的那么顺利。。。
之前的部署是这么做的:Eclipse将web项目Export转成war,然后使用Xshell将该war包传至服务器(使用szrz命令,或其他传输工具),将war包放到Tomcat目录下的webapps下,然后回到tomcat目录下的bin目录,./start.sh,回车,整个工作就结束了。
现在的IDE用的是idea,网上各种搜idea下怎么将web项目打成war,一看过程要设置好多事项,果断放弃,想着直接用Linux命令搞定:
jar -cvf demo-web.war ./demo-web
开始看需要部署的项目,从SVN上下载下来一看,喔,19个项目,之前都是一个war包搞定的呀,19个毫不犹豫看了下总共要2-3G,然后找了一个(WinSCP)工具开始上传,局域网按说应该好快的,可能是由于无线的原因吧,愣是传了2,3个小时。传上去之后,打war包,移到webapps目录下,启动tomcat,然后结果是这样的:
严重: Error waiting for multi-thread deployment of directories to complete
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
at java.util.concurrent.FutureTask.report(FutureTask.java:)
at java.util.concurrent.FutureTask.get(FutureTask.java:)
at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:)
at org.apache.catalina.startup.HostConfig.start(HostConfig.java:)
at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:)
at org.apache.catalina.util.LifecycleBase.setStateInternal(LifecycleBase.java:)
at org.apache.catalina.util.LifecycleBase.setState(LifecycleBase.java:)
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:)
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:)
at java.util.concurrent.FutureTask.run(FutureTask.java:)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:)
at java.lang.Thread.run(Thread.java:)
Caused by: java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:)
at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:)
at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:)
at org.apache.catalina.util.Introspection.loadClass(Introspection.java:)
at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:)
at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:)
at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:)
at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:)
at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:)
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:)
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:)
... more
一下愣住了,怎么会出现这个OutOfMemoryError,又重新试了几次,毫无例外,每次都是到这块报错OutOfMemoryError,看来只能是因为项目类太多,导致JVM内存被占满了,这个JVM的参数在哪里修改呢?百度了一下,基本可以确认需要更改的文件:tomcat/bin/catalina.sh,对就是tomcat的启动脚本文件,修改如下:
# OS specific support. $var _must_ be set to either true or false.
JAVA_OPTS = "-Xms256m -Xmx512m -Xss128K -XX:PermSize=128m -XX:MaxPermSize=256m"
这下,应该好了吧,再来一次,结果丝毫没有改变,是不是改错地方了,又在网上找了一会儿,试了试这个方案:修改jdk/jre/lib/security/java.security这个文件原来内容为:
securerandom.source=file:/dev/urandom
修改为:
securerandom.source=file:/dev/./urandom
重启来一次,还是不行。看看快一天了,不行呀,赶紧问下老大,还是这个catalina.sh这个参数设置的问题,然后又回来各种尝试,把”-Xms -Xmx -XX:PermSize -XX:MaxPermSize“各种调大,各种尝试,依然没有进展,好吧,这次先把18个项目删掉只留一个,一试,哦,这下可以了,好吧,继续增加项目个数2个,3个,。。。,8个,就8个了,8个项目就启动不了了,还是java.lang.OutOfMemoryError: PermGen space;这就奇怪了,看看服务器内存占用和CPU使用情况吧:
[root@sv08 ~]# free
total used free shared buffers cached
Mem:
-/+ buffers/cache:
Swap:
[root@sv08 ~]# top
这个看的还是有一定余量的,那只能是JVM参数的设置的问题了,继续网上找,试了几个修改catalina.properties和其他基本配置文件的方案,依然不起任何作用。
这时候同事过来帮忙了,说是之前遇到过类似问题,然后开始对比,-Xms,-Xmx与系统硬件占用情况,依然是top命令和free命令,结论是有富余,然后这是各种调catalina.sh的参数,没有任何效果,然后又开始注释项目代码,这类问题也可能与代码有关的了,然而,多次尝试之后也没有好的效果。
问题总得解决呀,眼下也没有什么好的办法,多尝试尝试吧,又继续尝试网上得方案, 各种试,终于,这样试了一下:
# OS specific support. $var _must_ be set to either true or false.
JAVA_OPTS="-server -XX:PermSize=256m -XX:MaxPermSize=512m"
这个方案一试之后,8个项目可以启动了,呃呃,毫不犹豫,19个项目一起上,结果又出现了这个java.lang.OutOfMemoryError: PermGen space,尝试这个把后面俩个参数调大一倍,最终设置:
# OS specific support. $var _must_ be set to either true or false.
JAVA_OPTS="-server -XX:PermSize=512m -XX:MaxPermSize=1024m"
./start.sh,启动成功!
参考链接:
https://blog.csdn.net/kongls08/article/details/8468713
3.总结
这个没有太多要说的,还是要多掌握下JVM的调优,明白各个参数的意义,以及调优的原理,大家有好的资源可以分享出来一起学习;然后就是多实践了,光有想法是远远不够的,多实践才能总结出更多有用的东西,分享给大家。
Linux环境部署项目引起Out of Memory Error: PermGen Space的解决方案的更多相关文章
- Linux环境部署(一)
最近被老大安排了个任务,解决Linux的安装部署问题,特做如下笔记,以便下次安装配置: --------------------Linux上部署项目------------------- 1.解压缩相 ...
- 性能测试学习第七天-----JMeter之linux环境部署篇
一.linux获取动态ip或静态ip: 1. virtualbox 加载linux虚拟机镜像文件,加载时重置全部网卡,加载后网络选择“桥接网络”--本机当前使用网卡: 2. ifconfig ...
- linux下部署项目问题
1. 今天linux下部署thinkphp项目,数据库用的mysql. 页面其他都是正常的,但是从数据库中取出的数据都是乱码.最后查了资料 解决方案: 在ThinkPHP里面 Library\Thin ...
- weblogic初学笔记2-在Linux上部署项目
一.这两天在做部署项目到Linux服务器上. 网上有用war包部署的,也有把war包解压之后部署的.比如:http://www.cnblogs.com/xdp-gacl/p/4143413.html ...
- 腾讯云linux系统部署项目无法通过外网访问
最近尝试使用了一下腾讯去的linux系统服务器,但是却遇到各种问题,下面记录的问题是项目部署完成后却无法通过外网访问. 服务器:腾讯云 系统 :CentOS 8.0 64位 处理思路:通过度娘百般摸索 ...
- Linux环境下,开启tomcat时报transport error 202: bind failed: 地址已在使用
转载自:http://blog.csdn.net/mooncom/article/details/61913813 问题描述:今天我在Linux环境下配置tomcat,在tomcat/conf下的se ...
- 项目启动异常java.lang.OutOfMemoryError: PermGen space
java.lang.OutOfMemoryError: PermGen space 解决办法: Eclipse-->window-->Tomcat -->JVM setting - ...
- linux环境部署python3+django
1. 确定Linux安装C/C++编译器,在线安装: yum install gcc gcc-c++ autoconf automake 2. 安装依赖环境: yum -y install zlib- ...
- ubuntu环境部署项目
安装python3.6 第一步:sudo add-apt-repository ppa:jonathonf/python-3.6 如果报错为:sudo: add-apt-repository: com ...
随机推荐
- fastext 中文文本分类
1. 输入文本预处理, 通过jieba分词, 空格" "拼接文本串. 每行一个样本, 最后一个单词为双下划线表明label, __label__'xxx' . eg: 邱县 继 ...
- BZOJ 3097: Hash Killer I
3097: Hash Killer I Time Limit: 5 Sec Memory Limit: 128 MBSec Special Judge[Submit][Status][Discus ...
- Android倒计时实现
Android为我们封装好了一个抽象类CountDownTimer,可以实现计时器功能: /** * 倒数计时器 */ private CountDownTimer timer = new Count ...
- PyQt--QTreeWidget
转载:loster_Li QTreeWidget的继承关系如下图: 因为继承关系是 QAbstractItemView->QTreeView->QTreeWidget ,所以和QTabl ...
- git上传文件到coding
一.上传文件到coding:1.远程连接coding,下载远程仓库到本地git clone https://git.coding.net/wanghao_1/besttest_syz.git 2.cd ...
- canvas 2.0 图片绘制
绘制图片drawImage 2013.02.21 by 十年灯·一条评论 本文属于<html5 Canvas画图系列教程> 这里的绘制图片是指把一张现成的图片,绘制到Canvas上面. 有 ...
- 尚硅谷springboot学习31-jdbc数据连接
可以使用JdbcTemplate操作数据库,可以在启动的时候自动建表,更新数据表 配置依赖 <dependency> <groupId>org.springframework. ...
- 6.Python enumerate 特性
enumerate()可参考: list1 = ["这", "是", "一个", "测试"] for index,ite ...
- wget 网站扒取
wget --mirror --page-requisites --adjust-extension --no-parent --convert-links http://target.com
- Linux简单学习
参考自:http://www.runoob.com/linux/linux-tutorial.html 一.是什么 Linux 类Unix操作系统.是一个基于POSIX和UNIX的多用户.多任务.支 ...