java内存优化和性能优化的方法,Java程序性能优化宝典

  java内存优化和性能优化的方法,Java程序性能优化宝典

  00-1010JIT编译器版本默认情况JVM如何选择编译器?如何判断当前环境下jvm使用的编译器?代码缓存满了会怎么样?如何通过默认的代码缓存大小来确定合适的代码缓存?如何监控代码缓存?

  

目录

JIT编译器有不同的版本,最终使用哪一个取决于您使用的系统平台。在上一篇文章中,我们说过编译器有-client和-server,

 

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

  -client 32位客户端编译器-server 32位服务器编译器-d64 64位服务器编译器如果你的系统是32位的,那么你只能使用32位JVM。如果你是64位系统,可以选择32位或者64位系统。

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

  版本-客户端-服务器-d64linux 32位32位客户端32位服务器错误linux 64位64位服务器64位服务器windows 32位32位客户端32位服务器错误windows 64位64位服务器64位服务器64位服务器64位服务器macOS64位服务器64位服务器64位服务器我们使用java8。默认情况下,使用服务器编译器,并打开分层编译。

  00-1010如果不指定编译器的参数,JVM如何选择使用哪个编译器?

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

  在64位系统中,无论一台机器有多少个CPU,都会使用服务器编译器。在32位系统中,如果只有一个CPU,那么客户端编译器将用于多个CPU,而服务器编译器将被使用。

  

JIT编译器版本

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

 

  [root @ public-Server 9 esmp]# Java-version Java version 1 . 8 . 0 _ 172 Java(TM)SE运行时环境(Build 1 . 8 . 0 _ 172-B11)Java HotSpot(TM)64位服务器VM (Build 25.172-B11,混合模式)如上所示,64位服务器编译器用于Linux环境。

  小节:

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

  常规的调优可能是选择不同的编译器版本,开放式分层编译等。本章将详细分析除此之外的编译器优化场景。

  00-1010JVM编译完代码后会将编译好的汇编语言指令集保存在代码缓存中。代码缓存的大小是固定的,换句话说,jvm可以编译的代码量是固定的。

  我们前面提到,如果代码没有编译成汇编语言,就会贯穿解释和执行,性能会大打折扣。所以如何控制代码缓存的大小是我们可以优化的一个点。

  00-1010通常使用客户端编译器时,会占用大量的代码缓存,因为在运行过程中需要编译大量的代码。相反,服务器编译器采用优先级编译的方式,运行时只编译热代码,代码缓存不那么满。综上所述,在使用分层编译时,存在一定的代码缓存满的可能性。

  

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

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

 

  版本编译器类型代码缓存大小(MB) java 732位客户端32java732位服务器32java732位服务器分层编译48java832位服务器分层编译240java864位服务器分层编译240从上面可以看出,java 7的代码缓存较小,容易出现问题。这就是为什么java7默认不开启层次编译,而java8开启了。

  我们可以通过以下命令来检查它

  看当前代码缓存的大小,我这里是java8:

  

[root@hecs-402944 opt]# jps14186 Jps1434 jar655 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 代码缓存优化内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: