讓我們假裝你有一個3GB的jar文件,你的應用程序只使用其中的一個小類。 JVM是否將整個jar文件加載到內存中,或者它是否讀取目錄並只加載它需要的部分?這種行爲是可控的嗎?如果Java JVM僅使用其中的一個類,Java JVM是否加載整個jar或耳朵?
8
A
回答
6
JVM調用時僅從Jar加載所需的類。如果應用程序需要一個類,那麼該類和所有其他相關的類將被加載。不知道,但我想這是類加載器從類路徑和加載中定位類的責任。
0
默認的類加載器只在需要時加載所需的東西。如果您的CLASSPATH中有10MB JAR,並且只需要一個.class文件,那麼JVM將只在您的代碼第一次嘗試訪問它時才加載該類。 .class字節碼進入perm空間。
它是「可控」的,因爲您可以編寫自己的類加載器,但需要一些專業知識才能這樣做。
1
它完全依賴於JVM和類加載器。 JVM規範指定類應出現要在其第一次活動使用時加載。類加載器可以在預期中提前加載某些類。實際上,大多數類加載器會盡可能延遲加載。
2
Jar文件是zip文件的一種形式。
這些如何處理高度依賴於JRE。
舊版本的Sun JRE用於映射整個文件的內存。這將分配邏輯內存,但不一定會導致從磁盤加載任何數據。 (32位Windows通常不能分配3 GB的連續內存,儘管您可以在其他操作系統上執行此操作)。
我相信目前的行爲是內存映射在Windows下的文件後部的中央目錄。在其他操作系統下,它只是讀取。這由源碼中的#define
控制。
JDK7很可能會做其他事情。
類通常懶惰地裝載。資源每次重新讀取。 java.util.ResourceBundle
緩存。
相關問題
- 1. 如何JVM加載父類中的Java
- 2. 調用java是否創建新的JVM實例或僅僅是另一個Java進程?
- 3. 在jvm中加載java熱點類
- 4. 每個Java應用程序是否有一個JVM?
- 5. SAP NetWeaver AS Java是否支持JVM上的所有語言或僅支持Java?
- 6. 如何解決Java JVM加載失敗?
- 7. 在JVM中加載類
- 8. JVM中的類加載器
- 9. 如果一個類由不同的類加載器加載,(sun-jvm)熱點優化是否會多次發生?
- 10. 如何檢測我運行的JVM是否使用多個類加載器?
- 11. JVM中是否存在Java信號量?
- 12. Java的:當一個類需要在JVM中被加載兩次多?
- 13. 如何在JVM中使用類加載器加載類兩次?
- 14. 使用maven構建一個耳朵
- 15. Gradle耳朵是放JAR而不是WAR
- 16. Docker和JVM,是否爲每個docker實例創建一個新的JVM安裝?
- 17. Java:一個Jar,多臺機器,JVM在哪裏?
- 18. 加載特定類時JVM是否加載所有使用的類?
- 19. 是命令「java」的JVM嗎?
- 20. jvm是否加載了類路徑提到的所有類?
- 21. 何時由JVM加載類?
- 22. 使用Java,我可以讓一個JVM產生另一個JVM,然後讓原始的一個退出?
- 23. Java:如何攔截正在被JVM加載的類
- 24. 是否有可能在一個jvm中的java進程殺死/阻止另一個jvm中的另一個java進程?
- 25. 如何從一個JVM上的對象遷移到其他JVM
- 26. 是否可以編寫一個將Java類提供給JVM的C/C++程序?
- 27. Java JVM與Glassfish
- 28. Android Studio - Java JVM
- 29. 什麼類加載器在websphere(或通常)中加載耳朵的lib目錄?
- 30. 使用不同的加載器在JVM中加載兩次類