草庐IT

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

躺柒 2023-03-28 原文

1. 编译阈值

1.1. 一旦代码执行到一定次数,就达到了它的编译阈值,编译器就会认为它有足够的信息来编译代码

1.2. 在当前的JVM中,优化阈值的意义不大

1.2.1. 从JDK 7以及更早期遗留下来的

1.3. -XX:CompileThreshold=N

1.3.1. 当禁用分层编译时有效

1.3.2. 默认值是10 00

1.3.3. 降低这个标志的值可以改善使用C2编译器的应用程序的启动时间

1.3.3.1. 可能会导致一些方法被编译,而这些方法本来是永远都不会被编译的

1.4. 编译器使用的计数器会随着方法和循环的执行增加计数,但是它们也会随着时间的推移而减少

1.4.1. 计数器只是方法或循环最近热度的相对度量

1.4.2. 有些频繁执行的代码可能永远不会被C2编译器编译,即使这个程序永远运行

1.5. -XX:Tier3InvocationThreshold=N

1.5.1. 默认值200

1.5.2. 让C1编译器更快地编译方法

1.6. -XX:Tier4InvocationThreshold=N

1.6.1. 默认值5000

1.6.2. 让C2编译器更快地编译方法

2. 编译线程

2.1. 调用次数更多的方法有更高的优先级

2.1.1. 可以确保最重要的方法先被编译

2.2. 需要编译的代码会放在编译队列中

2.2.1. 队列中的代码越多,应用程序达到最佳性能需要的时间就越长

2.3. C1编译器和C2编译器有不同的队列

2.3.1. 对于放在编译队列中的方法,编译是异步进行的

2.4. -XX:CICompilerCount=N

2.4.1. JVM用来处理队列的总线程数

2.4.2. 三分之一(至少一个)用来处理C1编译器队列

2.4.3. 剩下的线程(也是至少一个)用来处理C2编译器队列

2.4.4. 如果分层编译被禁用,则只启动给定数量的C2编译器线程

2.5. 在Docker容器中运行旧版本的JDK 8会导致自动优化出问题

2.5.1. 需要手动将此标志设置为需要的值

2.6. 可用的CPU有限,较少的线程竞争系统资源对性能有益

2.6.1. 减少线程数量可以帮助提升整体吞吐量

2.6.2. 代价是预热期会持续更长时间

2.7. -XX:+BackgroundCompilation

2.7.1. 默认值为true

2.7.1.1. 意味着队列会进行异步处理

2.7.2. 设置为false

2.7.2.1. 一旦方法可以被编译,想要执行它的代码就会等待,直到方法实际上完成编译,而不是继续在解释器中执行

2.8. -Xbatch

2.8.1. 可以禁用后台编译

3. 内联

3.1. 对性能提升非常重要

3.1.1. 编译器能做的最有利的优化,特别是对于属性封装良好的面向对象代码

3.1.2. 不要害怕小方法,特别是getter和setter,因为它们很容易被内联

3.2. -XX:-Inline

3.2.1. 默认启用

3.3. -XX:MaxFreqInlineSize=N

3.3.1. 频繁内联

3.3.2. 默认325字节

3.3.3. 一个方法因为调用得很频繁而可以被内联,那么只有在它的字节码小于325字节时

3.4. -XX:MaxInlineSize=N

3.4.1. 正常内联

3.4.2. 默认35字节

3.4.3. 只有在字节码小于35字节时,方法才会被内联

3.4.4. 它可能会缩短测试所需的预热时间,但是不太可能对一个长期运行的应用程序产生很大影响

3.5. 注意事项

3.5.1. 将MaxInlineSize的值设置为大于35字节,意味着一个方法在首次调用时可能就被内联了

3.5.2. 如果方法经常被调用,就说明它的性能重要得多,它总归是会被内联的(假设它小于325字节)

4. 逃逸分析

4.1. 编译器能够进行的最复杂的优化

4.1.1. 常导致微基准测试出错

4.1.2. 可以产生更快的代码,但复杂循环结构和大型方法限制了有效性

4.2. -XX:+DoEscapeAnalysis

4.2.1. 默认值是true

4.2.2. C2编译器会进行大幅度的优化

4.2.3. 在极少数情况下,它会出错

4.2.4. 禁用这个特性可能会带来更稳定的代码

有关读Java性能权威指南(第2版)笔记08_即时编译器中的更多相关文章

  1. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  2. ruby - 即时确定方法的可见性 - 2

    我正在编写一个方法,它将在一个类中定义一个实例方法;类似于attr_accessor:classFoocustom_method(:foo)end我通过将custom_method函数添加到Module模块并使用define_method定义方法来实现它,效果很好。但我无法弄清楚如何考虑类(class)的可见性属性。例如,在下面的类中classFoocustom_method(:foo)privatecustom_method(:bar)end第一个生成的方法(foo)必须是公共(public)的,第二个(bar)必须是私有(private)的。我怎么做?或者,如何找到调用我的cust

  3. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  4. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  5. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  6. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  7. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  8. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  9. 【Java入门】使用Java实现文件夹的遍历 - 2

    遍历文件夹我们通常是使用递归进行操作,这种方式比较简单,也比较容易理解。本文为大家介绍另一种不使用递归的方式,由于没有使用递归,只用到了循环和集合,所以效率更高一些!一、使用递归遍历文件夹整体思路1、使用File封装初始目录,2、打印这个目录3、获取这个目录下所有的子文件和子目录的数组。4、遍历这个数组,取出每个File对象4-1、如果File是否是一个文件,打印4-2、否则就是一个目录,递归调用代码实现publicclassSearchFile{publicstaticvoidmain(String[]args){//初始目录Filedir=newFile("d:/Dev");Datebeg

  10. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

随机推荐