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的解决方案的更多相关文章

  1. Linux环境部署(一)

    最近被老大安排了个任务,解决Linux的安装部署问题,特做如下笔记,以便下次安装配置: --------------------Linux上部署项目------------------- 1.解压缩相 ...

  2. 性能测试学习第七天-----JMeter之linux环境部署篇

    一.linux获取动态ip或静态ip: 1. virtualbox 加载linux虚拟机镜像文件,加载时重置全部网卡,加载后网络选择“桥接网络”--本机当前使用网卡: 2. ifconfig      ...

  3. linux下部署项目问题

    1. 今天linux下部署thinkphp项目,数据库用的mysql. 页面其他都是正常的,但是从数据库中取出的数据都是乱码.最后查了资料 解决方案: 在ThinkPHP里面 Library\Thin ...

  4. weblogic初学笔记2-在Linux上部署项目

    一.这两天在做部署项目到Linux服务器上. 网上有用war包部署的,也有把war包解压之后部署的.比如:http://www.cnblogs.com/xdp-gacl/p/4143413.html ...

  5. 腾讯云linux系统部署项目无法通过外网访问

    最近尝试使用了一下腾讯去的linux系统服务器,但是却遇到各种问题,下面记录的问题是项目部署完成后却无法通过外网访问. 服务器:腾讯云 系统 :CentOS 8.0 64位 处理思路:通过度娘百般摸索 ...

  6. Linux环境下,开启tomcat时报transport error 202: bind failed: 地址已在使用

    转载自:http://blog.csdn.net/mooncom/article/details/61913813 问题描述:今天我在Linux环境下配置tomcat,在tomcat/conf下的se ...

  7. 项目启动异常java.lang.OutOfMemoryError: PermGen space

    java.lang.OutOfMemoryError: PermGen space 解决办法: Eclipse-->window-->Tomcat -->JVM setting  - ...

  8. linux环境部署python3+django

    1. 确定Linux安装C/C++编译器,在线安装: yum install gcc gcc-c++ autoconf automake 2. 安装依赖环境: yum -y install zlib- ...

  9. ubuntu环境部署项目

    安装python3.6 第一步:sudo add-apt-repository ppa:jonathonf/python-3.6 如果报错为:sudo: add-apt-repository: com ...

随机推荐

  1. 记录 Ext 日历月份选择控件bug解决过程结果

    目录 背景 代码 背景 项目使用 Ext.NET 2.2.0.40838 , 对应 Ext JS4.2 版本. 结果 2017/3/31 号的时候偶然间点日历选择控件选择2月,10月等月份突然就跳到3 ...

  2. 黑色背景下 vs把{}括号变黑问题

    最近喜欢把VS的背景搞成黑色,据说这样可以对眼睛好一点,然后就蛋疼的碰到点击括号中的内容,括号就变黑的问题,这样黑色背景下就什么看不到了. 原因是装了番茄助手导致的,解决办法,把选中行VA Brace ...

  3. 【产品设计】【转】APP界面设计规范编写指南(人人都是产品经理)

    转自 :http://www.woshipm.com/ucd/608557.html 作者:EID_UX_DESIGN,微信公众号:EID_center 原文地址:http://www.ui.cn/d ...

  4. Tomcat的简单归纳总结

    2017年08月09日 12:39:23 大道之简 阅读数:1072    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/HcJsJqJSSM/ar ...

  5. sqlzoo 之 nobel 错题集

    12.查找尤金•奧尼爾EUGENE O'NEILL得獎的所有細節 我: select yr , subject , winner from nobel where winner = 'eugene o ...

  6. django 的model是如何把字段加入到meta中的

    def contribute_to_class(self, cls, name): self.set_attributes_from_name(name) self.model = cls cls._ ...

  7. 三. html&JavaScript&ajax 部 分

    1. 判 断 第 二 个 日 期 比 第 一 个 日 期 大 如何用脚本判断用户输入的的字符串是下面的时间格式2004-11-21必须要保证用户 的输入是此格式,并且是时间,比如说月份不大于12等等, ...

  8. 【java】String类常见操作

    秋招做题需要,总结String类常用api如下: 简单的:str.length().str.isEmpty().str.split(“;”)切割 1.字符串反转:借助StringBuilder/Str ...

  9. 编织织物的knit course direction and knit wale direction

    来自:http://www.definetextile.com/2013/04/course-wale.html

  10. python3编译安装no module named _ssl

    使用源码编译安装python3.6.7以后用pip 安装库, 出现如下问题 Retrying (Retry(total=4, connect=None, read=None, redirect=Non ...