為了提高系統的響應性能,一般都會采用緩存技術來實現,如果用象ehcache、oscache這樣的開源的cache工具來實現,一般都需要由開發人員來設置maxElementsInMemory這個值,但這個值在設置的時候大家都是怎么去設置的呢?憑想像還是隨便寫一個值呢?這個值設的過大嘛有可能會造成outofmemory,設的過小嘛又浪費服務器巨大的內存,為了能夠更好的設置這個值,我寫了個測試程序來估算1M內存能夠緩存多少個對象,代碼如下:
當然,這里只是個簡單的測試,這里測試的也只是緩存一個非常簡單的bean對象,緩存的對象消耗的內存大小還需要根據這個對象中具體的內容而定,比如當緩存的是blob類型的字段的時候,可想而知,這個時候消耗的內存量絕對是不同的。
這里只是建議大家在對系統性能做優化時最好根據需要緩存的內容做一個估算,設置好應用所需要的jvm的內存值,以便充分利用服務器的硬件資源。
1
public void testSpike()
{
2
print("最大的內存為:"+Runtime.getRuntime().maxMemory()/1024);
3
print("總的內存為:"+Runtime.getRuntime().totalMemory()/1024);
4
print("==================================");
5
long currMemory=Runtime.getRuntime().freeMemory();
6
print("目前可用的內存為:"+currMemory/1024);
7
print("==================================");
8
Map cache=new HashMap();
9
for (int i = 0; i < 500000; i++)
{
10
MockBean bean=new MockBean();
11
bean.setId(i);
12
bean.setName("jerry"+i);
13
bean.setValue(i+"jerry");
14
cache.put(String.valueOf(i), bean);
15
long tempMemory=Runtime.getRuntime().freeMemory();
16
if((currMemory-tempMemory)/1024==1024)
{
17
print("此時可用的內存為:"+tempMemory/1024);
18
print("此時緩存了:"+i+"個對象");
19
break;
20
}
21
}
22
print("==================================");
23
cache.clear();
24
long tempMemory=Runtime.getRuntime().freeMemory();
25
print("目前可用的內存為:"+tempMemory/1024);
26
print("消耗的內存為:"+(currMemory-tempMemory)/1024);
27
print("==================================");
28
Runtime.getRuntime().gc();
29
tempMemory=Runtime.getRuntime().freeMemory();
30
print("目前可用的內存為:"+tempMemory/1024);
31
print("消耗的內存為:"+(currMemory-tempMemory)/1024);
32
}
33
34
private void print(String msg)
{
35
System.out.println(msg);
36
}
在我機器上運行的結果是1M內存可緩存大概4479個對象,同時可以看到,在cache.clear后內存并沒有變化,因為gc是沒那么及時的,這個時候顯式的調用gc則會發現可用的內存量甚至比最初都多,呵呵


2

3

4

5

6

7

8

9



10

11

12

13

14

15

16



17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34



35

36

當然,這里只是個簡單的測試,這里測試的也只是緩存一個非常簡單的bean對象,緩存的對象消耗的內存大小還需要根據這個對象中具體的內容而定,比如當緩存的是blob類型的字段的時候,可想而知,這個時候消耗的內存量絕對是不同的。
這里只是建議大家在對系統性能做優化時最好根據需要緩存的內容做一個估算,設置好應用所需要的jvm的內存值,以便充分利用服務器的硬件資源。