linux服務器下tomcat部署項目內存溢出

     今天將一個項目部署到linux服務器上,結果tomcat在啓動運行到必定時間後就報錯。根據以往的經驗,查了一些資料,終於解決了該問題並順便解決了生產環境中的get方式中文傳遞亂碼問題。java

        tomcat啓動內存溢出問題

 

SEVERE: A child container failed during start
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
        at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252)
        at java.util.concurrent.FutureTask.get(FutureTask.java:111)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1130)
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:293)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:646)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:450)
Caused by: java.lang.OutOfMemoryError: PermGen space
        at java.lang.StackTraceElement.equals(StackTraceElement.java:204)
        at java.lang.Throwable.printEnclosedStackTrace(Throwable.java:688)
        at java.lang.Throwable.printStackTrace(Throwable.java:666)
        at java.lang.Throwable.printStackTrace(Throwable.java:720)
        at java.util.logging.SimpleFormatter.format(SimpleFormatter.java:157)
        at java.util.logging.StreamHandler.publish(StreamHandler.java:196)
        at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:105)
        at java.util.logging.Logger.log(Logger.java:522)
        at java.util.logging.Logger.doLog(Logger.java:543)
        at java.util.logging.Logger.logp(Logger.java:743)
        at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:198)
        at org.apache.juli.logging.DirectJDKLog.error(DirectJDKLog.java:151)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1132)
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:782)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1568)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1558)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)

Aug 11, 2015 10:30:06 AM org.apache.catalina.core.ContainerBase startInternal
SEVERE: A child container failed during start
java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: PermGen space
        at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:252)
        at java.util.concurrent.FutureTask.get(FutureTask.java:111)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1130)
        at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:293)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:727)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.startup.Catalina.start(Catalina.java:646)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
        at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:450)
Caused by: java.lang.OutOfMemoryError: PermGen space
        at java.lang.StackTraceElement.equals(StackTraceElement.java:204)
        at java.lang.Throwable.printEnclosedStackTrace(Throwable.java:688)
        at java.lang.Throwable.printStackTrace(Throwable.java:666)
        at java.lang.Throwable.printStackTrace(Throwable.java:720)
        at java.util.logging.SimpleFormatter.format(SimpleFormatter.java:157)
        at java.util.logging.StreamHandler.publish(StreamHandler.java:196)
        at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:105)
        at java.util.logging.Logger.log(Logger.java:522)
        at java.util.logging.Logger.doLog(Logger.java:543)
        at java.util.logging.Logger.logp(Logger.java:743)
        at org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:198)
        at org.apache.juli.logging.DirectJDKLog.error(DirectJDKLog.java:151)
        at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1132)
        at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:782)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1568)
        at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1558)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
        at java.util.concurrent.FutureTask.run(FutureTask.java:166)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)

      上面的錯誤表示jvm的堆內存溢出。 PermGen space的全稱是Permanent Generationspace,是指內存的永久保存區域,這塊內存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGenspace中,它和存放類實例(Instance)的Heap區域不一樣,GC(GarbageCollection)不會在主程序運行期對PermGenspace進行清理。linux

 

       要解決以上問題必須採起如下措施apache

一、將tomcat中各個項目公用的jar包統一放在,tomcat/lib目錄下,項目中無需再引用這些包tomcat

二、將tomcat中無用的jar包剔除出去。服務器

三、修改tomcat啓動的配置參數,主要涉及java虛擬機和tomcat服務器的啓動參數less

 

JAVA_OPTS="-server
                -Xms1048M
                -Xmx1048M
                -Xss512k
                -XX:+AggressiveOpts
                -XX:+UseBiasedLocking
<span style="color:#FF0000;">                -XX:PermSize=512M
                -XX:MaxPermSize=512M</span>
                -XX:+DisableExplicitGC
                -XX:MaxTenuringThreshold=31
                -XX:+UseConcMarkSweepGC
                -XX:+UseParNewGC
                -XX:+CMSParallelRemarkEnabled
                -XX:+UseCMSCompactAtFullCollection
                -XX:LargePageSizeInBytes=128m
                -XX:+UseFastAccessorMethods
                -XX:+UseCMSInitiatingOccupancyOnly
                -Dfile.encoding=UTF-8
                -Djava.awt.headless=true
                -Djava.net.preferIPv4Stack=true"

CATALINA_OPTS="-server
                -Xms1024m
                -Xmx1024m
                -XX:NewRatio=3
<span style="color:#FF0000;">                -XX:PermSize=512m
                -XX:MaxPermSize=512m</span>
                -Duser.country=US
                -Duser.language=en
                -Duser.timezone=Asia/Shanghai
                -Dfile.encoding=UTF-8
                -Dsun.jnu.encoding=UTF-8
                -Dcom.sun.management.jmxremote=true
                -Djava.library.path=/usr/local/apr/lib"

          修改以上JAVA_OPTS和CATALINA_OPTS中的-XX:PermSize=512m和-XX:MaxPermSize=512m的參數值,第一個桉樹表示默認的堆內存大小,第二個參數表示最大的堆內存大小,最好是將這兩個值設置一致,減小了內存分配的資源消耗。jvm

 

         生產環境的中文亂碼問題

         之前在本地中文經過get方式傳輸,後臺接收不會出現亂碼問題,可是當項目部署到服務器上後,便出現了亂碼問題,今天終於發現是緣由是,jdk啓動的默認編碼是GBK的,因此虛擬機會以GBK方式接收參數,而個人項目是utf-8方式的。所以只須要修改紅色部分

編碼

JAVA_OPTS="-server
                -Xms1048M
                -Xmx1048M
                -Xss512k
                -XX:+AggressiveOpts
                -XX:+UseBiasedLocking
                -XX:PermSize=128M
                -XX:MaxPermSize=512M
                -XX:+DisableExplicitGC
                -XX:MaxTenuringThreshold=31
                -XX:+UseConcMarkSweepGC
                -XX:+UseParNewGC
                -XX:+CMSParallelRemarkEnabled
                -XX:+UseCMSCompactAtFullCollection
                -XX:LargePageSizeInBytes=128m
                -XX:+UseFastAccessorMethods
                -XX:+UseCMSInitiatingOccupancyOnly
<span style="color:#FF6666;">                -Dfile.encoding=UTF-8</span>
                -Djava.awt.headless=true
                -Djava.net.preferIPv4Stack=true"
相關文章
相關標籤/搜索