查看Java性能权威指南笔记的源代码
←
Java性能权威指南笔记
跳转到:
导航
、
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== JIT 编译调优 == * 选择 client 或者 server,或者分层编译,启动时间选择 client,批处理选择分层编译,长时间运行的选择 server。分层编译选项 -XX:+TieredCompilation,分层编译隐含了 -server 选项。 * 64 位机器上, java8 默认开启了 server 编译,同时也是分层编译。隐藏的逻辑是 32 位机器更看重启动时间,而 64 位更看重长期运行的性能。 * 中级调优 ** 调整代码缓存,如果在日志(标准错误或者输出)中看到 CodeCache is full的信息,表示 JIT 代码缓存满了,可以通过 -XX:ReservedCodeCacheSize 来设置代码缓存大小,分层编译容易达到代码缓存上限,特别是在 JDK7 上,因此应该监控(jconsole memory)。 ** 编译阈值 :方法调用计数和循环回边计数器,通过 -XX:CompileThreshold 选项控制,默认是 1500 (client)或者 10000 (server),通常不建议修改,做微基准测试也许可以考虑修改。 ** 监控编译过程: -XX:+PrintCompilation,将打印编译日志: <pre> timestamp compilation_id attribute (tiered_level) method_name size deopt 完成时间 内部任务id(可能乱序) 编译状态 分层层级 方法 大小 逆优化 </pre> 其中编译状态包括 <pre> % OSR,栈上替换。 s 方法是同步的 ! 方法有异常处理器 b 阻塞模式发生的编译 n 为封装本地方法发生的编译 </pre> 逆优化包括 made not entrant 或者 made zombie。 使用 jstat -compiler <pid> 来监控编译状况。或者 jstat -printcompilation pid interval-ms 来监控最近被编译的方法。 * 高级编译调优 ** 设置编译线程数,通过 -XX:CICompilerCount=N ,默认这个值会根据 CPU 来计算,多个 JVM 运行的时候应该适当减少。编译队列默认是异步执行,可以通过 -XX:+BackgroundCompilation 来修改(默认 true)。编译队列并不是严格按照先进先出顺序来编译的,热点方法可能被优先编译。 ** 方法内联默认开启,不建议关闭,关闭可以通过 -XX:-Inline 关闭,方法是否内联取决于它有多热以及它的大小。方法如果很热,但是只有在它的大小小于 325 字节的时才会内联( -XX:MaxFreqInlineSize=N 修改),否则,只有方法很小时,即小于 35 字节(-XX:MaxInlineSize=N 设置)时才会内联。几乎用不着调节内联参数。 ** 逃逸分析, -XX:+DoEscapeAnalysis,默认为 true,JVM会做一些相对激进和复杂的优化,逃逸分析可能会给不正确的同步代码引入 bug。 * 逆优化 ** 先前的优化不再有效(例如所涉及的对象类型发生了变化),就会发生代码逆优化,回到之前编译的版本。 ** 逆优化会对性能产生一些小而短暂的影响,不过新编译的代码会尽快地再次热身。 ** 分层编译的时候,如果代码之前由 client 编译器编译而现在由 server 编译器优化,也会发生逆优化。 * 分层编译的层级,5种执行级别 <pre> 0 : 解释 1: 简单 c1 编译代码 2: 受限的 c1 编译代码 3: 完全 c1 编译代码 4: c2 编译代码 </pre> 多数方法第一次编译级别是 3,如果足够频繁,可能编译成级别 4.不建议人为修改级别。 * 无论有没有 final 关键字,都不会影响性能。关于 final https://www.zhihu.com/question/21762917 https://www.zhihu.com/question/28730233 * 不用担心 getter/setter,因为他们很小,很容易被内联。 * 代码越简单,优化越多。
返回到
Java性能权威指南笔记
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面