OK,所以我有點晚了這裏,你有可能已經解決了這個,但以防萬一有人想知道,最簡單的方法來阻止GC清理的目的是在另一個對象中保留對它的引用。對於您創建的每個對象,都將它添加到某種容器,如數組/散列/向量/列表或您的語言支持的任何對象。例如:
var items as Array[0..numberOfItems]
for (var i = 0; i < numberOfItems; i++) {
var vector = createVector()
items[i] = vector;
}
容器會增加一些開銷,所以您需要先測量它然後從最終輸出中減去該數量。例如:
var baseMemory = measureMemory()
var numberOfItems = 1000
// create an array of a known size (eg 1000 bytes)
var arrayOfKnownSize as Array[0..numberOfItems]
for (var i = 0; i < numberOfItems; i++)
arrayOfKnownSize[i] = Int32(0xFF)
// calculate the size occupied by just the data ...
var expectedMemory = sizeOf(Int32) * numberOfItems
// ... subtract this from the total memory usage and you will get the overhead
var arrayOverhead = measureMemory() - baseMemory - expectedMemory
// now measure the memory used by an array of vectors
baseMemory = measureMemory()
var vectors as Array[0..numberOfItems]
for (var i = 0; i < numberOfItems; i++) {
var vector = createVector()
vectors[i] = vector;
}
// subtract the array overhead from the memory usage
var usedMemory = measureMemory() - baseMemory - arrayOverhead
var averageMemory = usedMemory/numberOfItems
你會然後做相同的測量像你一樣,每一個載體插入到一個數組中,並從內存使用量減去arrayOverhead,讓您的最終結果。
聽起來像範圍問題。這可能是你需要的對象應該在更高的層次上實例化。有一些代碼發佈? – 2011-04-30 03:01:36
爲什麼平均使用的內存更重要?垃圾收集器將在每個JVM中成爲一個常量,因此當它運行時,它正在做它應該達到的目標,以及它在「真實」運行時會做什麼。拋棄GC的結果只會破壞你的結果。 – 2011-04-30 03:05:08
Richard,我添加了代碼。但我認爲stackoverflow是一個小bug。約瑟夫,但我的代碼可能會產生消極的自由內存:http://stackoverflow.com/questions/5812785/negative-free-memory – Seva 2011-04-30 03:12:11