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 ...
随机推荐
- nginx配置分发Tomcat服务,负载均衡
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中瓦片资源越来越多,如果提高瓦片的访问效率是一个需要解决的 ...
- HTML5 超链接:a标签的href 属性
H5中a标签的 href 属性用于指定超链接目标的 URL,这里主要给大家介绍一下 href 属性的定义和用法以及应用实例. 定义和用法: <a> 标签的 href 属性用于指定超链接目标 ...
- 深入学习 Java 序列化
前言 对于Java的序列化,一直只知道只需要实现Serializbale这个接口就可以了,具体内部实现一直不是很了解,正好这次在重复造RPC的轮子的时候涉及到序列化问题,就抽时间看了下 Java序列化 ...
- tomcat JRE_HOME
tomcat 不知道什么时候开始需要 JRE_HOME了: D:\java\apache-tomcat-7.0.68\bin>startup.batJAVA_HOME == D:\Progra ...
- pytho学习笔记---编码
编解码 ASCII:1字节,0-255 GBK2313:常用的汉字,2万多个 GBK:对GBK2313的补充,支持藏文,2个字节表示一个汉字 big5:台湾,繁体字 unicode:万国码,2-4字节 ...
- 001之IP基础对话框
在TCP/IP协议中,建立连接的两个进程(客户端和服务器)各自用一个socket(IP地址+TCP/UDP端口号)标识.在MFC中流式套接字(SOCK_STREAM)和数据报套接字(SOCK_DGRA ...
- HTTP 中 GET 与 POST 的区别
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. GET和POST是什么?HTTP协议中的两种发送请求的方法. HTTP是什么?HTTP是基于TCP/IP的关 ...
- win10版office365激活序列码
win10版office365激活序列码(在别的地方找到一个) : NKGG6-WBPCC-HXWMY-6DQGJ-CPQVG 1.在线安装Office2016预览版后它是不会自动激活的,需在Offi ...
- python note 07 集合
1.删除特例 lis = [11,22,33,44,55] for i in range(len(lis)): print(i) del lis[i] print(lis) #每删除链表中一个值链表就 ...
- python的序列类
1,我们常见的数据结构有哪些是序列类 序列类型的分类: ① 容器序列:list,tuple,deque(可以防止任意的类型的容器) ② 扁平序列:str,bytes,bytearray,array ...