国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
jvm 堆內(nèi)存 棧內(nèi)存 大小設置 查看堆大小
userphoto

2018.07.20

關注

1、Eclise 中設置jvm內(nèi)存: 修改eclipse的配置文件,對所有工程都起作用

     修改eclipse根目錄下的eclipse.ini文件

     -vmargs  //虛擬機設置

     -Xms40m //初始內(nèi)存

     -Xmx256m //最大內(nèi)存

     -Xmn16m //最小內(nèi)存

     -XX:PermSize=128M //非堆內(nèi)存

     -XX:MaxPermSize=256M

 2、Eclise 中設置jvm內(nèi)存:jres VM Arguments參數(shù)的設置,對所有工程都起作用

     打開eclipse  window-preferences-Java-Installed JREs -Edit-Default VM Arguments   

     在VM自變量中輸入:-Xmx128m -Xms64m -Xmn32m -Xss16m

3、Eclise 中設置jvm內(nèi)存:RunConfigurations  VM arguments參數(shù)設置,只對這個工程起作用

在Eclipse中-->右擊工程/要運行的主類-->Run As-->RunConfigurations-->(x)=Arguments-->VM arguments

中加入 -Xmx36m

然后Apply-->Run
這上面的36指的是給java虛擬機分配的最大堆內(nèi)存大小,單位是MB,也就是說上面的那句話的含義是JVM的最大堆內(nèi)存是36MB

4、Eclise 中設置jvm內(nèi)存:Debug Configurations  VM arguments參數(shù)設置,只對這個工程起作用

在Eclipse中-->右擊工程/要運行的主類-->Debug As-->DebugConfigurations-->(x)=Arguments-->VM arguments

中加入-Xmx36m

然后Apply-->Run
這上面的36指的是給java虛擬機分配的最大堆內(nèi)存大小,單位是MB,也就是說上面的那句話的含義是JVM的最大堆內(nèi)存是36MB

 5、Tomcat內(nèi)存設置

windows下在catalina.bat的第一行增加: 

Java代碼 :set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m  

Linux下在catalina.sh的第一行增加: 

Java代碼 :JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

實例+詳解

設置Tomcat啟動的初始內(nèi)存其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4。

可以利用JVM提供的-Xmn -Xms -Xmx等選項可進行設置

實例,以下給出1G內(nèi)存環(huán)境下Java jvm 的參數(shù)設置參考:

JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "

JAVA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX: NewSize=192m -XX:MaxNewSize=384m"

CATALINA_OPTS="-server -Xms768m -Xmx768m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:NewSize=192m -XX:MaxNewSize=384m"

在/usr/local/apache-tomcat-5.5.23/bin 目錄下的catalina.sh添加:

JAVA_OPTS='-Xms512m -Xmx1024m'要加“m”說明是MB,否則就是KB了,在啟動tomcat時會 報內(nèi)存不足。

-Xms:初始值-Xmx:最大值-Xmn:最小值

Windows:

在catalina.bat最前面加入set JAVA_OPTS=-Xms128m -Xmx350m 

如果用startup.bat啟動tomcat,OK設置生效.夠成功的分配200M內(nèi)存.

但是如果不是執(zhí)行startup.bat啟動tomcat而是利用windows的系統(tǒng)服務啟動tomcat服務,上面的設置就不生效了,就是說set JAVA_OPTS=-Xms128m -Xmx350m 沒起作用.上面分配200M內(nèi)存就OOM了..

windows服務執(zhí)行的是bin\tomcat.exe.他讀取注冊表中的值,而不是catalina.bat的設置.

解決辦法:

修改注冊表HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Tomcat Service Manager\Tomcat5\Parameters\JavaOptions

原值為-Dcatalina.home="C:\ApacheGroup\Tomcat 5.0"-Djava.endorsed.dirs="C:\ApacheGroup\Tomcat 5.0\common\endorsed"-Xrs加入 -Xms300m -Xmx350m 

重起tomcat服務,設置生效



Tomcat 的JVM 內(nèi)存溢出問題的解決關鍵字: tomcat 的jvm 內(nèi)存溢出問題的解決 


最近在熟悉一個開發(fā)了有幾年的項目,需要把數(shù)據(jù)庫MySQL移植到Oracle,首先把jdbc的連接指向mysql,打包放到tomcat里面,可以跑起來,沒有問題,可是當把jdbc連接指向oracle的時候,tomcat就連續(xù)拋java.lang.OutOfMemoryError的錯誤,上網(wǎng)google了一下,了解了一下tomcat的運行機制,也解決了問題,share出來,以備查。 

1、首先是:java.lang.OutOfMemoryError: java heap space 解釋:

Heap size 設置 JVM堆的設置是指java程序運行過程中JVM可以調(diào)配使用的內(nèi)存空間的設置.JVM在啟動的時候會自動設置Heap size的值,其初始空間(即-Xms)是物理內(nèi)存的1/64,最大空間(-Xmx)是物理內(nèi)存的1/4??梢岳肑VM提供的-Xmn -Xms -Xmx等選項可進行設置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。 

提示:在JVM中如果98%的時間是用于GC且可用的Heap size 不足2%的時候?qū)伋龃水惓P畔ⅰ?nbsp;

提示:Heap Size 最大不要超過可用物理內(nèi)存的80%,一般的要將-Xms和-Xmx選項設置為相同,而-Xmn為1/4的-Xmx值。 

解決方法:

手動設置Heap size 修改TOMCAT_HOME/bin/catalina.bat,在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行:

Java代碼 set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m

或修改catalina.sh 在“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m" 

2、其次是:java.lang.OutOfMemoryError: PermGen space 原因:

PermGen space的全稱是Permanent Generation space,是指內(nèi)存的永久保存區(qū)域,這塊內(nèi)存主要是被JVM存放Class和Meta信息的,Class在被Loader時就會被放到PermGen space中,它和存放類實例(Instance)的Heap區(qū)域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的應用中有很CLASS的話,就很可能出現(xiàn)PermGen space錯誤,這種錯誤常見在web服務器對JSP進行pre compile的時候。如果你的WEB APP下都用了大量的第三方jar, 其大小超過了jvm默認的大小(4M)那么就會產(chǎn)生此錯誤信息了。 

解決方法:

1. 手動設置MaxPermSize大小 修改TOMCAT_HOME/bin/catalina.bat(Linux下為catalina.sh),在Java代碼 “echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m

catalina.sh下為: Java代碼 JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"


下面給出各種可以用戶設置堆大小的命令行參數(shù)。注釋列提供了一些設置參數(shù)的初級或高級建議。此外,后面還會給出更多的詳細建議。

參數(shù)描述注釋
-Xms<size>設置堆的最小值在生產(chǎn)階段,最小和最大堆值設置為相同的值
-Xmx<size>設置堆的最大值 
-XX:NewSize=<size>設置年輕代的最小值在生產(chǎn)階段,最小和最大年輕代的值設為相同的值
-XX:MaxNewSize=<size>設置年輕代的最大值 
-XX:NewRatio=<number>設置年輕代和年老代的大小比例。例如,數(shù)值為2時
年老代將會是年輕代大小的2倍。
使用NewSize/MaxNewSize參數(shù)或NewRatio參數(shù),但不要兩個參數(shù)都使用
-XX:SurvivorRatio=<number>設置eden space和剩余空間的大小比例。例如,剩余空間比例為8時,eden space是任一剩余空間大小的8倍。基于年輕代大小改變比例。比例值為8適用于
小的年輕代(如10M),32適用于比較大的年輕代(如100M)。
-XX:MaxTenuringThreshold=<number>表示一個對象在被自動放置于年老代之前必須存活的次要回收的次數(shù)一般應該使用的值為32
-XX:MaxPermSizse=<size>設置永久代的大小在用完空間后在設置永久代
-XX:+UserTLAB在eden space里給應用程序的每一個線程提供它自己的分配區(qū)域(線程本地分配塊TLAB)。注意它是一個布爾型選項,
用plus(+)可以啟動它,用minus(-)(-XX:-UseTLAB)可以禁用它
主要對多處理器系統(tǒng)有利
-XX:TLABSize=<size>每一個TLAB的大小確保年輕代空間足夠為應用程序里的每一個線程保存所有的TLAB。應該分別使用64KB、128KB和256KB進行嘗試

注意:1.<size>是一個表示字節(jié)數(shù)量的浮點數(shù),在其后面加上K、M、G后綴分別代表KB、MB、GB。

            2.<number>是一個浮點數(shù)。


  1. 堆大小設置
    JVM 中最大堆大小有三方面限制:相關操作系統(tǒng)的數(shù)據(jù)模型(32-bt還是64-bit)限制;系統(tǒng)的可用虛擬內(nèi)存限制;系統(tǒng)的可用物理內(nèi)存限制。32位系統(tǒng)下,一般限制在1.5G~2G;64為操作系統(tǒng)對內(nèi)存無限制。我在Windows Server 2003 系統(tǒng),3.5G物理內(nèi)存,JDK5.0下測試,最大可設置為1478m。
    典型設置:
    • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
      -
      Xmx3550m:設置JVM最大可用內(nèi)存為3550M。
      -Xms3550m
      :設置JVM促使內(nèi)存為3550m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。
      -Xmn2g
      :設置年輕代大小為2G。整個JVM內(nèi)存大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8。
      -Xss128k
      :設置每個線程的堆棧大小。JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。更具應用的線程所需內(nèi)存大小進行調(diào)整。在相同物理內(nèi)存下,減小這個值能生成更多的線程。但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗值在3000~5000左右。
    • java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0
      -XX:NewRatio=4
      :設置年輕代(包括Eden和兩個Survivor區(qū))與年老代的比值(除去持久代)。設置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5
      -XX:SurvivorRatio=4
      :設置年輕代中Eden區(qū)與Survivor區(qū)的大小比值。設置為4,則兩個Survivor區(qū)與一個Eden區(qū)的比值為2:4,一個Survivor區(qū)占整個年輕代的1/6
      -XX:MaxPermSize=16m:設置持久代大小為16m。
      -XX:MaxTenuringThreshold=0:設置垃圾最大年齡。如果設置為0的話,則年輕代對象不經(jīng)過Survivor區(qū),直接進入年老代。對于年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區(qū)進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。
  2. 回收器選擇
    JVM給了三種選擇:串行收集器、并行收集器、并發(fā)收集器,但是串行收集器只適用于小數(shù)據(jù)量的情況,所以這里的選擇主要針對并行收集器和并發(fā)收集器。默認情況下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在啟動時加入相應參數(shù)。JDK5.0以后,JVM會根據(jù)當前系統(tǒng)配置進行判斷。
    1. 吞吐量優(yōu)先的并行收集器
      如上文所述,并行收集器主要以到達一定的吞吐量為目標,適用于科學技術(shù)和后臺處理等。
      典型配置
      • java -Xmx3800m -Xms3800m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
        -XX:+UseParallelGC
        :選擇垃圾收集器為并行收集器。此配置僅對年輕代有效。即上述配置下,年輕代使用并發(fā)收集,而年老代仍舊使用串行收集。
        -XX:ParallelGCThreads=20
        :配置并行收集器的線程數(shù),即:同時多少個線程一起進行垃圾回收。此值最好配置與處理器數(shù)目相等。
      • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
        -XX:+UseParallelOldGC
        :配置年老代垃圾收集方式為并行收集。JDK6.0支持對年老代并行收集。
      • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100
        -XX:MaxGCPauseMillis=100
        :設置每次年輕代垃圾回收的最長時間,如果無法滿足此時間,JVM會自動調(diào)整年輕代大小,以滿足此值。
      • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy
        -XX:+UseAdaptiveSizePolicy
        :設置此選項后,并行收集器會自動選擇年輕代區(qū)大小和相應的Survivor區(qū)比例,以達到目標系統(tǒng)規(guī)定的最低相應時間或者收集頻率等,此值建議使用并行收集器時,一直打開。
    2. 響應時間優(yōu)先的并發(fā)收集器
      如上文所述,并發(fā)收集器主要是保證系統(tǒng)的響應時間,減少垃圾收集時的停頓時間。適用于應用服務器、電信領域等。
      典型配置
      • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
        -XX:+UseConcMarkSweepGC:設置年老代為并發(fā)收集。測試中配置這個以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此時年輕代大小最好用-Xmn設置。
        -XX:+UseParNewGC:設置年輕代為并行收集??膳cCMS收集同時使用。JDK5.0以上,JVM會根據(jù)系統(tǒng)配置自行設置,所以無需再設置此值。
      • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
        -XX:CMSFullGCsBeforeCompaction:由于并發(fā)收集器不對內(nèi)存空間進行壓縮、整理,所以運行一段時間以后會產(chǎn)生“碎片”,使得運行效率降低。此值設置運行多少次GC以后對內(nèi)存空間進行壓縮、整理。
        -XX:+UseCMSCompactAtFullCollection:打開對年老代的壓縮。可能會影響性能,但是可以消除碎片
  3. 輔助信息
    JVM提供了大量命令行參數(shù),打印信息,供調(diào)試使用。主要有以下一些:
    • -XX:+PrintGC
      輸出形式:[GC 118250K->113543K(130112K), 0.0094143 secs]

                      [Full GC 121376K->10414K(130112K), 0.0650971 secs]

    • -XX:+PrintGCDetails
      輸出形式:[GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]

                      [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]

    • -XX:+PrintGCTimeStamps -XX:+PrintGC:PrintGCTimeStamps可與上面兩個混合使用
      輸出形式:11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
    • -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中斷的執(zhí)行時間。可與上面混合使用
      輸出形式:Application time: 0.5291524 seconds
    • -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期間程序暫停的時間??膳c上面混合使用
      輸出形式:Total time for which application threads were stopped: 0.0468229 seconds
    • -XX:PrintHeapAtGC:打印GC前后的詳細堆棧信息
      輸出形式:
      34.702: [GC {Heap before gc invocations=7:
       def new generation   total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000)
      eden space 49152K,  99% used [0x1ebd0000, 0x21bce430, 0x21bd0000)
      from space 6144K,  55% used [0x221d0000, 0x22527e10, 0x227d0000)
        to   space 6144K,   0% used [0x21bd0000, 0x21bd0000, 0x221d0000)
       tenured generation   total 69632K, used 2696K [0x227d0000, 0x26bd0000, 0x26bd0000)
      the space 69632K,   3% used [0x227d0000, 0x22a720f8, 0x22a72200, 0x26bd0000)
       compacting perm gen  total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
         the space 8192K,  35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
          ro space 8192K,  66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
          rw space 12288K,  46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
      34.735: [DefNew: 52568K->3433K(55296K), 0.0072126 secs] 55264K->6615K(124928K)Heap after gc invocations=8:
       def new generation   total 55296K, used 3433K [0x1ebd0000, 0x227d0000, 0x227d0000)
      eden space 49152K,   0% used [0x1ebd0000, 0x1ebd0000, 0x21bd0000)
        from space 6144K,  55% used [0x21bd0000, 0x21f2a5e8, 0x221d0000)
        to   space 6144K,   0% used [0x221d0000, 0x221d0000, 0x227d0000)
       tenured generation   total 69632K, used 3182K [0x227d0000, 0x26bd0000, 0x26bd0000)
      the space 69632K,   4% used [0x227d0000, 0x22aeb958, 0x22aeba00, 0x26bd0000)
       compacting perm gen  total 8192K, used 2898K [0x26bd0000, 0x273d0000, 0x2abd0000)
         the space 8192K,  35% used [0x26bd0000, 0x26ea4ba8, 0x26ea4c00, 0x273d0000)
          ro space 8192K,  66% used [0x2abd0000, 0x2b12bcc0, 0x2b12be00, 0x2b3d0000)
          rw space 12288K,  46% used [0x2b3d0000, 0x2b972060, 0x2b972200, 0x2bfd0000)
      }
      , 0.0757599 secs]
    • -Xloggc:filename:與上面幾個配合使用,把相關日志信息記錄到文件以便分析。
  4. 常見配置匯總
    1. 堆設置
      • -Xms:初始堆大小
      • -Xmx:最大堆大小
      • -XX:NewSize=n:設置年輕代大小
      • -XX:NewRatio=n:設置年輕代和年老代的比值。如:為3,表示年輕代與年老代比值為1:3,年輕代占整個年輕代年老代和的1/4
      • -XX:SurvivorRatio=n:年輕代中Eden區(qū)與兩個Survivor區(qū)的比值。注意Survivor區(qū)有兩個。如:3,表示Eden:Survivor=3:2,一個Survivor區(qū)占整個年輕代的1/5
      • -XX:MaxPermSize=n:設置持久代大小
    2. 收集器設置
      • -XX:+UseSerialGC:設置串行收集器
      • -XX:+UseParallelGC:設置并行收集器
      • -XX:+UseParalledlOldGC:設置并行年老代收集器
      • -XX:+UseConcMarkSweepGC:設置并發(fā)收集器
    3. 垃圾回收統(tǒng)計信息
      • -XX:+PrintGC
      • -XX:+PrintGCDetails
      • -XX:+PrintGCTimeStamps
      • -Xloggc:filename
    4. 并行收集器設置
      • -XX:ParallelGCThreads=n:設置并行收集器收集時使用的CPU數(shù)。并行收集線程數(shù)。
      • -XX:MaxGCPauseMillis=n:設置并行收集最大暫停時間
      • -XX:GCTimeRatio=n:設置垃圾回收時間占程序運行時間的百分比。公式為1/(1+n)
    5. 并發(fā)收集器設置
      • -XX:+CMSIncrementalMode:設置為增量模式。適用于單CPU情況。
      • -XX:ParallelGCThreads=n:設置并發(fā)收集器年輕代收集方式為并行收集時,使用的CPU數(shù)。并行收集線程數(shù)。


四、調(diào)優(yōu)總結(jié)

  1. 年輕代大小選擇
    • 響應時間優(yōu)先的應用盡可能設大,直到接近系統(tǒng)的最低響應時間限制(根據(jù)實際情況選擇)。在此種情況下,年輕代收集發(fā)生的頻率也是最小的。同時,減少到達年老代的對象。
    • 吞吐量優(yōu)先的應用:盡可能的設置大,可能到達Gbit的程度。因為對響應時間沒有要求,垃圾收集可以并行進行,一般適合8CPU以上的應用。
  2. 年老代大小選擇
    • 響應時間優(yōu)先的應用:年老代使用并發(fā)收集器,所以其大小需要小心設置,一般要考慮并發(fā)會話率會話持續(xù)時間等一些參數(shù)。如果堆設置小了,可以會造成內(nèi)存碎片、高回收頻率以及應用暫停而使用傳統(tǒng)的標記清除方式;如果堆大了,則需要較長的收集時間。最優(yōu)化的方案,一般需要參考以下數(shù)據(jù)獲得:
      • 并發(fā)垃圾收集信息
      • 持久代并發(fā)收集次數(shù)
      • 傳統(tǒng)GC信息
      • 花在年輕代和年老代回收上的時間比例
      減少年輕代和年老代花費的時間,一般會提高應用的效率
    • 吞吐量優(yōu)先的應用:一般吞吐量優(yōu)先的應用都有一個很大的年輕代和一個較小的年老代。原因是,這樣可以盡可能回收掉大部分短期對象,減少中期的對象,而年老代盡存放長期存活對象。
  3. 較小堆引起的碎片問題
    因為年老代的并發(fā)收集器使用標記、清除算法,所以不會對堆進行壓縮。當收集器回收時,他會把相鄰的空間進行合并,這樣可以分配給較大的對象。但是,當堆空間較小時,運行一段時間以后,就會出現(xiàn)“碎片”,如果并發(fā)收集器找不到足夠的空間,那么并發(fā)收集器將會停止,然后使用傳統(tǒng)的標記、清除方式進行回收。如果出現(xiàn)“碎片”,可能需要進行如下配置:
    • -XX:+UseCMSCompactAtFullCollection:使用并發(fā)收集器時,開啟對年老代的壓縮。
    • -XX:CMSFullGCsBeforeCompaction=0:上面配置開啟的情況下,這里設置多少次Full GC后,對年老代進行壓縮

1.在eclipse設置JVM參數(shù)
     打開eclipse-窗口-首選項-Java-已安裝的JRE(對在當前開發(fā)環(huán)境中運行的java程序皆生效,也就是在eclipse中運行的java程序)編輯當前使用的JRE,在缺省VM參數(shù)中輸入

     -Xmx1024m -Xms1024m -Xmn256m -Xss16m 

     或者在運行一個java程序的時候執(zhí)行:

     java -Xmx1024m -Xms1024m -Xmn256m -Xss16m  Test 

     Test是一個class文件。

 

2. 在Tomcat服務器上設置JVM參數(shù)

      set CATALINA_OPTS=-Xmx512m -Xms512m -Xmn64m -Xss2m  或者

      set JAVA_OPTS=-Xmx512m -Xms512m -Xmn64m -Xss2m

      設置CATALINA_OPTS 和  JAVA_OPTS都是一個道理,在啟動tomcat的時候設置參數(shù)。

      兩者區(qū)別是JAVA_OPTS在tomcat停止的時候也會執(zhí)行這個命令。

 

注意:Tomcat分為安裝版(*.exe)和非安裝版或者解壓版(*.zip),個人還是比較喜歡解壓版。兩者雖然在功能上沒有什么區(qū)別,但是在設置上還是有要注意的地方。這里只談JVM設置要注意的地方。

     安裝版:windows的服務會有一個tomcat服務,當啟動服務的時候Tomcat會從注冊表讀取JVM的參數(shù)。也就是說當在tomcat的lib文件夾下catalina.bat或者startup.bat中設置JVM參數(shù)是無效的。解決辦法:設置tomcat的注冊表;或者使用startup.bat啟動tomcat。

    解壓版:當點擊startup.bat時,它會讀取catalina.bat中的配置,不管在startup.bat文件還是在catalina.bat文件中設置JVM參數(shù),都會讀取JVM參數(shù)。


3.  查看堆的大小

     在程序中查看,返回值單位是字節(jié),當然還有其他JVM參數(shù)可以查看。

     Runtime.getRuntime().maxMemory(); 


     或者在命令行 執(zhí)行jvisualvm 命令

     或者%java_home%\bin 目錄下點擊jvisualvm.exe

 

     或者在命令行執(zhí)行jconsole 命令

     或者%java_home%\bin 目錄下點擊jconsole.exe

 

4. java內(nèi)存可以分為堆內(nèi)存和非堆內(nèi)存

      堆和非堆:堆是給開發(fā)人員用的,是在JVM啟動時創(chuàng)建; 非堆是留給JVM自己用的,用來存放類型(類和接口)的信息。它和堆不同,運行期內(nèi)GC不會釋放空間。如果web app用了大量的第三方jar或者應用有太多的class文件而恰好MaxPermSize設置較小,超出了也會導致這塊內(nèi)存的占用過多造成溢出,或者 tomcat熱部署時侯不會清理前面加載的環(huán)境,只會將context更改為新部署的,非堆存的內(nèi)容就會越來越多,熱部署上幾次就java.lang.OutOfMemoryError: PermGen space .

       ---- 堆內(nèi)存設置:程序可以到達的,可以操作的
       -Xms 初始堆內(nèi)存 默認物理內(nèi)存1/64,也是最小分配堆內(nèi)存。當空余堆內(nèi)存小于40%時,會增加到-Xms的最大限制 

       -Xmx 最大堆內(nèi)存分配 默認物理內(nèi)存1/4,當空余堆內(nèi)存大于70%時,會減小到-Xms的最小限制。
       一般設置 -Xms和Xms大小相等

 

       ---- 非堆內(nèi)存設置
      -XX:PermSize 非堆內(nèi)存的初始值,默認物理內(nèi)存的1/64 ,也是最小非堆內(nèi)存。
      -XX:MaxPermSize 非堆內(nèi)存最大值,默認物理內(nèi)存的1/4,


5. 典型JVM參數(shù)設置:

      java -Xmx128m -Xms128m -Xmn64m -Xss1m

      -Xmx128m:設置JVM最大可用內(nèi)存為128M。

      -Xms128m:設置JVM最小內(nèi)存為128m。此值可以設置與-Xmx相同,以避免每次垃圾回收完成后JVM重新分配內(nèi)存。

      -Xmn2g:設置年輕代大小為2G。整個堆大小=年輕代大小 + 年老代大小 + 持久代大小。持久代一般固定大小為64m,所以增大年輕代后,將會減小年老代大小。此值對系統(tǒng)性能影響較大,Sun官方推薦配置為整個堆的3/8。

      -Xss128k:設置每個線程的堆棧大小。 JDK5.0以后每個線程堆棧大小為1M,以前每個線程堆棧大小為256K。根據(jù)應用的線程所需內(nèi)存大小進行調(diào)整。在相同物理內(nèi)存下,減小這個值能生成更 多的線程。但是操作系統(tǒng)對一個進程內(nèi)的線程數(shù)還是有限制的,不能無限生成,經(jīng)驗值在3000~5000左右。

 

      -- Ratio 英音:['reiseu] 比率
      -- Eden 伊甸
      -- Survivor 幸存者

      java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

      -XX:NewRatio=4:設置年輕代(包括Eden和兩個Survivor區(qū))與年老代的比值(除去持久代)。設置為4,則年輕代與年老代所占比值為1:4,年輕代占整個堆棧的1/5

      -XX:SurvivorRatio=4:設置年輕代中Eden區(qū)與Survivor區(qū)的大小比值。設置為4,則兩個Survivor區(qū)與一個Eden區(qū)的比值為2:4,一個Survivor區(qū)占整個年輕代的1/6

      -XX:MaxPermSize=16m:設置持久代大小為16m。

      -XX:MaxTenuringThreshold=0:設置垃圾最大年齡。如果設置為0的話,則年輕代對象不經(jīng)過Survivor區(qū),直接進入年老代。
    對于年老代比較多的應用,可以提高效率。如果將此值設置為一個較大值,則年輕代對象會在Survivor區(qū)進行多次復制,這樣可以增加對象再年輕代的存活時間,增加在年輕代即被回收的概論。


本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Tomcat 調(diào)優(yōu)及 JVM 參數(shù)優(yōu)化
Tomcat中JVM內(nèi)存溢出及合理配置及maxThreads如何配置
linux解決Tomcat內(nèi)存溢出
tomcat設置jvm參數(shù)
java.lang.OutOfMemoryError: Java heap space
Java虛擬機(JVM)中的內(nèi)存設置詳解
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服