java 越来越慢_浅析Java语言慢的原因
Java在早期(比如JDK1.2以前)是很慢的,后續版本由于有許多優化手段的加入,Java正變得越來越快,所以現在也有很多關于Java和C/C++孰快孰慢的爭論。我想就我自己的理解,談一下影響Java程序運行速度的因素。
1、GC回收
眾所周知,Java相對C/C++的一個很大進步就是有了GC機制,它能夠很大程序的避免C/C++常見的內存泄漏的發生。但是這也是有代價的,那就是因為JVM管理了所有內存分配釋放,當內存不夠時就需要做回收,每次回收都有掃描整個堆,然后要搬移一些內存數據,新生代還好,如果是老年代的GC,會造成程序卡頓一段時間,很多時候是不能接受的,也極大的拖慢了程序的運行速度。雖然GC算法在不斷改進,但是也屬于只能優化不能根治。
2、解釋性語言
Java為了跨平臺,沒有直接編譯成機器指令,而是編譯成字節碼,運行時JVM需要加載這些字節碼,然后再逐條解釋執行。這個過程中,字節碼的加載需要時間,然后解釋執行也需要時間。做同樣一件事情,編譯語言可以直接編譯成機器碼,運行時CPU就直接執行這些指令,而Java是編譯成字節碼,運行時JVM要把字節碼翻譯成目標機器的可執行指令,這里面就增加了一層間接性,所以也會降低運行速度。
3、JIT消耗資源
JIT是Java后續版本的改進功能,能把常執行的方法或者語句塊即時編譯成機器碼,這樣確實能加快運行速度。但是這種編譯是即時發生,會和程序本身搶用運行資源,就會拖慢程序運行的速度。
4、基于棧的指令集
編譯語言多采用基于目標平臺寄存器的指令集,這樣能充分利用寄存器的高速度。Java為了可移植性,沒有綁定某個目標平臺的寄存器,而是采用基于棧的指令集。頻繁的棧內存訪問會導致比較慢的速度,并且通常編譯相同語句產生的指令數量也要多于寄存器指令集。
5、大量使用堆內存
Java中對象創建被JVM托管,能夠避免越界或空指針訪問之類在C/C++中常見的問題。因此對象大多是創建在堆上的,而不是棧上的,其創建和維護成本上通常要更高一些。
6、AOT技術
AOT技術能夠在字節碼安裝到目標平臺時,先編譯成目標平臺的執行文件,這樣目標平臺就可以直接運行可執行文件,速度上可以達到編譯類語言的水平。但是這樣會導致Java所擁有的動態加載功能喪失,所有字節碼都被編譯到執行文件,不論其在運行時是否被使用到,并造成其產生的可執行文件相對于字節碼來說體積更大。
總言而之,Java由于其跨平臺且管理內存等特性,給開發效率帶來了諸多進步,但是凡事有利也有弊,伴隨而來的是運行效率的降低。充分了解這些優勢和劣勢,才能在合適的時候選擇合適的技術,以發揮最大的效能。
總結
以上是生活随笔為你收集整理的java 越来越慢_浅析Java语言慢的原因的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java基础教程传值_Java基础——方
- 下一篇: java 数据分析库_超级好用的 Jav