轉(zhuǎn)自 :https://blog.csdn.net/wgw335363240/article/details/8878644
最近在網(wǎng)上看到一些人討論到j(luò)ava.lang.Runtime類中的freeMemory(),totalMemory(),maxMemory ()這幾個方法的一些問題粒蜈,很多人感到很疑惑菩收,為什么哭当,在java程序剛剛啟動起來的時候freeMemory()這個方法返回的只有一兩兆字節(jié)唉俗,而隨著 java程序往前運(yùn)行,創(chuàng)建了不少的對象砸紊,freeMemory()這個方法的返回有時候不但沒有減少苛谷,反而會增加盗忱。這些人對freeMemory()這 個方法的意義應(yīng)該有一些誤解,他們認(rèn)為這個方法返回的是操作系統(tǒng)的剩余可用內(nèi)存屉栓,其實根本就不是這樣的舷蒲。這三個方法反映的都是java這個進(jìn)程的內(nèi)存情 況,跟操作系統(tǒng)的內(nèi)存根本沒有關(guān)系友多。下面結(jié)合totalMemory(),maxMemory()一起來解釋牲平。
maxMemory()這個方法返回的是java虛擬機(jī)(這個進(jìn)程)能構(gòu)從操作系統(tǒng)那里挖到的最大的內(nèi)存,以字節(jié)為單位域滥,如果在運(yùn)行java程序的時 候纵柿,沒有添加-Xmx參數(shù),那么就是64兆启绰,也就是說maxMemory()返回的大約是64*1024*1024字節(jié)昂儒,這是java虛擬機(jī)默認(rèn)情況下能 從操作系統(tǒng)那里挖到的最大的內(nèi)存。如果添加了-Xmx參數(shù)委可,將以這個參數(shù)后面的值為準(zhǔn)渊跋,例如java -cp ClassPath -Xmx512m ClassName,那么最大內(nèi)存就是512*1024*0124字節(jié)着倾。
totalMemory()這個方法返回的是java虛擬機(jī)現(xiàn)在已經(jīng)從操作系統(tǒng)那里挖過來的內(nèi)存大小拾酝,也就是java虛擬機(jī)這個進(jìn)程當(dāng)時所占用的所有 內(nèi)存。如果在運(yùn)行java的時候沒有添加-Xms參數(shù)屈呕,那么微宝,在java程序運(yùn)行的過程的,內(nèi)存總是慢慢的從操作系統(tǒng)那里挖的虎眨,基本上是用多少挖多少蟋软,直 挖到maxMemory()為止镶摘,所以totalMemory()是慢慢增大的。如果用了-Xms參數(shù)岳守,程序在啟動的時候就會無條件的從操作系統(tǒng)中挖- Xms后面定義的內(nèi)存數(shù)凄敢,然后在這些內(nèi)存用的差不多的時候,再去挖湿痢。
freeMemory()是什么呢涝缝,剛才講到如果在運(yùn)行java的時候沒有添加-Xms參數(shù),那么譬重,在java程序運(yùn)行的過程的拒逮,內(nèi)存總是慢慢的從操 作系統(tǒng)那里挖的,基本上是用多少挖多少臀规,但是java虛擬機(jī)100%的情況下是會稍微多挖一點(diǎn)的滩援,這些挖過來而又沒有用上的內(nèi)存,實際上就是 freeMemory()塔嬉,所以freeMemory()的值一般情況下都是很小的玩徊,但是如果你在運(yùn)行java程序的時候使用了-Xms,這個時候因為程 序在啟動的時候就會無條件的從操作系統(tǒng)中挖-Xms后面定義的內(nèi)存數(shù)谨究,這個時候恩袱,挖過來的內(nèi)存可能大部分沒用上,所以這個時候freeMemory()可 能會有些大胶哲。
自己寫了個例子畔塔,對著測試 結(jié)果應(yīng)該會有更深刻的了解:
---------------------
作者:O溺水的魚0
來源:CSDN
原文:https://blog.csdn.net/wgw335363240/article/details/8878644
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接纪吮!
package com.trs.tb.encrypt;
public class TestMemory {
public static void main(String[] args) {
System.out.println("free:" + Runtime.getRuntime().freeMemory() / 1024
/ 1024);
System.out.println("total:" + Runtime.getRuntime().totalMemory() / 1024
/ 1024);
System.out.println("max:" + Runtime.getRuntime().maxMemory() / 1024
/ 1024);
System.out.println("=============");
long t = System.currentTimeMillis();
try {
Thread.sleep(3000);
} catch (Exception ee) {
ee.printStackTrace();
}
String[] aaa = new String[2000000];
System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024);
System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);
System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024);
System.out.println("=============");
try {
Thread.sleep(3000);
} catch (Exception ee) {
ee.printStackTrace();
}
for (int i = 0; i < 2000000; i++) {
aaa[i] = new String("aaa");
}
System.out.println(Runtime.getRuntime().freeMemory() / 1024 / 1024);
System.out.println(Runtime.getRuntime().totalMemory() / 1024 / 1024);
System.out.println(Runtime.getRuntime().maxMemory() / 1024 / 1024);
System.out.println("=============");
try {
Thread.sleep(30000);
} catch (Exception ee) {
ee.printStackTrace();
}
}
}
---------------------
執(zhí)行時間:
free:4
total:4
max:63
=============
4
12
63
=============
9
63
63
=============