2012-01-05 17 views
7

Temel olarak, bazı bilgisayarlarda JVM seçeneği -Xmx (maksimum yığın boyutu) ayarının, bazen sistemde yeterli RAM'den fazla olsa bile JVM'nin başlatılamamasına neden olduğunu fark ettik.Neden -Xmx değeri çok yüksek ayarlandığında, bazen kullanılabilir bir RAM olsa bile JVM'nin başarısız olmasına neden olur?

Yani, örneğin, bir 4gb makinede, biz başarısız ama -Xmx800m işleri -Xmx1024m var. 1GB'lık bir makinede, 2GB'lık bir makinede bile, ancak 4gb'lik bir makinede, özellikle Windows, Linux, vb. RAM'in takas edilebileceğini düşünerek anlayabiliyordum, bu neden başarısız oluyor?

Ben parçacığı ve maksimum yığın boyutunu azaltmak için diyerek bir çok soru gördüm ama ben gerçekten aradığım şey olduğu başarısız neden kimse açıklayabilir. Hem de

, size daha sonra belli bir boyuta kadar istediğiniz kadar bellek tüketir nasıl diyorsunuz?

+0

bir hızlı arama JVM onları 'kurmak için izin verdiğini şaşırırlar kullanıcılar getirdiğini -Xmx' terabayt onlar neredeyse kadar takas alanı yok olsa bile. Test ettiğiniz tam komutları ve JVM sürümlerini paylaşır mısınız? – alf

+0

@alf, -Xmx’in en büyük yığın boyutunu, yani ayrılmış sanal adres alanı aralığının büyüklüğünü belirttiğini unutmayın; Sadece -Xms'de belirtilen miktar, gerçekte depolanmış depolama tarafından desteklenir. Örneğin, bkz. ['VirtualAlloc'] (http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887%28v=vs.85%29.aspx) ve M MEM_RESERVE' ile MEM_COMMIT’i karşılaştırın. bayraklar. –

+0

@JeffreyHantin Ben yaptım Jeffrey. Bu yüzden _exactly_ OP'nin ne yaptığını soruyordum. – alf

cevap

13

Bu virtual address space fragmentation nedeniyle olasıdır. Özellikle de benzeri DLL, lifler yığın yerle taşınmaz doğal bellek yönetimi, çekirdek ayrılmış adresleri yük adresleri bağlı olarak, yığın maksimum potansiyel boyutu için bir bitişik 1024MB adresi aralığını rezerv ve mümkün olmayabilir 32 bitlik bir süreç.

İlgili konular