读Java性能权威指南(第2版)笔记07_即时编译器上

java性能优化权威指南---即时编译器(Just-in-time,JIT) 目录 1、JIT编译器概览 2、调优入门:选择编译器类型(client、server或者两者同时使用) 1)、优化启动 2)、优化批处理 3)、优化长时间运行的应用 3、java和JIT编译器版本 4、编译器中级调优 1)、调优代码缓存 2)、编译阈值 3)、检测编译过程 5、高级编译器调优 1)、编译线程 2)、内联(默认开启,-XX:+PrintInling) 3)... 阅读详情

1. 概览

1.1. 即时编译器是Java虚拟机的核心

1.1.1. just-in-time compiler,简称JIT compiler

1.1.2. 即时编译器会频繁地使用寄存器

1.2. 编译型语言

1.2.1. 程序是以二进制(编译后的)代码的形式发布的

1.2.1.1. 汇编代码是针对特定CPU的

1.2.1.2. 兼容的CPU可以执行同一个二进制文件

1.2.2. 如C++和Fortran

1.3. 解释型语言

1.3.1. 同样的程序源代码就可以在任何CPU上运行

1.3.2. 如PHP和Perl

1.4. 中间地带

1.4.1. 编译为一种中间的低级语言

1.4.1.1. Java字节码

1.4.1.2. 由JVM进一步编译成汇编语言

1.4.2. 利用了脚本语言的平台独立性和编译型语言的原生性能

1.4.3. 在代码执行时将其编译为平台相关的二进制代码

1.4.3.1. 是“即时”的

1.5. 热点编译

1.5.1. 只有一小部分代码会频繁执行,应用程序的性能则主要取决于这些代码执行的快慢

1.5.2. 关键代码被称为应用程序的热点

1.5.2.1. 这部分代码执行得越多,就说这部分代码越热

1.5.3. 只执行一次的代码,解释执行Java字节码会更快一点

1.5.4. 代码是频繁调用的方法或者迭代多次的循环,编译它就是值得的

2. 分层编译

2.1. 现在所有JVM都在使用的技术

2.2. -XX:-TieredCompilation标志

2.2.1. 默认值是true

2.3. 两种类型

2.3.1. client编译器

2.3.1.1. C1编译器1

2.3.2. server编译器

2.3.2.1. C2编译器2

2.4. 编译代码的时机

2.4.1. 基于程序会运行多长时间和程序的启动时间有多重要

2.4.2. C1编译器比C2编译器更早开始编译

2.4.3. 在代码执行的开始阶段,C1编译器的速度更快

2.4.4. C2编译器在等待时获得了信息,这些信息让C2编译器能够对编译后的代码进行更好的优化

3. 编译器标志

3.1. 代码缓存

3.1.1. 一种设定了最大值的系统资源

3.1.2. 影响JVM可以运行的编译后的代码总量

3.1.3. 最大值

3.1.3.1. -XX:ReservedCodeCacheSize=N

3.1.3.2. 默认240 MB

3.1.4. 初始大小

3.1.4.1. -XX:InitialCodeCacheSize=N

3.1.4.2. 默认2496 KB

3.2. Java 11中

3.2.1. 非方法代码(nonmethod code)

3.2.1.1. -XX:NonMethodCodeHeapSize=N

3.2.2. 性能分析代码(profiled code)

3.2.2.1. -XX:ProfiledCodeHeapSize=N

3.2.3. 非性能分析代码(nonprofiled code)

3.2.3.1. -XX:NonProfiledCodeHeapSize=N

3.3. 检查编译过程

3.3.1. 不是用来优化的,它不会提升应用程序的性能

3.3.2. -XX:+PrintCompilation标志

3.3.2.1. 默认为false

3.3.3. attributes字段由5个字符构成,表示正在编译的代码状态

3.3.3.1. %

3.3.3.1.1. 栈上替换(on-stack replacement,OSR)

3.3.3.2. s

3.3.3.2.1. 方法是同步的

3.3.3.3. !

3.3.3.3.1. 方法有异常处理器

3.3.3.4. b

3.3.3.4.1. 在阻塞模式下发生的编译

3.3.3.5. n

3.3.3.5.1. 原生方法封装时发生的编译

4. 分层编译级别

4.1. 如果没有额外的CPU周期可用,你能做的就是尽量缩减应用程序的大小

4.2. C1编译器有3个级别,所有总共有5个编译级别

4.2.1. 0

4.2.1.1. 解释代码

4.2.2. 1

4.2.2.1. 简单C1编译代码

4.2.3. 2

4.2.3.1. 受限C1编译代码

4.2.4. 3

4.2.4.1. 完全C1编译代码

4.2.5. 4

4.2.5.1. C2编译代码

4.3. C1编译器得到代码是如何使用的信息之后,会利用这些信息进行优化,然后才开始编译

4.4. 如果C2编译器队列已满,那么队列中的方法会被取出,在级别2上编译

4.5. 如果C1编译器队列已满,那么计划在级别3上编译的方法在等待编译的同时,可以进行级别4的编译

4.5.1. 它会被快速编译到级别2,然后转到级别4

4.6. 不重要的方法可以从级别2或者级别3开始编译

4.6.1. 它们本质上不那么重要,所以会回到级别1

4.7. 如果代码发生了逆优化,就会回到级别0

5. 逆优化(deoptimization)

5.1. 编译器不得不“撤销”之前的编译

5.1.1. JVM替换之前编译的代码的过程

5.2. 发生情况

5.2.1. 代码被丢弃(made not entrant)

5.2.2. 产生僵尸代码(made zombie)

5.3. 代码被丢弃的原因

5.3.1. 类和接口的工作方式

5.3.1.1. 逆优化对性能并没有太大影响

5.3.2. 分层编译的工作方式

5.3.2.1. 当代码被C2编译器编译时,JVM必须替换已经被C1编译器编译的代码

5.3.2.2. 它将旧代码标记为丢弃,并用逆优化机制替换为新编译的(更高效的)代码

5.3.2.3. 让代码变得更快

5.4. 逆优化僵尸代码

5.4.1. 僵尸代码的小规模重新编译,不会对大多数应用程序产生显著的影响

 

【产品经理修炼之道】- 优惠券系统从入门到精通(一) 为了满足企业的优惠券业务,优惠券系统一般需要包含哪些功能?这篇文章里,作者从架构、功能等维度做了拆解,一起来看看吧。此部分主要讲解为满足公司优惠券业务,需要优惠券系统必须包含哪些功能,即优惠券架构图。 阅读详情

相关推荐

树莓派4B+DroneKit实战:手把手教你用Python控制无人机飞行(附避坑指南)

本文提供了一份详尽的树莓派4B与DroneKit配置实战指南,涵盖从硬件选型、软件环境搭建到Python编程控制无人机的完整流程。文章重点解决了ARM架构下的兼容性问题、MAVLink通信配置及端口管理等常见难题,并附带了实用的避坑指南和代码示例,帮助开发者构建稳定可靠的无人机控制系统。

weixin_29056781的博客 410

JDK14性能管理工具:Jconsole详解

我们在开发java项目的时候,或多或少都会去用到Java的性能管理工具。有时候是为了提升应用程序的性能,有时候是为了查找java应用程序的bug。 性能监控和调试工具在英文中叫做profile tool,提起这种工具大家可能会想到一些非常出名的jprofile等收费工具,其实JDK也自带了一些性能调试工具,比如JMC和Jconsole。 JMC现在已经和JDK的版本独立出来了,详情请参考我之前的文章:[JDK 14的新特性:JFR,JMC和JFR事件流](http://www.flydean.com/j

程序那些事 8601

手机拍照对焦快准狠的秘密:一文看懂PDAF、Dual Pixel和Super PD的区别

本文深入解析手机拍照中的三种主流相位检测自动对焦(PDAF)技术:Shield Pixel、Super PD和Dual Pixel。通过对比它们的原理、优缺点及实际表现,帮助读者理解不同技术的对焦速度、暗光表现和画质影响,从而做出更明智的购机选择。

weixin_26985923的博客 488

深入JVM - Code Cache内存池

深入JVM - Code Cache内存池 1. 本文内容 本文简要介绍JVM的 Code Cache(本地代码缓存池)。 2. Code Cache 简要介绍 简单来说,JVM会将字节码编译为本地机器码,并使用 Code Cache 来保存。 每一个可执行的本地代码块,称为一个 nmethod。 nmethod 可能对应一个完整的Java方法,或者是内联后的方法。 即时编译器(just-in-time,JIT)是代码缓存区的最大消费者,所以此区域又被开发者称为 JIT code cache。 3. 对 C

铁锚的优快云博客 1万+

告别Modern Standby!Win10/11强制S3睡眠的终极指南(含BIOS设置避坑)

本文是针对Windows 10/11用户因Modern Standby(S0低电量待机)导致睡眠耗电、发热问题的终极解决方案。文章详细对比了Modern Standby与传统S3睡眠(Suspend to RAM)的本质区别,并提供了从系统诊断、注册表修改、BIOS/UEFI设置避坑到驱动优化的完整步骤,旨在帮助用户强制启用稳定、省电的S3睡眠模式,彻底告别睡眠噩梦。

n7o8p的博客 804

C++ PCL点云处理实战专栏

工业级点云处理技术学习资源,涵盖电力、建筑、隧道等领域的实战案例。内容分为三阶段:代码原理(算法认知)、动态库(项目验证)和完整代码(定制开发)。

weixin_45196569的博客 1118

java分层编译

编译没学完直接变异了🧬java源代码文件变成可直接执行的机器指令:java转成class,class转换成机器指令。

天生我材必有用,千金散尽还复来。 229

学Simulink——控制执行场景实例:基于Simulink的智能车辆电子稳定控制(ESC)仿真

本文完成了基于 Simulink 的智能车辆电子稳定控制(ESC),实现了:✅ 构建含轮胎非线性的车辆动力学模型✅ 设计滑模横摆稳定性控制器✅ 实现四轮制动力分配逻辑✅ 验证在双移线低附着场景下的卓越稳定性✅ 为主动安全控制系统开发提供完整范式。

xiaoheshang_123的博客 528

JVM Code Cache代码缓存简介

简而言之,JVM Code Cache (代码缓存)是JVM存储编译成本机代码的字节码的区域。我们将可执行本机代码的每个块称为nmethod。nmethod可能是一个完整的或内联的Java方法。即时(JIT)编译器是代码缓存区的最大消费者。这就是为什么一些开发人员将此内存称为JIT代码缓存。...

m0_67402026的博客 1085

Java Swing教程-16. Swing中的图形绘制

这篇教程介绍了Java Swing中的图形绘制功能,主要内容包括: Graphics类的基本使用 - 介绍了如何重写paintComponent方法实现自定义绘制,以及基本图形绘制方法(线条、矩形、椭圆、多边形等) 文本与图片绘制 - 讲解了文本绘制方法、字体设置和图片加载绘制技术 颜色与字体设置 - 包括预定义颜色、RGB自定义颜色、透明色设置以及字体样式控制 案例实现 - 提供了一个简单绘图程序的框架,支持鼠标绘制不同图形、选择工具和自定义颜色等功能 教程通过代码示例详细演示了各种绘图操作,适合Java

无 233

【应用】什么是Azure?一文读懂微软云的核心逻辑与全球版图

作为微软的核心云计算服务平台,Azure不仅是数字化转型的引擎,更是全球企业在构建、扩展与优化IT基础设施时的首选平台。在这篇文章中,我们将深入探讨Azure云服务平台的各个方面,涵盖其核心优势、架构、功能、应用场景以及未来发展趋势。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1960

作业8:常用java命令(二)

一、jinfo(Configuration Info for Java) 1、功能:jinfo可以实时地查看和调整虚拟机的各项参数。 2、参数: 选项 作用 -flag name 打印改名字的VM设置 -flag +|- name 是否打印某个VM设置 -flag name=value 设置某个VM设置为某个值 -sysprops 打印系统中所有Java设置 ...

weixin_30493321的博客 210

Python爬虫实战:构建高可用静态网页爬虫 - 以 Quotes 网站数据采集为例!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 461

《Tomcat权威指南》第二版学习笔记

本篇是《Tomcat权威指南》第二版学习笔记,Jason Brittain著,英文名是:Tomcat:The Definitive Guide,中国电力出版社,2009.9出版。 在工作中经常使用Tomcat、JBoss、Jetty等Java容器,但都不曾系统的学习总结过,本次拿出一个周末的时间,通过本书,较为系统的学习一下Tomcat,并结合互联网的参考资料,写下这篇学习总结,颇有收获。

Java之旅 2794

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

读Java性能权威指南(第2版)笔记09_即时编译器下

GraalVM优化代码时并没有C2编译器那么激进,所以对于运行得足够久的应用程序,传统的JVM最终会胜出。如果不让预编译的方法被C2编译器编译,那么服务器预热后的性能就会比它最终可能达到的性能差。给定足够长的预热期,禁用分层编译时的执行情况和开启时应该是差不多的。生成的二进制文件启动速度很快,特别是相较于在JVM中运行的程序。对于很小的、快速运行的程序没有帮助,甚至会阻碍它们的运行。原生程序的内存占用在开始时比传统JVM少得多。当在内存受限的环境中运行时有理由关闭它。对于比较大的程序有好处。

lyingSeven的博客 375

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java性能权威指南(第2版)读后总结与感想

语言在不断进化发展、jvm也在不断进化发展,在采用java 8 不变的情况下,使用包含新的垃圾回收算法的jdk,使用新的垃圾回收算法能够获得更好的性能体验。了解不难,学精很难,性能调优不仅仅是技术活,更是一门艺术,需要考虑的场景、判断的条件纷繁复杂,各种开关也会相互影响,使用的不好,还不如采用默认方式。验证、测试自然少不了各种工具,既有原生自带的,也有开源或者商业的第三方工具,在这个方面,介绍的也较详细,能够帮忙我们分析性能问题的源头。有些性能建议是包治百病的,比如,使用更小的对象;

lyingSeven的博客 209

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

读Java性能权威指南(第2版)笔记08_即时编译器中

一旦代码执行到一定次数,就达到了它的编译阈值,编译器就会认为它有足够的信息来编译代码。编译器使用的计数器会随着方法和循环的执行增加计数,但是它们也会随着时间的推移而减少。在Docker容器中运行旧版本的JDK 8会导致自动优化出问题。可用的CPU有限,较少的线程竞争系统资源对性能有益。在当前的JVM中,优化阈值的意义不大。C1编译器和C2编译器有不同的队列。调用次数更多的方法有更高的优先级。需要编译的代码会放在编译队列中。编译器能够进行的最复杂的优化。

lyingSeven的博客 218

【读书笔记】Java性能权威指南 读书笔记

文章目录1.导论2.性能测试方法3, Java性能调优工具3.2 java 监控工具3.2.1 基本信息3.3 性能分析工具3.3.1 采样分析器3.3.2 探查分析器3.3.3 阻塞方法和线程时间线3.3.4 本地分析器3.4 Java任务控制3.4.1 Java飞行记录器4. JIT编译器4.1 编译器介绍4.2 调优入门: 选择编译器类型4.2.1 优化启动4.2.2 优化批处理4.2.3 优化长时间运行的应用4.3 Java和JIT编译器版本4.4 编译器中级调优4.4.1 调优代码缓存4.4.2 

九师兄 746

《Java性能权威指南》学习笔记

英文版《Java Performance The Definitive Guide》,出版于2014年,中文版出版于2016年,相比于《深入理解Java虚拟机》,讲的更加透彻、准确。适合读一遍,然后做长期参考。 作者Scott Oaks是Oracle公司的一位架构师,专注研究Oracle中间件软件的性能。加入Oracle之前,他曾于Sun Microsystem公司任职多年,在多个技术领域都有建树,包括SunOS的内核、网络程序设计、Windows系统的远程方法调用(RPC)以及 OPEN LOOK虚拟窗口

Java之旅 4960

Java性能优化权威指南-JVM概述和监控调优

HotSpot VM主要分为三部分:HotSpot VM运行时、JIT编译器、垃圾回收器。即时编译器和垃圾回收器是可插拔的,可以选择适合自己的。早期的HotSpot VM是32位的,内存限制为4G。但随着现代内存越来越大,HotSpot VM也支持64位。对象的引用从原来占用4字节32位到8字节64位,占用空间大,触发GC解决方案:Java支持指针压缩,可以将64位压缩为32位【其实是35位,因为对象结构中填充部分的存在,对象的开头指针都是8的整数倍,即后面3位都是0,可以不存储。

m0_50149847的博客 984

Java性能优化权威指南

Java性能优化权威指南

hixiaoxiaoniao的专栏 1083

Tomcat权威指南第二版PDF资源下载介绍:全面掌握Tomcat服务器的宝典

Tomcat权威指南第二版PDF资源下载介绍:全面掌握Tomcat服务器的宝典 去发现同类优质开源项目:https://gitcode.com/ 《Tomcat权威指南第二版PDF资源下载》为您提供了一本全面解析Tomcat服务器各方面内容的权威指南,是学习、使用和优化Tomcat的理想选择。 项目介绍 《Tomcat权威指南第二版》是一本深入浅出地介绍Tomcat服务器各方面知识的书籍,包括安装...

gitblog_06726的博客 1049

java优化 pdf_Java性能优化权威指南 PDF扫描[132MB]

Java性能优化权威指南主要为Java SE 和Java EE 应用的性能调优提供建议。主要包括以下几方面:性能监控、性能分析、Java HotSpot VM 调优、高效的基准测试以及Java EE 应用的性能调优。《Java性能优化权威指南》适合所有Java 程序员、系统调优师和系统架构师阅读。Java性能优化权威指南 目录:第1章 策略、方法和方法论 11.1 性能问题的现状 11.2 性能分...

weixin_30679293的博客 1119

Java性能权威指南-总结2

响应时间测试和吞吐量测试(假设后者是基于客户端-服务器模式)之间的差别是,响应时间测试中的客户端线程会在操作之间休眠一段时间。这被称为思考时间。响应时间测试是尽量模拟用户行为:用户在浏览器输入URL,用一些时间阅读返回的网页,然后点击页面上的链接,花一些时间阅读返回的网页,等等。当测试中引入思考时间时,吞吐量就固定了:指定数量的客户端,在给定思考时间下总是得到相同的TPS(少许差别)。基于这点,测量请求的响应时间就变得重要了:服务器的效率取决于它响应固定负载有多快。

weixin_42583701的博客 943

java权威指南电子书下载,Java性能权威指南pdf

市面上介绍Java的书有很多,但专注于Java性能的并不多,能游刃有余地展示Java性能优化难点的更是凤毛麟角,本书即是其中之一。通过使用JVM和Java平台,以及Java语言和应用程序接口,本书详尽讲解了Java性能调优的相关知识,帮助读者深入理解Java平台性能的各个方面,使程序如虎添翼。通过阅读本书,你可以:运用四个基本原则大程度地提升性能测试的效果使用JDK中自带的工具收集Java应用的性...

weixin_39633134的博客 380

看了这篇【JIT编译器】,你也能说你会java性能优化了!

大家好,我是小菜,一个渴望在互联网行业做到蔡不菜的小菜。可柔可刚,点赞则柔,白嫖则刚! 死鬼~看完记得给我来个三连哦! 本文主要介绍 java性能分析 之 JIT编译器 如有需要,可以参考 如有帮助,不忘 点赞 ❥ 创作不易,白嫖无义! 参考书籍:《Java性能权威指南》 作为Java开发人员,也许在工作中最经常用到的只是 CRUD,解决性能问题 也许不经常接触到,但是也是需要了解一二的!这篇文章小菜带你一起探究 Java中的JIT编译器。 前情概览 即时 JIT(JUst-In-Time)编译器是

Cbuc丶的博客 511
上一篇: 读Java性能权威指南(第2版)笔记06_数据库性能JPA&SpringData
下一篇: 2023年2月随笔-难产的“学系列”
躺柒
博客等级 码龄4年 7004粉丝 1321原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值