java性能优化之代码缓存优化

 更新时间:2022年07月08日 09:55:40   作者:​ 我犟不过你 ​  
这篇文章主要介绍了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位client32位server出错
linux 64位64位server64位server64位server
windows 32位32位client32位server出错
windows 64位64位server64位server64位server
macOS64位server64位server64位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)
java732位 client32
java732位 server32
java732位 server 分层编译48
java832位 client32
java832位 server 分层编译240
java864位 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 代码缓存优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven配置仓库的方法步骤

    Maven配置仓库的方法步骤

    本文主要介绍了Maven配置仓库的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java 高并发编程之最实用的任务执行架构设计建议收藏

    Java 高并发编程之最实用的任务执行架构设计建议收藏

    高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求,高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等
    2021-10-10
  • Java实现向Word文档添加文档属性

    Java实现向Word文档添加文档属性

    这篇文章主要介绍了Java实现向Word文档添加文档属性的相关资料,需要的朋友可以参考下
    2023-01-01
  • 你应该知道的21个Java核心技术

    你应该知道的21个Java核心技术

    Java的21个核心技术点,你知道吗?这篇文章主要为大家详细介绍了Java核心技术,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Spring超详细讲解面向对象到面向切面

    Spring超详细讲解面向对象到面向切面

    面向对象编程是一种编程方式,此编程方式的落地需要使用“类”和 “对象”来实现,所以,面向对象编程其实就是对 “类”和“对象” 的使用,面向切面编程,简单的说,就是动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程
    2022-08-08
  • Spring Boot 中的 @PutMapping 注解原理及使用小结

    Spring Boot 中的 @PutMapping 注解原理及使用小结

    在本文中,我们介绍了 Spring Boot 中的 @PutMapping 注解,它可以将 HTTP PUT 请求映射到指定的处理方法上,我们还介绍了 @PutMapping 注解的原理以及如何在 Spring Boot 中使用它,感兴趣的朋友跟随小编一起看看吧
    2023-12-12
  • SpringBoot JMX的基本使用方式

    SpringBoot JMX的基本使用方式

    这篇文章主要介绍了SpringBoot JMX的基本使用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • springmvc 传递和接收数组参数的实例

    springmvc 传递和接收数组参数的实例

    下面小编就为大家分享一篇springmvc 传递和接收数组参数的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • SpringBoot用JdbcTemplates访问Mysql实例代码

    SpringBoot用JdbcTemplates访问Mysql实例代码

    本篇文章主要介绍了SpringBoot用JdbcTemplates访问Mysql实例代码,非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • Java中WeakHashMap的使用详解

    Java中WeakHashMap的使用详解

    这篇文章主要介绍了Java中WeakHashMap的使用详解,WeakHashMap是一种弱引用的Map,底层数据结构为数组链表,与HashMap相比,WeakHashMap的区别在于它的key存储为弱引用,在垃圾回收时,如果key没有被强引用所引用,那么key会被回收掉,需要的朋友可以参考下
    2023-09-09

最新评论