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

Java性能优化要点

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

JITJava即时编译器

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

展开循环loop-unrolling

重新安排代码

移除同步synchronized

优化锁

内联热点方法

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

0101eef404030018389338298b480b6e.png

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方法已经小到适合内联了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527761.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java注解 源码_详解Java注解教程及自定义注解

详解Java注解教程及自定义注解更新时间&#xff1a;2016-02-26 11:47:06 作者&#xff1a;佚名 我要评论(0)Java注解提供了关于代码的一些信息&#xff0c;但并不直接作用于它所注解的代码内容。在这个教程当中&#xff0c;我们将学习Java的注解&#xff0c;如何定制注解&…

jpa mysql存储过程_spring data jpa 如何调用mysql存储过程?

A:首先定义存储过程依赖的jpa表&#xff1a;EntityTable(name"evenmngt_childthingtree_tmp")//数据库中的表名NamedStoredProcedureQuery(name "getChildTree1", procedureName "eventmngt.getChildTree1",parameters {StoredProcedureParam…

pdm 导入mysql 注释_PowerDesigner逆向导入MYSQL数据库并显示中文注释(转载)

我想直观的查看数据库表之间的关系与中文注释&#xff0c;发现Navicat Premium下的表模型功能&#xff0c;并没有注释功能:用起来不是很方便。所有想到了用PowerDesigner来逆向MYSQL中的表&#xff0c;并显示中文注释。一、安装ODBC驱动当前环境&#xff1a;window 10 64bitPow…

java高级反射_反射---Java高级开发必须懂的

理解反射对学习Java框架有很大的帮助&#xff0c;如Spring框架的核心就是使用Java反射实现的&#xff0c;而且对做一些Java底层的操作会很有帮助。一、Class类的使用1、万事万物皆对象&#xff0c;(当然&#xff0c;基本数据类型&#xff0c;静态成员不是面向对象(属于类的))&a…

win7卸载java_Win7彻底卸载Oracle 11g图文步骤(靠谱)

网上资料结合自己的操作整理出的一套靠谱的彻底卸载Oracle 11g的步骤&#xff01;(Win7)&#xff0c;具体内容详情如下所示&#xff1a;1&#xff1a;停掉所有Oracle相关的服务1.1打开服务方式如下&#xff1a;1.1.1&#xff1a;右击“计算机”–>管理–>服务和应用程序–…

vba与python相比2019_重大改变!Python 或将取代 VBA 成为 Excel 官方脚本语言

点击上方“CSDN”&#xff0c;选择“置顶公众号”关键时刻&#xff0c;第一时间送达&#xff01;如果微软的 Excel 中支持了人生苦短的 Python&#xff0c;你还会喜欢那个直接且易上手的 VBA 编程吗&#xff1f;近日&#xff0c;据国外媒体 BLEEPINGCOMPUTER 报道&#xff0c;微…

会话标识未更新 java_Appscan漏洞之会话标识未更新

本次针对 Appscan漏洞 会话标识未更新进行总结&#xff0c;如下&#xff1a;1. 会话标识未更新1.1、攻击原理在认证用户或者以其他方式建立新用户会话时&#xff0c;如果不使任何现有会话标识失效&#xff0c;攻击者就有机会窃取已认证的会话&#xff0c;此漏洞可结合XSS获取用…

arcgis的python接口_arcgis-Python的ArcGIS API-Esri Screenshots

作者:Esri### 作者邮箱:pythonesri.com### 首页:https://developers.arcgis.com/python/### 文档:None### 下载链接# ArcGIS API for PythonWork with maps and geospatial data in Python using The ArcGIS API for Python.Use simple and efficient tools powered by Web GIS…

gcc编译器java_「gcc编译器下载」gcc编译器下载各版本下载 - seo实验室

gcc编译器下载相关阅读RequestMapping(value"/download_index")public String downloadExceJava SE Development Kit 6u41Product / File DescriptionFile SizeDownloadpasswordLinux x8665.43 MBjdk-6u41-1.以流的方式下载.public HttpServletResponse download(Str…

Java输出小明算对多少题目_2014年Java方向C组第十题

标题&#xff1a;矩阵翻硬币小明先把硬币摆成了一个 n 行 m 列的矩阵。随后&#xff0c;小明对每一个硬币分别进行一次 Q 操作。对第x行第y列的硬币进行 Q 操作的定义&#xff1a;将所有第 ix 行&#xff0c;第 jy 列的硬币进行翻转。其中i和j为任意使操作可行的正整数&#xf…

iif能用到mysql中吗_数据库基础知识:SQL中的IIF语句详解

IIf返回由逻辑测试确定的两个数值或字符串值之一。语法数字IIf(Logical EXPression, Numeric Expression1, Numeric Expression2)如果 Logical Expression 取值为 TRUE&#xff0c;则此函数返回 Numeric Expression1&#xff0c;否则&#xff0c;返回 Numeric Expression2。字符…

java 取pdf 文本域_java – 使用iText从pdf文件中提取文本列

我需要使用iText从pdf文件中提取文本.问题是&#xff1a;一些pdf文件包含2列,当我提取文本时,我得到一个文本文件,其中列被合并为结果(即同一行中两列的文本)这是代码&#xff1a;public class pdf{private static String INPUTFILE "http://www.revuemedecinetropicale.…

java 反射执行语句_JAVA反射机制

JAVA反射机制定义&#xff1a;JAVA反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意一个方法和属性&#xff1b;这种动态获取的信息以及动态调用对象的方法的功能称…

java 非静态 初始化_Java非静态代码块和实例初始化过程

1 非静态代码块非静态代码块特点①可以为实例变量(非静态的属性)初始化②每次创建对象的时候&#xff0c;都会执行一次&#xff0c;且先于构造器执行③若有多个非静态的代码块&#xff0c;那么按照定义的顺序从上到下依次执行④代码块中既可以调用非静态的变量和方法&#xff0…

java程序员面试怎么难为面试官_Java程序员面试这些多线程问题你知道吗?

在任何Java面试当中多线程和并发方面的问题都是必不可少的一部分。所以你应该准备很多关于多线程的问题。在投资银行业务中多线程和并发是一个非常受欢迎的话题&#xff0c;特别是电子交易发展方面相关的。他们会问面试者很多令人混淆的Java线程问题。面试官只是想确信面试者有…

linux es连接mysql_Linux下ES,kibana,mysql,kafka,zookeeper启动关闭方式

Linux下ES&#xff0c;kibana,mysql,kafka&#xff0c;zookeeper启动关闭方式ES前台方式启动切换到ES的bin目录下&#xff0c;执行./elasticsearch命令关闭窗口或者ctrlc会停止运行后台方式启动同样切换到ES的bin目录下&#xff0c;执行 ./elasticsearch -d 命令查看实时的日志…

java.util.timertask_java.util.TimerTask翻译

java.utilClass TimerTaskjava.lang.Objectjava.util.TimerTask All Implemented Interfaces:public abstract class TimerTaskextendsObjectimplementsRunnableA task that can be scheduled for one-time or repeated execution by a Timer. 由Timer安排执行一次或重复执行的…

java还值_Java到底是引用传递还是值传递

前言前段时间在群里看到类似这样一个问题&#xff0c;下面的代码会输出什么呢&#xff1f;public void test(){String str "hello";change(str);System.out.println(str);}private void change(String str){str "world";}当时看到这题&#xff0c;瞬间勾…

什么是java中的面向对象编程_什么是面向对象编程

什么是面向对象编程时间&#xff1a;2018-01-23 来源&#xff1a;面向对象编程讲解一.前言其实不管是java还是.net都是属于面向对象程序设计语言&#xff0c;归根结底&#xff0c;它们都离不开面向对象&#xff0c;所以什么是面向对象呢&#xff0c;意思就是object-oriente…

java两个长度不同数组_两组数组,长度不一样,如果其中一个数组的值在另一个中不存在,则不符合要求.怎么算?...

思路一先找到最长的数组&#xff0c;然后循环短的数组并判断元素是否在长数组中public class Main {public static void main(String[] args) throws CloneNotSupportedException {String[] strArr1{"ee","aa","bb","cc"};String[] st…