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