Java性能优化要点

本文介绍如何通过以下几点从Java中挤压出性能,该大部分经验来自于Netty作者。

JITJava即时编译器

当Java执行runtime环境时,每遇到一个新的类,JIT编译器在此时就会针对这个类别进行编译(compile)被优化成相当精简的原生型指令码(native code),会做一下工作:

展开循环loop-unrolling

重新安排代码

移除同步synchronized

优化锁

内联热点方法

首先,JIT会展开我们代码中的循环语句,所以,我们编码时尽量注意不要在关键热点部分编写让JIT难于展开的循环语句。

JIT比较难以展开的循环语句如下:

int i = 0;

for (;;) {

if (array.length == i) {

break;

}

doSomething(array[i++]);

}

这种for循环虽然编写方便,但是JIT不喜欢,下面循环则易于JIT展开:

int i = 0;

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

doSomething(array[i]);

}

其次,JIT会内联一些热点小方法代码,这些小方法缺省差不多是325字节。比如下面是普通代码:

public void methodA() {

... // Do some work A

methodB();

}

private void methodB() {

... // Do some more work B

}

JIT会将methodB内联合并到methodA中

//采取methodB内联到到methodA

public void methodA() {

... // Do some work A

... // Do some more work B

}

可以通过下面的Java运行配置记录检测内联:

java

-XX:+PrintCompilation

-XX:+UnlockDiagnosticVMOptions

-XX:+PrintInlining

.... > inline.log

PrintCompilation:当JIT编译发生输出打印

UnlockDiagnosticVMOptions:这是标识 -XX:+PrintInlining需要的

-XX:+PrintInlining :当方法被内联后打印出来

内联日志inline.log效果如下:

@ 42 io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe::read (191 bytes) inline (hot) (这表示方法hot被内联了)

@ 42 io.netty.channel.nio.AbstractNioMessageChannel$NioMessageUnsafe::read (327 bytes) hot method too big (但是方法hot用于内联太大了)

@ 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)

我们编码时对于热点方法不要编写对内联太大的方法,如下面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方法从原来多行已经变成了简单几行,这时我们再看看JIT的内联日志:

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

只有一行输出,说明read方法已经小到适合内联了。

java性能优化方案_Java性能优化要点相关推荐

  1. iOS 性能优化方案-弱网优化

    一.iPhone手机弱网环境配置 选择现有网络状态 或自定义网络状态 设置参数: 每个参数的含义大致如下: in bandwidth :下行带宽 in packet loss :下行丢包率 in de ...

  2. java dump分析工具_java性能分析与常用工具

    本次源码已放在Github:https://github.com/nateshao/jvm-tuning 个人博客 https://nateshao.gitee.io http://www.nates ...

  3. android布局优化方案,Android启动优化-布局优化

    Android启动优化-布局优化 安卓应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的情况看,安卓开发还是一个热火朝天的发展,但高级人才却相对较少,如今移动互联网的开发者也逐渐开始注重插入 ...

  4. mysql产品优化方案_mysql的优化方案

    简介 在本文中,主要写一下自己所查阅和理解的mysql优化方案. 我的理解是数据库的优化对于我们'非专业'人员,mysql的优化也没那么复杂了,真的要玩转mysql的话,肯定得需要很多年的经验了. 参 ...

  5. mysql数据库优化方案_mysql数据库优化方案

    1.活动/峰值连接数 (图1)中当前活动的连接为1个,自MySQL服务启动以来,最高连接数为54:当最高连接数接近或等于(图2)中的max_connections时,应适当增加max_connecti ...

  6. Vue app.js文件过大,带宽占用过大,优化方案(持续优化)

    Vue app.js文件过大,带宽占用过大,优化方案 前言 最近我的网站在使用的过程中发现加载缓慢问题,在没有缓存的情况下页面打开速度需要五秒,这对于用户体验来说是不友好的.通过查找网上的方案 我实验 ...

  7. java装修默认方案_Java 装饰模式

    在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...

  8. java 强制转换 效率_Java 性能优化:35 个小细节,让你提升 Java 代码的运行效率...

    代码优化细节 1.尽量指定类.方法的final修饰符 2.尽量重用对象 3.尽可能使用局部变量 4.及时关闭流 5.尽量减少对变量的重复计算 6.尽量采用懒加载的策略,即在需要的时候才创建 7.慎用异 ...

  9. java解析json文件_Java性能优化:正确的解析JSON文件

    数据收集服务平均1小时OOM(java.lang.OutOfMemoryError: GC overhead limit exceeded)一次,发现都是在下载处理 JSON Atom Feed时OO ...

最新文章

  1. 使用SSM+JSP实现一个教务管理系统
  2. C#与java可以共用的DES加密解密
  3. 如何将Pytorch生成的模型进行CPU部署
  4. Windows组策略让你的网络系统更强壮
  5. 前端公共库CDN加速
  6. 在C#里调用C++的dll时需要注意的一些问题转
  7. jprofiler_windows-x64_9_1注册码
  8. 争时金融java_Java高并发编程基础之AQS
  9. Java学习笔记——JDBC之与数据库MySQL的连接以及增删改查等操作
  10. LINQ 实现多字段关联查询 C#
  11. 提供两个卡巴斯基的授权文件
  12. 盘点前端开发常用的几款编辑器
  13. Mac 常用的 20 款效率神器推荐
  14. hive desc table_name commet乱码问题解决
  15. amoeba实现mysql主从读写分离_MySQL+Amoeba实现数据库主从复制和读写分离
  16. linux-redis设置密码
  17. matlab计算翼型升力系数,naca0012翼型升力系数
  18. BOOT客户管理系统(详解)
  19. 工作记录 01-02-2018 至 03-16-2018
  20. MQ(Message Queue)介绍

热门文章

  1. 云上更安全?亚马逊云科技宣布将持续加大在中国区域安全合规领域投入
  2. 漫画:什么是自动驾驶?
  3. Facebook 开启元宇宙模式!豪砸百亿是为什么?
  4. CPU 是如何执行任务的?
  5. 赠书 | 读懂 x86 架构 CPU 虚拟化,看这文就够了
  6. java jdk myeclipse_java初体验(JDK+myeclipse)
  7. 最小覆盖模型matlab_数学规划模型的matlab求解 非线性最小二乘lsqnonlin
  8. mfc链表中的数据如何排序输出_java程序员面试中最容易被问到的18个算法题(附答案!)...
  9. linux 环境 RocketMQ 4.8.0 安装、部署控制台
  10. Flowable 数据库表结构 ACT_ID_USER