java性能优化方案_Java性能优化要点
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性能优化要点相关推荐
- iOS 性能优化方案-弱网优化
一.iPhone手机弱网环境配置 选择现有网络状态 或自定义网络状态 设置参数: 每个参数的含义大致如下: in bandwidth :下行带宽 in packet loss :下行丢包率 in de ...
- java dump分析工具_java性能分析与常用工具
本次源码已放在Github:https://github.com/nateshao/jvm-tuning 个人博客 https://nateshao.gitee.io http://www.nates ...
- android布局优化方案,Android启动优化-布局优化
Android启动优化-布局优化 安卓应用开发发展到今天,已经成为一个非常成熟的技术方向,从目前的情况看,安卓开发还是一个热火朝天的发展,但高级人才却相对较少,如今移动互联网的开发者也逐渐开始注重插入 ...
- mysql产品优化方案_mysql的优化方案
简介 在本文中,主要写一下自己所查阅和理解的mysql优化方案. 我的理解是数据库的优化对于我们'非专业'人员,mysql的优化也没那么复杂了,真的要玩转mysql的话,肯定得需要很多年的经验了. 参 ...
- mysql数据库优化方案_mysql数据库优化方案
1.活动/峰值连接数 (图1)中当前活动的连接为1个,自MySQL服务启动以来,最高连接数为54:当最高连接数接近或等于(图2)中的max_connections时,应适当增加max_connecti ...
- Vue app.js文件过大,带宽占用过大,优化方案(持续优化)
Vue app.js文件过大,带宽占用过大,优化方案 前言 最近我的网站在使用的过程中发现加载缓慢问题,在没有缓存的情况下页面打开速度需要五秒,这对于用户体验来说是不友好的.通过查找网上的方案 我实验 ...
- java装修默认方案_Java 装饰模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述装饰(Decorator)模式的: 装饰模式又名包装(Wrapper)模式.装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替 ...
- java 强制转换 效率_Java 性能优化:35 个小细节,让你提升 Java 代码的运行效率...
代码优化细节 1.尽量指定类.方法的final修饰符 2.尽量重用对象 3.尽可能使用局部变量 4.及时关闭流 5.尽量减少对变量的重复计算 6.尽量采用懒加载的策略,即在需要的时候才创建 7.慎用异 ...
- java解析json文件_Java性能优化:正确的解析JSON文件
数据收集服务平均1小时OOM(java.lang.OutOfMemoryError: GC overhead limit exceeded)一次,发现都是在下载处理 JSON Atom Feed时OO ...
最新文章
- 使用SSM+JSP实现一个教务管理系统
- C#与java可以共用的DES加密解密
- 如何将Pytorch生成的模型进行CPU部署
- Windows组策略让你的网络系统更强壮
- 前端公共库CDN加速
- 在C#里调用C++的dll时需要注意的一些问题转
- jprofiler_windows-x64_9_1注册码
- 争时金融java_Java高并发编程基础之AQS
- Java学习笔记——JDBC之与数据库MySQL的连接以及增删改查等操作
- LINQ 实现多字段关联查询 C#
- 提供两个卡巴斯基的授权文件
- 盘点前端开发常用的几款编辑器
- Mac 常用的 20 款效率神器推荐
- hive desc table_name commet乱码问题解决
- amoeba实现mysql主从读写分离_MySQL+Amoeba实现数据库主从复制和读写分离
- linux-redis设置密码
- matlab计算翼型升力系数,naca0012翼型升力系数
- BOOT客户管理系统(详解)
- 工作记录 01-02-2018 至 03-16-2018
- MQ(Message Queue)介绍
热门文章
- 云上更安全?亚马逊云科技宣布将持续加大在中国区域安全合规领域投入
- 漫画:什么是自动驾驶?
- Facebook 开启元宇宙模式!豪砸百亿是为什么?
- CPU 是如何执行任务的?
- 赠书 | 读懂 x86 架构 CPU 虚拟化,看这文就够了
- java jdk myeclipse_java初体验(JDK+myeclipse)
- 最小覆盖模型matlab_数学规划模型的matlab求解 非线性最小二乘lsqnonlin
- mfc链表中的数据如何排序输出_java程序员面试中最容易被问到的18个算法题(附答案!)...
- linux 环境 RocketMQ 4.8.0 安装、部署控制台
- Flowable 数据库表结构 ACT_ID_USER