java 1m_Java编程测试1M内存可用来缓存多少对象
為了提高系統(tǒng)的響應性能,一般都會采用緩存技術(shù)來實現(xiàn),如果用象ehcache、oscache這樣的開源的cache工具來實現(xiàn),一般都需要由開發(fā)人員來設(shè)置maxElementsInMemory這個值,但這個值在設(shè)置的時候大家都是怎么去設(shè)置的呢?憑想像還是隨便寫一個值呢?這個值設(shè)的過大嘛有可能會造成outofmemory,設(shè)的過小嘛又浪費服務器巨大的內(nèi)存,為了能夠更好的設(shè)置這個值,我寫了個測試程序來估算1M內(nèi)存能夠緩存多少個對象,代碼如下:
public void
testSpike(){
print("最大的內(nèi)存為:"+Runtime.getRuntime().maxMemory()/1024);
print("總的內(nèi)存為:"+Runtime.getRuntime().totalMemory()/1024);
print("==================================");
long currMemory=Runtime.getRuntime().freeMemory();
print("目前可用的內(nèi)存為:"+currMemory/1024);
print("==================================");
Map cache=new HashMap();
for (int i = 0; i < 500000; i++) {
MockBean bean=new MockBean();
bean.setId(i);
bean.setName("jerry"+i);
bean.setValue(i+"jerry");
cache.put(String.valueOf(i), bean);
long tempMemory=Runtime.getRuntime().freeMemory();
if((currMemory-tempMemory)/1024==1024){
print("此時可用的內(nèi)存為:"+tempMemory/1024);
print("此時緩存了:"+i+"個對象");
break;
}
}
print("==================================");
cache.clear();
long tempMemory=Runtime.getRuntime().freeMemory();
print("目前可用的內(nèi)存為:"+tempMemory/1024);
print("消耗的內(nèi)存為:"+(currMemory-tempMemory)/1024);
print("==================================");
Runtime.getRuntime().gc();
tempMemory=Runtime.getRuntime().freeMemory();
print("目前可用的內(nèi)存為:"+tempMemory/1024);
print("消耗的內(nèi)存為:"+(currMemory-tempMemory)/1024);
}
private void print(String msg){
System.out.println(msg);
}
在我機器上運行的結(jié)果是1M內(nèi)存可緩存大概4479個對象,同時可以看到,在cache.clear后內(nèi)存并沒有變化,因為gc是沒那么及時的,這個時候顯式的調(diào)用gc則會發(fā)現(xiàn)可用的內(nèi)存量甚至比最初都多。
當然,這里只是個簡單的測試,這里測試的也只是緩存一個非常簡單的bean對象,緩存的對象消耗的內(nèi)存大小還需要根據(jù)這個對象中具體的內(nèi)容而定,比如當緩存的是blob類型的字段的時候,可想而知,這個時候消耗的內(nèi)存量絕對是不同的。
這里只是建議大家在對系統(tǒng)性能做優(yōu)化時最好根據(jù)需要緩存的內(nèi)容做一個估算,設(shè)置好應用所需要的jvm的內(nèi)存值,以便充分利用服務器的硬件資源。
總結(jié)
以上是生活随笔為你收集整理的java 1m_Java编程测试1M内存可用来缓存多少对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 两个对象数组交集_yiduobo的每日l
- 下一篇: java 两个sql文_Java和SQL