Basit bir B-Tree uyguladınız; Şimdi aşağıdaki yöntemi kullanarak ona bellek kullanımını tahmin etmek istedik (JVM sadece 32bit için geçerlidir):Java'da bir B Ağacının bellek kullanımını hesaplama
class BTreeEntry {
int entrySize;
long keys[];
int values[];
BTreeEntry children[];
boolean isLeaf;
...
/** @return used bytes */
long capacity() {
long cap = keys.length * (8 + 4) + 3 * 12 + 4 + 1;
if (!isLeaf) {
cap += children.length * 4;
for (int i = 0; i < children.length; i++) {
if (children[i] != null)
cap += children[i].capacity();
}
}
return cap;
}
}
/** @return memory usage in MB */
public int memoryUsage() {
return Math.round(rootEntry.capacity()/(1 << 20));
}
Ama mesela denedim 7mio girişleri ve memoryUsage yöntemi için -Xmx ayarından çok daha yüksek değerler bildirilir! Örneğin. 1040 (MB) diyor ve ben -Xmx300'ü ayarlıyorum! JVM bir şekilde bellek düzenini optimize edebilir mi, örn. boş diziler için ya da benim hatam olabilir?
Güncelleme1: Tamam, isLeaf boolean'ı tanıtmak bellek kullanımını çok fazla azaltır, ancak yine de neden Xmx'ten daha yüksek değerler aldığımı belirsiz. (Yine de, tüm müteahhitler için isLeaf == false kullanarak bunu deneyebilirsiniz)
Update2: Hmmh, bir şey çok yanlış. Yaprak başına girişleri arttırırken, bellek kullanımının azaldığı varsayılır (her ikisi için de kompakt yapılırken), çünkü daha büyük diziler için referansların daha az yükü vardır (ve btree daha küçük bir boyuta sahiptir). Ancak, memoryUsage yöntemi, yaprak başına 100 giriş yerine 500 kullanırsam, artan bir değer bildirir.
3 * 12 uzun kapasitenin kaynağı nedir? – Erik
Uzun ve int'nin bellek tüketim değerleri için kaynağınız nedir? – PeterMmm
@Erik 3 * 12 -> 3 diziye referanslar. – Karussell