JVM配置說明:
注:基於java應用的JVM配置
JVM:

備注:全局數據區,目的為了節省內存空間,避免所有new的對象中共同屬性都開辟內存空間
因為堆和棧是動態分配內存空間的,所有配置JVM就是基於堆棧內存空間的分配。
配置JVM的位置:
Linux:在tomcat下的bin/catalina.sh文件中配置。
1、vim catalina.sh
2、在大致106行的位置添加如下內容:(因為106行左右都是配置信息,所有將配置信息同一放到該處)
"JAVA_OPTS"="-server -Xmx500m -Xms500m -Xmn200m -XX:MaxPermSize=256m -XX:PermSize=256m -XX:SurvivorRatio=6"
說明:
-Xmx500m 表示整個堆最大的內存 官方推薦是物理內存的1/4
-Xms500m 表示堆初始化的內存 官方推薦是物理內存的1/64
注:
1、堆內存分配時,根據啟動服務器之后,系統剩余的內存來分配。(總內存 - 系統啟動占用內存)
2、JVM內存是從物理內存借用的,tomcat啟動成功,即表示JVM從物理內存分配也成功。
-Xmn200m 表示新生代內存 推薦分配整個堆的3/8
新生代分三個區:
eden區、s0交換區、s1交換區(這兩個交換區總有一個是空的,采用的是復制算法)
即:-Xmn = eden + s0 + s1 (三個內存相加等於新生代的內存)
新生代三個區的內存分配:
通過-XX:SurvivorRatio參數來指定eden區和交換區的內存占比。
例如:-Xmn200m -XX:SurvivorRatio=6 那么eden區占新生代的內存的6份 即 120m ,交換區占新生代的內存的4份 即80m(分配到每個交換區就是s0 占40m,s1 占40m)
默認的eden區和交換區的占比為8,即-XX:SurvivorRatio=8
老年代的內存大小:
堆最大內存 - 新生代內存 = 老年代內存 (所有只需要配置新生代內存即可)
注:比較好的堆內存配置方式,將堆最大內存和初始化內存配置成一樣的!
原因:
避免當超出初始化配置的內存后,向物理內存中申請內存。
當申請的時候:
1、物理內存此時不夠,代碼產生的數據不能存入到JVM,程序報錯。
2、物理內存此時夠,從申請內存,到拿到內存,然后將數據存儲到JVM,都會有效率影響。
-XX:PermSize=256 表示棧初始化內存 官方推薦是物理內存的1/64
-XX:MaxPermSize=256 表示最大占內存 官方推薦是物理內存的1/4
注:比較好的棧內存配置方式,將棧最大內存和初始化內存配置成一樣的!
原因:
避免當超出初始化配置的內存后,向物理內存中申請內存。
當申請的時候:
1、物理內存此時不夠,對象引用就不能存放到棧中,程序報錯。
2、物理內存此時夠,從申請內存,到拿到內存,然后將引用存儲到棧中,影響效率。
注:棧中一般存放的都是對象堆中的地址引用,所有占用內存相對比較小,所有節省內存的情況下,可以只給棧內存分配256m或者128m。
堆內存的分配情況查看:
1、通過上述方式配置JVM。
2、啟動tomcat。
3、通過jps 或者ps -ef | grep java 獲取java進程的id ---->pid
4、通過jmap -heap pid 查看堆內存分配情況,如圖:

JVM參數說明:

並發收集器相關參數:

CMS相關參數:


輔助參數:

