對於Java函數聲明:在Java中,哪些對象被放置在堆棧上以及哪些放在堆上?
Xxx xxx = new Xxx() {
public Abc abc(final Writer out) {
return new SomeFunction(out) {
boolean isDone = false;
public void start(final String name) {
/* blah blah blah */
}
};
}
};
哪個變量,包括功能,都穿上堆,並且將在棧上放?
的原因,我問這是在JVM分段錯誤:
kernel: java[14209]: segfault at 00002aab04685ff8 rip 00002aaab308e4d0 rsp 00002aab04685ff0 error 6
00002aab04685ff8
和00002aab04685ff0
接近,似乎堆棧增長過快。我試圖調查這部分代碼,並懷疑這是多少次調用此函數時出現問題的原因。如果堆被堆上的某些變量引用,堆棧可能不會被清除?
爲什麼會這樣做?我同意,從堆棧中獲取某些東西比從堆中獲取更快,但是在CPU每秒執行數十億次操作的時候真的很重要嗎? –
有很多原因希望堆棧上有對象:首先,堆棧有更高的可能性存在於緩存中,爲您提供本地變量的緩存局部性。其次,堆上的對象越少,垃圾收集器就越不忙碌。第三,堆棧中的對象保證只能由一個線程訪問,所以不需要鎖定它們。 – rolve
所以,你認爲我發佈的代碼不是問題的原因,對吧? –