通过java -X看到java -Xms的解释
-Xms<size> set initial Java heap size
但我测试发现,
虽然我的机器内存只有1G,但通过 java -Xms3G -Xmx3G appname可以成功启动应用,那么这个分配机制是怎么的呢?
就是指定了-Xms 3G,但机器内存只有1G的情况下,是怎样分配内存的?
注:
# free -m|grep Swap
Swap: 0 0 0
大家讲道理2017-04-18 10:23:06
因為有作業系統的記憶體管理機制存在, 每個行程都會分配一個虛擬的位址空間(對應32位元系統, 則是4G
虛擬行程位址空間). 虛擬位址空間的有一部分記憶體位址對應到實際的實體記憶體中, 當進程所需的記憶體大於實際的物理記憶體時, 則它的有一部分虛擬記憶體位址會映射到磁碟上. 由於這個機制的存在, 因此進程就好像可以使用到比實際物理記憶體還要大的記憶體空間.
對於你的問題, JVM 需要3G 的內存空間, 而實際機器只有1G, 因此操作系統會將JVM 進程中暫時用不到的內存存入磁碟(即Swap space), 當JVM 需要使用到另外一部分內存時, 則透過記憶體交換(Memory Swap), 將磁碟中的資料寫入記憶體. 因此如果頻繁發生Memory Swap
, 那麼程式必然很慢.