您现在的位置是:群英 > 开发技术 > 编程语言
Java性能如何优化,代码缓存方法是什么
Admin发表于 2022-10-14 17:56:32479 次浏览
关于“Java性能如何优化,代码缓存方法是什么”的知识点有一些人不是很理解,对此小编给大家总结了相关内容,文中的内容简单清晰,易于学习与理解,具有一定的参考学习价值,希望能对大家有所帮助,接下来就跟随小编一起学习一下“Java性能如何优化,代码缓存方法是什么”吧。

JIT编译器版本

JIT编译器有不同的版本,而最终你使用哪种,取决于你所使用的系统平台。前面的文章我们说到编译器有-client-server

具体划分应该是如下所示:

  • -client 32位client编译器
  • -server 32位server编译器
  • -d64 64位server编译器

如果你的系统是32位,那么你只能使用32位JVM,如果你是64位系统,那么可以选择32位或64位系统。

不同jvm的编译器版本如下:

jvm版本 -client -server -d64
linux 32位 32位client 32位server 出错
linux 64位 64位server 64位server 64位server
windows 32位 32位client 32位server 出错
windows 64位 64位server 64位server 64位server
macOS 64位server 64位server 64位server

我们使用的java8,默认使用的都是server编译器,同时是开启分层编译的。

默认情况JVM如何选择编译器?

假如我们没有指定编译器的参数,那么JVM是如何选择使用何种编译器的呢?

实际上jvm是考虑机器的CPU数目:

  • 在64位系统,无论机器多少CPU,都会使用server编译器
  • 在32系统
    • 如果只有一个cpu,那么使用client编译器
    • 多个cpu,使用server编译器。

如何判断当前环境jvm使用的编译器?

我们最经常使用的查看java版本命令,就可以在最后一行展示当前所使用的编译器类型:

[root@public-server9 esmp]# java -version
java version "1.8.0_172"
Java(TM) SE Runtime Environment (build 1.8.0_172-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.172-b11, mixed mode)

如上所示,Linux环境下使用的是64位server编译器。

小节:

不同的平台环境对应着不同的java版本,不同的java版本又对应着不同的编译器版本。我们在使用的时候,只需要选择对应于平台的java版本,不需要手动指定编译器,仰仗于平台所支持的编译器即可。

常规的调优可能就是选择不同的编译器版本,开放分层编译等。本章,将会具体分析除此以外的编译器优化场景。

代码缓存

JVM在编译代码后,会在代码缓存当中保存编译后的汇编语言指令集。而代码缓存的大小是固定的,换句话说,jvm能够编译的代码数量就是固定的。

前面我们提到过,如果没有被编译成汇编语言的代码,会通过解释执行的方式去运行,性能会大幅下降。所以如何控制代码缓存的大小,是一个我们可以优化的点。

代码缓存占满发生在什么情况?

通常在使用client编译器时,会占用大量的代码缓存,因为其在运行过程中需要编译的代码非常多。相反,server编译器采用优先编译的方式,运行时只会对热点代码进行编译,所以发生代码缓存占满的情况较少。综上所述,在使用分层编译的时候,也有一定的可能存在代码缓存被占满的情况。

代码缓存默认大小

代码缓存在不同版本的java当中,默认代码缓存大小也不相同,如下仅展示java7和java8的部分:

java版本 编译器类型 代码缓存大小(MB)
java7 32位 client 32
java7 32位 server 32
java7 32位 server 分层编译 48
java8 32位 client 32
java8 32位 server 分层编译 240
java8 64位 server 分层编译 240

如上可以发现,java7的代码缓存较小,比较容易出现问题。这也是为什么java7没有默认开启分层编译,而java8则默认开启。

我们可以通过下面的命令查看当前代码缓存的大小,我这里是java8:

[root@hecs-402944 opt]# jps
14186 Jps
1434 jar
655 WrapperSimpleApp
[root@hecs-402944 opt]# jinfo -flag ReservedCodeCacheSize 1434
-XX:ReservedCodeCacheSize=251658240

251658240是字节,换算后刚好240M。

如何确定正好的代码缓存?

其实这个需要根据使用情况进行实际调整,通过ReservedCodeCacheSize可以指定大小。

但是代码缓存的大小的设置要考虑到服务器实际内存的大小。如果我们将其分配过大,则这部分空间会被jvm预留出来,请确定你的服务器是否有足够大的内存。

另一个方面,32位的jvm被允许使用的最大内存为4g,其中还包括堆内存,元空间,栈,以及本地方法等等,所以代码缓存总是会被限制大小的。

在64位机器也不是越大越好,每个机器上的进程有自己的最大内存空间,超过它也是没有效果的。

综上所述,有些大型应用就需要我们对代码缓存进行调优。

如何监控代码缓存?

前面我们学习过jconsole的使用,如果你的服务允许开启jmx服务的话,那么就可以进行监控了,文章地址如下:java性能分析jconsole详解

如下图所示,就是监控代码缓存的动态图标:

我们可以根据监控的结果去调整自己服务的代码缓存大小,我这个服务举例默认的240M还有很大的差距,其实是不需要进行调优的。



到此这篇关于“Java性能如何优化,代码缓存方法是什么”的文章就介绍到这了,感谢各位的阅读,更多相关Java性能如何优化,代码缓存方法是什么内容,欢迎关注群英网络资讯频道,小编将为大家输出更多高质量的实用文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

标签: java性能优化
相关信息推荐
2022-10-08 17:52:25 
摘要:在删除缓存的时候,我们在一些场景下需要批量删除,但不确定具体的key值,可通过匹配的方式进行查询后删除。
2022-08-27 17:11:03 
摘要:本篇文章给大家带来了关于javascript的相关知识,其中主要介绍了Module模块化编程的优点,随着前端功能越来越复杂,前端代码日益膨胀,为了减少维护成本,提高代码的可复用性,前端模块化势在必行,下面一起来看一下,希望对大家有帮助。
2022-07-23 17:48:58 
摘要:PHP8 的 Alpha 版本,过几天就要发布了,其中包含了不少的新特性,当然我自己认为最重要的还是 JIT,这个我从 2013 年开始参与,中间挫折无数,失败无数后,终于要...
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部