淺談JVM堆內(nèi)存空間調(diào)整

? 實(shí)際上每一塊自內(nèi)存區(qū)中都會(huì)有存在一部分的可變伸縮區(qū),其基本流程:如果空間不足了,則在可變的范圍之內(nèi)擴(kuò)大內(nèi)存空間,當(dāng)一段時(shí)間之后發(fā)現(xiàn)內(nèi)存空間沒有那么緊張的時(shí)候,再將可變空間進(jìn)行釋放。

1、堆內(nèi)存空間調(diào)整參數(shù)表
No. 參數(shù)名稱 描述
01 -Xms 設(shè)置初始分配大小,默認(rèn)為物理內(nèi)存的"1/64"
02 -Xmx 最大分配內(nèi)存,默認(rèn)為物理內(nèi)存的"1/4"
03 -XX:+PrintGCDetails 輸出詳細(xì)的GC處理日志
04 -XX:+PrintGCTimeStamps 輸出GC的時(shí)間戳信息
05 -XX:+PrintGCDateStamps 輸出GC時(shí)間戳信息(以日期的形式,如2018-04-04T16:53:16.155+0800:)
06 -XX:+PrintHeapAtGC 在GC進(jìn)行處理的前后打印堆內(nèi)存信息
07 -Xloggc:保存路徑 設(shè)置日志信息保存文件

? 在整個(gè)堆內(nèi)存的調(diào)整策略之中,有經(jīng)驗(yàn)的人基本上都只會(huì)調(diào)整兩個(gè)參數(shù):"-Xmx"(最大內(nèi)存)、"-Xms"(初始化內(nèi)存)。
? 如果要想取得這些內(nèi)存的整體信息直接利用Runtime類即可

package demo;

/**
 * Created by  on 2018/4/4.
 */
public class TestDemo {

    public static void main(String[] args){
        Runtime runtime = Runtime.getRuntime();
        long maxMemory = runtime.maxMemory(); // 最大內(nèi)存
        long totalMemory = runtime.totalMemory(); // 默認(rèn)使用總內(nèi)存
        System.out.println("最大內(nèi)存數(shù):"+maxMemory+"字節(jié)、"+(maxMemory/(double)1024/1024)+"MB");
        System.out.println("默認(rèn)使用總內(nèi)存:"+totalMemory+"字節(jié)、"+(totalMemory/(double)1024/1024)+"MB");
    }
}
  • 根據(jù)本機(jī)內(nèi)存大小不同而定

最大內(nèi)存數(shù):1908932608字節(jié)、1820.5MB
使用總內(nèi)存:128974848字節(jié)、123.0MB

發(fā)現(xiàn)默認(rèn)的情況下分配的內(nèi)存是總內(nèi)存的"1/4"、而初始化的內(nèi)存為"1/64";那么也就是說整個(gè)內(nèi)存空間的可變范圍(伸縮區(qū)):123.0MB~1820.5MB之間,那么現(xiàn)在就可能造成程序的性能下降。

java -Xmx2G -Xms2G TestDemo

那么這個(gè)時(shí)候要避免伸縮區(qū)的可調(diào)策略,在執(zhí)行程序時(shí)添加如下命令,將初始大小內(nèi)存與最大可用內(nèi)存大小設(shè)置為一致,從而提升整個(gè)程序的性能。

  • 范例:觀察GC詳細(xì)日志
java -Xmx2G -Xms2G -XX:+PrintGCDetails TestDemo

最大內(nèi)存數(shù):2058354688字節(jié)、1963.0MB
默認(rèn)使用總內(nèi)存:2058354688字節(jié)、1963.0MB
Heap
PSYoungGen total 611840K, used 41984K [0x0000000795580000, 0x00000007c0000000, 0x00000007c0000000)
eden space 524800K, 8% used [0x0000000795580000,0x0000000797e801b8,0x00000007b5600000)
from space 87040K, 0% used [0x00000007bab00000,0x00000007bab00000,0x00000007c0000000)
to space 87040K, 0% used [0x00000007b5600000,0x00000007b5600000,0x00000007bab00000)
ParOldGen total 1398272K, used 0K [0x0000000740000000, 0x0000000795580000, 0x0000000795580000)
object space 1398272K, 0% used [0x0000000740000000,0x0000000740000000,0x0000000795580000)
Metaspace used 2774K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 295K, capacity 386K, committed 512K, reserved 1048576K

? 下面再編寫一個(gè)代碼,觀察GC的觸發(fā)操作。

  • 范例:測(cè)試GC處理
package demo;

import java.util.Random;

/**
 * Created by on 2018/4/4.
 */
public class TestDemo {

    public static void main(String[] args){
        Random random = new Random();
        String  val = "test";
        while (true){
            val+=val+random.nextInt(999999999)+random.nextInt(999999999);
        }
    }
}

? 將堆內(nèi)存設(shè)置小點(diǎn),可快速看到效果

java -Xmx10m -Xms10m -XX:+PrintGCDetails TestDemo
2、程序運(yùn)行內(nèi)存分析工具

$JAVA_HOME: jdk路徑

  • 可視化的工具:$JAVA_HOME/bin/jvisualvm
  • 命令查看: jmap(jmap -heap PID)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容