在 tomcat 配置文件 tomcat/bin/catalina.sh 中 配置 JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=1024m"。在配置文件第一行進行配置。
注意:-server 一定要作為第一個參數,在多個CPU時性能佳。
-Xms2048m:設置JVM初始分配的堆內存為2048m,初始Heap大小,使用的最小內存,cpu性能高時此值應設的大一些,cpu性能高時此值應設的大一些。默認是物理內存的1/64
-Xmx4096m:設置JVM最大可用堆內存為4096M,java heap最大值,使用的最大內存。默認是物理內存的1/4
上面兩個值是分配JVM的最小和最大內存,取決於硬件物理內存的大小,建議均設為物理內存的一半。
-Xss1024k :設置每個線程的堆棧大小為1024K。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K.更具應用的線程所需內存大小進行 調整.在相同物理內存下,減小這個值能生成更多的線程.但是操作系統對一個進程內的線程數還是有限制的,不能無限生成,經驗值在3000~5000左右.
-XX:PermSize=512m:設置非堆區初始內存分配大小為512m,其縮寫為 permanent size(持久化內存),設定內存的永久保存區域。
-XX:MaxPermSize=512m:設置JVM最大允許分配的非堆內存最大上限為512m,設定最大內存的永久保存區域。默認是物理內存的1/4
-Xss 15120 這使得JBoss每增加一個線程(thread)就會立即消耗15M內存,而最佳值應該是128K,默認值好像是512k.
+XX:AggressiveHeap 會使得 Xms沒有意義。這個參數讓jvm忽略Xmx參數,瘋狂地吃完一個G物理內存,再吃盡一個G的swap。
-Xss 每個線程的Stack大小
-verbose:gc 現實垃圾收集信息
-Xloggc:gc.log 指定垃圾收集日志文件
-Xmn young generation的 heap 大小,一般設置為Xmx的3、4分之一
-XX:+UseParNewGC 縮短minor收集的時間
-XX:+UseConcMarkSweepGC 縮短major收集的時間,提示:此選項在Heap Size 比較大而且Major收集時間較長的情況下使用更合適
堆內存分配
JVM初始分配的內存由-Xms指定,默認是物理內存的1/64;JVM最大分配的內存由-Xmx指定,默認是物理內存的1/4。默認空余堆內存小於40%時,JVM就會增大堆直到-Xmx的最大限制;空余堆內存大於70%時,JVM會減少堆直到-Xms的最小限制。因此服務器一般設置-Xms、-Xmx相等以避免在每次GC 后調整堆的大小。
非堆內存分配
JVM使用-XX:PermSize設置非堆內存初始值,默認是物理內存的1/64;由XX:MaxPermSize設置最大非堆內存的大小,默認是物理內存的1/4。
注意:
通過上面對JVM內存管理的介紹我們已經了解到JVM內存包含兩種:堆內存和非堆內存,另外JVM最大內存首先取決於實際的物理內存和操作系統。所以說設置VM參數導致程序無法啟動主要有以下幾種原因:
1) 參數中-Xms的值大於-Xmx,或者-XX:PermSize的值大於-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的總和超過了JVM內存的最大限制,比如當前操作系統最大內存限制,或者實際的物理內存等等。說到實際物理內存這里需要說明一點的是,如果你的內存是1024MB,但實際系統中用到的並不可能是1024MB,因為有一部分被硬件占用了。