對於添加到Java應用程序的每個新類,內存方面的成本是多少?
它通常沒有關係。一般而言,代碼以各種形式佔用整個內存使用量的很小比例(比如5%)。因此,即使您設法將代碼大小減少了一半,整體內存使用量也只會略有下降。
相反,過長的源文件會導致代碼庫很難導航,而較大的範圍使得難以概覽該類的具體內容以及某個更改是否安全。因此,長時間的源文件會使代碼的修改更加昂貴且容易出錯。
- 第一次使用類加載到存儲器(使用的內存是大致類文件的大小)
正確。
- 如果使用JIT,一些額外的機器友好的二進制版本由使用多一點的內存
- 如果熱點只用一些常用的類的JIT編譯器創建與機優化 - 友好的版本(以平衡內存和速度)
熱點是JIT,所以你在這裏重複自己。但是,是的,JIT確實增加了代碼大小(但增加了更多的速度)。
一旦一個類被加載,創造更多的情況下具有可忽略的開銷(約50-100字節?)(假設沒有實例變量)
也就是說JVM具體。在Oracle熱點JVM,每個對象內存開銷大約是8個字節,如下面的程序演示:
public class Test {
public static void main(String[] args) {
Object[] array = new Object[10_000_000];
Runtime rt = Runtime.getRuntime();
long usedBefore = rt.totalMemory() - rt.freeMemory();
for (int i = 0; i < array.length; i++) {
array[i] = new Object();
}
long usedAfter = rt.totalMemory() - rt.freeMemory();
System.out.println(usedBefore);
System.out.println(usedAfter);
System.out.println((double)(usedAfter - usedBefore)/array.length);
}
}
雖然它不是Java語言規範所要求的,但是我曾經使用過的每個JVM在ClassLoader變得不可訪問時釋放一個類(授予,引導類加載器將始終保持可達,但自定義ClassLoader可能變爲unreac hable)。
任何擁有5000+線條課程的人,尤其是如果有其他人需要維護的話,都應該退出並拍攝。這回答了你的問題了嗎?儘管如此,你認爲程序的成本是錯誤的。調試的主要成本很高,而且這種情況不會因過早和錯誤的優化而得到改善。如果你這樣編碼,你的尾巴就會有一隻老虎。 –
內存成本應該相同或非常接近,因爲它取決於類內的對象。所以你可以通過做大量的課來節省一兩個字節,但代價是可讀性。小班更好IMO –
我的應用程序中有幾個5,000多個班級。此外,有更多的短期班的做法令人沮喪。我試圖瞭解什麼是'正確的事情'來做! – Teddy