我一直在尋找Java JIT編譯器,我無法弄清楚爲什麼一些代碼仍然被解釋。爲什麼JIT編譯器沒有將所有內容翻譯成本地代碼?解釋要慢得多,我錯過了什麼?爲什麼Java的JIT編譯器不能將所有東西都轉換爲本地代碼?
4
A
回答
3
如果您運行的是像HotSpot這樣的JVM,它會進行機會性的JIT編譯,只關注頻繁執行的代碼。它通過計算每個代碼塊的頻率(或方法 - 我不確定哪個代碼)來確定要優化的代碼。因此,在啓動時,一切都被解釋。
這樣做的目的是通過只需要優化一小部分代碼就可以實現更積極和昂貴的優化。
+0
我認爲kmdent問的是爲什麼不編譯即使是很少的代碼段 –
+0
@Zach L:我剛剛修改了我的問題。 –
5
這是權衡所有問題
- 編譯+執行代碼可以比時間更長的時間來解釋一次花費的時間
- 你經常可以更有效地優化的事情,如果你有分支統計等
- 有些東西是不能被編譯(任何不RTTI,可能)
- 有些事情你不想編譯(行號的堆棧跟蹤等)
- 我河畔還有其他的。
1
主要有兩個原因:
- 解釋是,如果代碼只跑了幾次不慢。如果編譯只運行幾次,編譯成本比解釋代碼要昂貴得多。
- 雖然解釋它有可能在運行時收集統計信息,以後用於優化代碼。例如,您可以計算特定分支的使用次數,並優化代碼以使更頻繁的情況更快。這種技巧可以使JIT編譯比提前編譯(它沒有機會利用運行時統計信息)更好
因此,Java JIT採取了一種明智的策略:直到不編譯您會發現相同的代碼正在多次運行,此時您有證據表明編譯可能是值得的,並且您可以進行一些額外的優化。
相關問題
- 1. 爲什麼我的calloc無法將所有東西都歸零?
- 2. Java代碼和JIT編譯
- 3. php - 回溯迷宮一代(將所有東西都轉換爲二維數組)
- 4. 爲什麼這段代碼不能用MS編譯器編譯?
- 5. 如何將iPhone OSStatus代碼轉換爲有用的東西?
- 6. VS代碼將所有內容都轉換爲html代碼段?
- 7. 當我們將它寫入文件時,爲什麼我們必須將所有東西都轉換爲char *?
- 8. Titanium Mobile是否將JavaScript轉換爲本地Java或Objective C編譯的代碼?
- 9. 爲什麼這個簡單的java代碼不能編譯?
- 10. 爲什麼Eclipse不能在java 1.5中編譯我的代碼?
- 11. 將Java編碼轉換爲僞代碼
- 12. 爲什麼這個ruby代碼不能返回任何東西?
- 13. 是否有可能使用pypy將Java字節碼編譯爲本地代碼?
- 14. 爲什麼gcc不能一致地編譯這段代碼?
- 15. 爲什麼這個Java代碼不能編譯?
- 16. 爲什麼這個Java枚舉代碼不能編譯?
- 17. 爲什麼我的代碼不能使用類型轉換進行編譯?
- 18. 爲什麼不從UTC到本地代碼的轉換工作?
- 19. 爲什麼所有的java代碼都打包在類中?
- 20. 當我編譯這個爲什麼不打印任何東西?
- 21. 爲什麼不編譯這個代碼?
- 22. 這段代碼爲什麼不編譯?
- 23. .Net Assemblies將編譯器轉換爲C#的反編譯器源代碼
- 24. 將所有東西都作爲Python中的對象的方法
- 25. 將java編譯爲本機代碼的性能如何?
- 26. 爲什麼我的代碼不會返回任何東西
- 27. 爲什麼不能編譯?
- 28. 當我將所有東西都改爲白色時,我的微調器仍然是黑色的,爲什麼>
- 29. C#編譯器和JIT都做了什麼樣的優化?
- 30. Java編譯混淆:爲什麼這個代碼編譯?
術語「JIT編譯器」至少10年過期。你真正在調查的是* HotSpot JVM。*它們不是一回事。 – EJP