CentOS 7 Linux 安裝Tomcat 8 - JVM記憶體最佳化,centosjvm
CentOS 7 Linux 安裝Tomcat 8 - JVM記憶體最佳化(咋個辦呢 zgbn)
參考:CentOS 7 Linux 安裝Tomcat 8
配置Tomcat啟動JVM時分配的記憶體JVM記憶體配置預設情況說明
JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:PermSize=128M -XX:MaxPermSize=128m"
JVM記憶體配置參數 |
描述 |
-Xmx |
Java Heap最大值,預設值為實體記憶體的1/4; |
-Xms |
Java Heap初始值,Server端JVM最好將-Xms和-Xmx設定成相同值,開發測試機JVM可以保留預設值; |
-Xmn |
Java Heap Young區大小,不熟悉最好保留預設值; |
-XX:PermSize |
設定記憶體的永久儲存地區; |
-XX:MaxPermSize |
設定最大記憶體的永久儲存地區; |
-XX:NewSize |
設定JVM堆的新生代的預設大小; |
-XX:MaxNewSize |
設定JVM堆的新生代的最大大小; |
-Xss |
每個線程的Stack大小,不熟悉最好保留預設值; |
JVM堆記憶體配置
-Xms約定了JVM啟動是初始化分配實體記憶體,預設為實體記憶體的1/64;
-Xmx約定了JVM運行時最大分配的實體記憶體,預設是實體記憶體的1/4;
在JVM運行時,當JVM空閑堆記憶體大於自身佔用記憶體的70%時,JVM就會自動釋放對記憶體一直達到-Xms約定的最小值,JVM調整自身堆記憶體時通常是在GC後發生。
記憶體最佳化
- 所以我們可以手動去設定-Xms與-Xmx相等,避免在每次GC 後調整堆的大小。
- 建議堆記憶體的最大值設定-Xmx為可用記憶體的最大值的80%。
記憶體溢出
- -Xms<-Xmx時,JVM啟動失敗;
- -Xmx> 可用實體記憶體時,JVM啟動失敗;
- 應用程式在啟動和運行時所使用的記憶體超出-Xmx時,JVM發生記憶體溢出( OutOfMemoryError: Java heap space);
JVM非堆記憶體配置
-XX:PermSize設定非堆記憶體初始值,預設是實體記憶體的1/64;
-XX:MaxPermSize設定最大非堆記憶體的大小,預設是實體記憶體的1/4;
JVM非堆記憶體(永久記憶體區),用於存放Class和Meta資訊,應用程式所有的Class在被JVM載入的時候被放入該地區。它和存放類執行個體(Instance)的堆地區(Heap)不同,記憶體回收GC(Garbage Collection)不會在主程式運行期對非堆記憶體區(PermGen space)進行清理。
記憶體最佳化
- 建議根據伺服器部署應用程式的實際情況分配,可以通過jconsole工具觀察一下JVM啟動後記憶體的使用方式進而分配;
- 建議將-XX:PermSize與-XX:MaxPermSize值設定為相等。
記憶體溢出
- JVM啟動載入應用程式時,載入class所使用記憶體超出-XX:MaxPermSize,則發生非堆記憶體溢出錯誤(OutOfMemoryError: PermGen space);
- 當-Xmx+-XX:MaxPermSize兩者設定的記憶體超出系統可用實體記憶體時,JVM啟動失敗;
JVM記憶體的異常錯誤
感謝參考:http://blog.csdn.net/thunder0709/article/details/16855195
OutOfMemoryError: Java heap space
記憶體溢出主要存在問題就是出現在這個情況中。當在JVM中如果98%的時間是用於GC且可用的 Heap size 不足2%的時候將拋出此異常資訊。
OutOfMemoryError: PermGen space
這種錯誤常見在web伺服器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm預設的大小,那麼就會產生此錯誤資訊了。如果web app用了大量的第三方jar或者應用有太多的class檔案而恰好MaxPermSize設定較小,超出了也會導致這塊記憶體的佔用過多造成溢出,或者tomcat熱部署時侯不會清理前面載入的環境,只會將context更改為新部署的,非堆存的內容就會越來越多。
OutOfMemoryError: unable to create new native thread
這種現象比較少見,也比較奇怪,主要是和jvm與系統記憶體的比例有關。這種怪事是因為JVM已經被系統分配了大量的記憶體(比如1.5G),並且它至少要佔用可用記憶體的一半。
查看JVM記憶體資訊使用jconsole工具查看JVM運行時記憶體
在window系統安裝JDK包中,有內建的jconsole工具,可以通過jconsole工具鏈接遠程伺服器的JVM執行個體,查看JVM運行時的記憶體。
順便介紹另一個JDK內建的工具jvisualvm,可以使用此工具對JAVA程式進行效能測試,剖析器效能資料等等(具體用法大家自行百度一下)。
順便介紹另一個JDK內建的工具jmc,可以使用此工具遠程監控JVM,運行此工具後主介面有對此工具的介紹”Oracle Java Mission Control 是什嗎?”。
位置:%JAVA_HOME%/bin/jconsole.exe
位置:%JAVA_HOME%/bin/jvisualvm.exe
位置:%JAVA_HOME%/bin/jmc.exe
使用JAVA程式查看JVM運行時記憶體
//最大可用記憶體,對應-Xmx Runtime.getRuntime().maxMemory(); //當前JVM空閑記憶體 Runtime.getRuntime().freeMemory(); //當前JVM佔用的記憶體總數,其值相當於當前JVM已使用的記憶體及freeMemory()的總和Runtime.getRuntime().totalMemory();
配置Tomcat以catalina.sh啟動配置JVM記憶體
綜上,已經說明JVM記憶體的一些注意事情,下面直接描述一下Tomcat通過catalina.sh啟動配置JVM記憶體配置的方法。
備忘:以catalina.sh方式啟動Tomcat的方法【點擊查看】
進入%TOMCAT_HOME%/bin目錄下,找到catalina.sh指令碼。
1、測試一下catalina.sh啟動服務是否正常。
執行下面命令,可以看一下Tomcat一些啟動資訊。
[root@iZ28snxdn5mZ bin]# ./catalina.sh startUsing CATALINA_BASE: /opt/apache/tomcat-8Using CATALINA_HOME: /opt/apache/tomcat-8Using CATALINA_TMPDIR: /opt/apache/tomcat-8/tempUsing JRE_HOME: /usrUsing CLASSPATH: /opt/apache/tomcat-8/bin/bootstrap.jar:/opt/apache/tomcat-8/bin/tomcat-juli.jarTomcat started.[root@iZ28snxdn5mZ bin]# ./catalina.sh stop
2、使用vim編輯器開啟catalina.sh指令碼。在該指令碼執行語句之前追加下面代碼。
JAVA_OPTS="-server -Xms896m -Xmx896m -XX:PermSize=128M -XX:MaxPermSize=128m"
然後重新執行指令碼啟動Tomcat服務。
[root@iZ28snxdn5mZ bin]# ./catalina.sh startUsing CATALINA_BASE: /opt/apache/tomcat-8Using CATALINA_HOME: /opt/apache/tomcat-8Using CATALINA_TMPDIR: /opt/apache/tomcat-8/tempUsing JRE_HOME: /usrUsing CLASSPATH: /opt/apache/tomcat-8/bin/bootstrap.jar:/opt/apache/tomcat-8/bin/tomcat-juli.jarTomcat started.[root@iZ28snxdn5mZ bin]# ps -ef | grep tomcatroot 23795 1 3 20:06 pts/0 00:00:01 /usr/bin/java -Djava.util.logging.config.file=/opt/apache/tomcat-8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -server -Xms896m -Xmx896m -XX:PermSize=128M -XX:MaxPermSize=128m -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dignore.endorsed.dirs= -classpath /opt/apache/tomcat-8/bin/bootstrap.jar:/opt/apache/tomcat-8/bin/tomcat-juli.jar -Dcatalina.base=/opt/apache/tomcat-8 -Dcatalina.home=/opt/apache/tomcat-8 -Djava.io.tmpdir=/opt/apache/tomcat-8/temp org.apache.catalina.startup.Bootstrap startroot 23838 23179 0 20:06 pts/0 00:00:00 grep --color=auto tomcat[root@iZ28snxdn5mZ bin]# ./catalina.sh stopUsing CATALINA_BASE: /opt/apache/tomcat-8Using CATALINA_HOME: /opt/apache/tomcat-8Using CATALINA_TMPDIR: /opt/apache/tomcat-8/tempUsing JRE_HOME: /usrUsing CLASSPATH: /opt/apache/tomcat-8/bin/bootstrap.jar:/opt/apache/tomcat-8/bin/tomcat-juli.jarOpenJDK 64-Bit Server VM warning: ignoring option PermSize=128M; support was removed in 8.0OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0[root@iZ28snxdn5mZ bin]#
備忘:在執行./catalina.sh stop後,日誌提示我們下面兩句話,主要的意思就說在Tomcat 8.0版本開始,不需要在設定-PermSize、-MaxPermSize這兩個參數了。所以在剛剛配置中直接刪掉就可以了。
OpenJDK 64-Bit Server VM warning: ignoring option PermSize=128M; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128m; support was removed in 8.0
配置Tomcat以後台daemon.sh啟動配置JVM記憶體
綜上,已經說明JVM記憶體的一些注意事情,下面直接描述一下Tomcat通過catalina.sh啟動配置JVM記憶體配置的方法。
備忘:以catalina.sh方式啟動Tomcat的方法【點擊查看】
進入%TOMCAT_HOME%/bin目錄下,找到daemon.sh指令碼。
1、測試一下daemon.sh啟動服務是否正常。
執行下面命令,可以看一下Tomcat一些啟動資訊。
備忘:從進程資訊中我們並沒有看到-server -Xms896m -Xmx896m記憶體配置的資訊,也就是說Tomcat的daemon.sh啟動指令碼並沒有繼承catalina.sh指令碼中的配置資訊,所以還需手動為daemon.sh配置JVM記憶體配置參數。
[root@iZ28snxdn5mZ bin]# ./daemon.sh start[root@iZ28snxdn5mZ bin]# ps -ef | grep tomcatroot 23891 1 0 20:14 ? 00:00:00 jsvc.exec -java-home /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre -user www -pidfile /opt/apache/tomcat-8/logs/catalina-daemon.pid -wait 10 -outfile /opt/apache/tomcat-8/logs/catalina-daemon.out -errfile &1 -classpath /opt/apache/tomcat-8/bin/bootstrap.jar:/opt/apache/tomcat-8/bin/commons-daemon.jar:/opt/apache/tomcat-8/bin/tomcat-juli.jar -Djava.util.logging.config.file=/opt/apache/tomcat-8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dignore.endorsed.dirs= -Dcatalina.base=/opt/apache/tomcat-8 -Dcatalina.home=/opt/apache/tomcat-8 -Djava.io.tmpdir=/opt/apache/tomcat-8/temp org.apache.catalina.startup.Bootstrapwww 23892 23891 19 20:14 ? 00:00:01 jsvc.exec -java-home /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre -user www -pidfile /opt/apache/tomcat-8/logs/catalina-daemon.pid -wait 10 -outfile /opt/apache/tomcat-8/logs/catalina-daemon.out -errfile &1 -classpath /opt/apache/tomcat-8/bin/bootstrap.jar:/opt/apache/tomcat-8/bin/commons-daemon.jar:/opt/apache/tomcat-8/bin/tomcat-juli.jar -Djava.util.logging.config.file=/opt/apache/tomcat-8/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dignore.endorsed.dirs= -Dcatalina.base=/opt/apache/tomcat-8 -Dcatalina.home=/opt/apache/tomcat-8 -Djava.io.tmpdir=/opt/apache/tomcat-8/temp org.apache.catalina.startup.Bootstraproot 23934 23179 0 20:14 pts/0 00:00:00 grep --color=auto tomcat[root@iZ28snxdn5mZ bin]#
2、使用vim編輯器開啟daemon.sh指令碼。在該指令碼執行語句之前追加下面代碼。
JAVA_OPTS="-server -Xms896m -Xmx896m"
[root@iZ28snxdn5mZ bin]# vim daemon.sh...
在vim下搜尋JAVA_OPTS=如,在後面配置上JVM記憶體配置參數.
然後儲存退出即可。
停止服務,重新啟動服務。
[root@iZ28snxdn5mZ bin]# ./daemon.sh stop[root@iZ28snxdn5mZ bin]# ./daemon.sh start[root@iZ28snxdn5mZ bin]# ps -ef | grep tomcatroot 23983 1 0 20:22 ? 00:00:00 jsvc.exec -java-home /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre -user www -pidfile /opt/apache/tomcat-8.5.27/logs/catalina-daemon.pid -wait 10 -outfile /opt/apache/tomcat-8.5.27/logs/catalina-daemon.out -errfile &1 -classpath /opt/apache/tomcat-8.5.27/bin/bootstrap.jar:/opt/apache/tomcat-8.5.27/bin/commons-daemon.jar:/opt/apache/tomcat-8.5.27/bin/tomcat-juli.jar -Djava.util.logging.config.file=/opt/apache/tomcat-8.5.27/conf/logging.properties -server -Xms896m -Xmx896m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dignore.endorsed.dirs= -Dcatalina.base=/opt/apache/tomcat-8.5.27 -Dcatalina.home=/opt/apache/tomcat-8.5.27 -Djava.io.tmpdir=/opt/apache/tomcat-8.5.27/temp org.apache.catalina.startup.Bootstrapwww 23984 23983 7 20:22 ? 00:00:01 jsvc.exec -java-home /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-0.b14.el7_4.x86_64/jre -user www -pidfile /opt/apache/tomcat-8.5.27/logs/catalina-daemon.pid -wait 10 -outfile /opt/apache/tomcat-8.5.27/logs/catalina-daemon.out -errfile &1 -classpath /opt/apache/tomcat-8.5.27/bin/bootstrap.jar:/opt/apache/tomcat-8.5.27/bin/commons-daemon.jar:/opt/apache/tomcat-8.5.27/bin/tomcat-juli.jar -Djava.util.logging.config.file=/opt/apache/tomcat-8.5.27/conf/logging.properties -server -Xms896m -Xmx896m -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Dignore.endorsed.dirs= -Dcatalina.base=/opt/apache/tomcat-8.5.27 -Dcatalina.home=/opt/apache/tomcat-8.5.27 -Djava.io.tmpdir=/opt/apache/tomcat-8.5.27/temp org.apache.catalina.startup.Bootstraproot 24026 23179 0 20:22 pts/0 00:00:00 grep --color=auto tomcat[root@iZ28snxdn5mZ bin]#