日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > java >内容正文

java

java性能优化方案_Java性能优化要点

發(fā)布時(shí)間:2024/9/27 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java性能优化方案_Java性能优化要点 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Java性能優(yōu)化要點(diǎn)

本文介紹如何通過(guò)以下幾點(diǎn)從Java中擠壓出性能,該大部分經(jīng)驗(yàn)來(lái)自于Netty作者。

JITJava即時(shí)編譯器

當(dāng)Java執(zhí)行runtime環(huán)境時(shí),每遇到一個(gè)新的類(lèi),JIT編譯器在此時(shí)就會(huì)針對(duì)這個(gè)類(lèi)別進(jìn)行編譯(compile)被優(yōu)化成相當(dāng)精簡(jiǎn)的原生型指令碼(native code),會(huì)做一下工作:

展開(kāi)循環(huán)loop-unrolling

重新安排代碼

移除同步synchronized

優(yōu)化鎖

內(nèi)聯(lián)熱點(diǎn)方法

首先,JIT會(huì)展開(kāi)我們代碼中的循環(huán)語(yǔ)句,所以,我們編碼時(shí)盡量注意不要在關(guān)鍵熱點(diǎn)部分編寫(xiě)讓JIT難于展開(kāi)的循環(huán)語(yǔ)句。

JIT比較難以展開(kāi)的循環(huán)語(yǔ)句如下:

int i = 0;

for (;;) {

if (array.length == i) {

break;

}

doSomething(array[i++]);

}

這種for循環(huán)雖然編寫(xiě)方便,但是JIT不喜歡,下面循環(huán)則易于JIT展開(kāi):

int i = 0;

for (int i = 0; i < array.length; i++) {

doSomething(array[i]);

}

其次,JIT會(huì)內(nèi)聯(lián)一些熱點(diǎn)小方法代碼,這些小方法缺省差不多是325字節(jié)。比如下面是普通代碼:

public void methodA() {

... // Do some work A

methodB();

}

private void methodB() {

... // Do some more work B

}

JIT會(huì)將methodB內(nèi)聯(lián)合并到methodA中

//采取methodB內(nèi)聯(lián)到到methodA

public void methodA() {

... // Do some work A

... // Do some more work B

}

可以通過(guò)下面的Java運(yùn)行配置記錄檢測(cè)內(nèi)聯(lián):

java

-XX:+PrintCompilation

-XX:+UnlockDiagnosticVMOptions

-XX:+PrintInlining

.... > inline.log

PrintCompilation:當(dāng)JIT編譯發(fā)生輸出打印

UnlockDiagnosticVMOptions:這是標(biāo)識(shí) -XX:+PrintInlining需要的

-XX:+PrintInlining :當(dāng)方法被內(nèi)聯(lián)后打印出來(lái)

內(nèi)聯(lián)日志inline.log效果如下:

@ 42 io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe::read (191 bytes) inline (hot) (這表示方法hot被內(nèi)聯(lián)了)

@ 42 io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe::read (327 bytes) hot method too big (但是方法hot用于內(nèi)聯(lián)太大了)

@ 4 io.netty.channel.socket.nio.NioSocketChannel::config (5 bytes) inline (hot)

@ 1 io.netty.channel.socket.nio.NioSocketChannel::config (5 bytes) inline (hot)

@ 12 io.netty.channel.AbstractChannel::pipeline (5 bytes) inline (hot)

我們編碼時(shí)對(duì)于熱點(diǎn)方法不要編寫(xiě)對(duì)內(nèi)聯(lián)太大的方法,如下面read方法:

private final class NioMessageUnsafe extends AbstractNioUnsafe {

public void read() {

final SelectionKey key = selectionKey();

if (!config().isAutoRead()) {

int interestOps = key.interestOps();

if ((interestOps & readInterestOp) != 0) {

// only remove readInterestOp if needed

key.interestOps(interestOps & ~readInterestOp);

}

}

... // rest of the method

}

...

}

分解出read()方法一部分代碼到新的方法中:

private final class NioMessageUnsafe extends AbstractNioUnsafe {

public void read() {

if (!config().isAutoRead()) {

removeReadOp();

}

private void removeReadOp() {

SelectionKey key = selectionKey();

int interestOps = key.interestOps();

if ((interestOps & readInterestOp) != 0) {

// only remove readInterestOp if needed

key.interestOps(interestOps & ~readInterestOp);

}

}

... // rest of the method

}

...

注意到read方法從原來(lái)多行已經(jīng)變成了簡(jiǎn)單幾行,這時(shí)我們?cè)倏纯碕IT的內(nèi)聯(lián)日志:

@ 42 io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe::read (288 bytes) inline (hot)

只有一行輸出,說(shuō)明read方法已經(jīng)小到適合內(nèi)聯(lián)了。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的java性能优化方案_Java性能优化要点的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。