? 實(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)