1、JVM優化
tomcat出現java.lang.OutOfMemoryError
內存溢出,有兩種
一、java.lang.OutOfMemoryError: PermGen space
PermGen space
指的是內存的永久保存區域,也稱”永久代”,用於存儲虛擬機(JVM)加載的類(class)信息、常量、靜態變量、是各個線程共享的內存區域。
類在被載入(Loader)時就被放到該區中。GC(Garbage Collection垃圾回收機制)不會在主程序運行期對該區進行清理。所以如果程序中有很多類的話,就很可能出現java.lang.OutOfMemoryError: PermGen space錯誤。
原因是其大小超過了jvm設置默認的大小(不同JVM默認值不盡相同,網上常說的默認最小值爲16MB,最大值爲64MB),那麼就會產生此錯誤信息了。
-XX:PermSize=512m -XX:MaxPermSize=1024m
二、java.lang.OutOfMemoryError: Java heap space
Heap space是指堆區,在JVM中如果**98%的時間是用於GC且可用的 Heap size 不足2%**的時候將拋出此異常信息。
JVM堆的設置是指java程序運行過程中JVM可以調配使用的內存空間的設置.
默認其初始空間(即-Xms)是物理內存的1/64,最大空間(-Xmx)是物理內存的1/4。
可以利用JVM提供的-Xmn -Xms -Xmx
等選項可進行設置。
提示:Heap Size 最大不要超過可用物理內存的80%,一般的要將-Xms和-Xmx選項設置爲相同,而-Xmn爲1/4的-Xmx值。
Linux下修改Tomcat jvm內存大小
bin/catalina.sh
,位於cygwin=false
前
JAVA_OPTS="-Xms1024m -Xmx1024m -Xss512K -XX:PermSize=256m -XX:MaxPermSize=256m"
windows下修改Tomcat jvm內存大小
通過bin/catalina.bat啓動
在
rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"
後添加
set JAVA_OPTS=-Xms1024m -Xmx1024m -Xss512K -XX:PermSize=256M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true
各參數含義
-Xmx Java Heap最大值,默認值爲物理內存的1/4;
-Xms Java Heap初始值,Server端JVM最好將-Xms和-Xmx設爲相同值,開發測試機JVM可以保留默認值;
-Xmn Java Heap Young區大小,不熟悉最好保留默認值;
-Xss 每個線程的Stack大小,不熟悉最好保留默認值;
-XX:PermSize:設定內存的永久保存區域;
-XX:MaxPermSize:設定最大內存的永久保存區域;
-XX:PermSize:設定內存的永久保存區域;
-XX:NewSize:設置JVM堆的‘新生代’的默認大小;
2、字符集配置優化
2.1、控制檯會出現中文亂碼
在conf/logging.properties
#java.util.logging.ConsoleHandler.encoding = UTF-8
修改爲
java.util.logging.ConsoleHandler.encoding = GBK
2.2、get請求參數中文亂碼
在conf/server.xml
#增加URIEncoding="UTF-8"
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="UTF-8" />
2.3、URL特殊字符過濾
URL中有特殊字符如大括號{},^等tomcat會返回400錯誤
在conf/catalina.properties
tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}