您好,欢迎访问这里是您的网站名称官网!
企业新闻
联系我们
大发-大发娱乐空调设备工厂站
邮箱:admin@youweb.com
电话:400-123-4567
地址:广东省广州市天河区88号
当前位置: 首页 > 新闻动态 > 企业新闻

企业新闻

java性能优化--编译器优化
发布时间:2024-04-22 14:43:54浏览次数:

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情

前一篇讲到java是即使编译器JIT,本章我们来具体学习一下java有哪几种编译器类型,如何根据业务场景选择最合适的编译器。

通常有两种编译器,我们针对编译器的调优,主要是如何选择合适的编译器。

这两汇总编译器分别是和。我们在选择编译器时使用的参数分别是和。

在有些地方,这两种编译器会被称作:

  • C1编译器 - client
  • C2编译器 - server

上面提到的两种编译器,主要不同在于编译时机不同。

client编译器开启编译的时机相比server编译器要早,代码开始执行阶段,client编译器相对要更快,编译早意味着可以编译更多的代码。

而server编译器通常在运行过程中,当有代码变热时,对热点代码编译,在等待编译的时候可以做很多事情,可以对编译代码进行更好的优化,是的编译后的代码,相比client编译器有更快的运行速度。

相信会有人提出这种疑问,让jvm自己选择使用何种编译器不是更好吗?开始时使用client,运行中使用server?

这种技术被称为技术。在java7的版本中引入分层编译,同时不断地进行优化。分层编译的引入使应用能更好的发挥性能。在JAVA7当中,由于存在一些问题,默认是关闭的,而在JAVA8当中,分层编译是默认开启的,我们可以使用如下的命令查看:


表示开启,我使用的java8,默认开启。

通过前面的描述,我们知道编译器分为三种:

  • client
  • server
  • -XX:+TieredCompilation

那么三种编译器的效率是怎样的?外面不展示演示过程,直接给结论。分为不同的场景:

如果以快速启动时间为目标:

  • 少量代码,
  • 代码较多,
  • 大量较多,

在绝大多数场景,优化启动时间可能都不是主要的任务,所以这里推荐使用:或者.

如果以批量处理效率为目标:

  • 少量数据,
  • 较多数据,
  • 大量数据,

通过上面我们知道,分层编译是批量处理的最佳方式。

长时间运行,其实应该是你的应用经过了热身,对于热点代码进行了重新编译之后,我们来看看他们分别的如何:

  • 热身极少时间,
  • 热身较多时间,
  • 热身大量时间,

从上面我们能够知道,其实无论时间的长短,client的吞吐量并不会有太大的波动。但是client的吞吐量都小于另外两种,而当时间足够长的情况下,server和分层编译的吞吐量基本相同。

所以长时间运行的应用可以使用 server 或者 -XX:+TieredCompilation 。

平台注册入口