当前位置: 首页 > news >正文

个人网站托管页面设计平台

个人网站托管,页面设计平台,安阳网站制作优化,凡科网站怎么建设个人网站↑ 点击上面 “时代Java”关注我们#xff0c;关注新技术#xff0c;学习新知识#xff01;一、导读常见的编译型语言如C#xff0c;通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译#xff0c;处处运行”的特性#xff0c;把编译的过程分成… ↑ 点击上面 “时代Java”关注我们关注新技术学习新知识一、导读常见的编译型语言如C通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译处处运行”的特性把编译的过程分成两部分首先它会先由javac编译成通用的中间形式——字节码然后再由解释器逐条将字节码解释为机器码来执行。所以在性能上Java通常不如C这类编译型语言。为了优化Java的性能 JVM在解释器之外引入了即时(Just In Time)编译器当程序运行时解释器首先发挥作用代码可以直接执行。随着时间推移即时编译器逐渐发挥作用把越来越多的代码编译优化成本地代码来获取更高的执行效率。解释器这时可以作为编译运行的降级手段在一些不可靠的编译优化出现问题时再切换回解释执行保证程序可以正常运行。即时编译器极大地提高了Java程序的运行速度而且跟静态编译相比即时编译器可以选择性地编译热点代码省去了很多编译时间也节省很多的空间。目前即时编译器已经非常成熟了在性能层面甚至可以和编译型语言相比。不过在这个领域大家依然在不断探索如何结合不同的编译方式使用更加智能的手段来提升程序的运行速度。二、Java的执行过程Java的执行过程整体可以分为两个部分第一步由javac将源码编译成字节码在这个过程中会进行词法分析、语法分析、语义分析编译原理中这部分的编译称为前端编译。接下来无需编译直接逐条将字节码解释执行在解释执行的过程中虚拟机同时对程序运行的信息进行收集在这些信息的基础上编译器会逐渐发挥作用它会进行后端编译——把字节码编译成机器码但不是所有的代码都会被编译只有被JVM认定为的热点代码才可能被编译。怎么样才会被认为是热点代码呢JVM中会设置一个阈值当方法或者代码块的在一定时间内的调用次数超过这个阈值时就会被编译存入codeCache中。当下次执行时再遇到这段代码就会从codeCache中读取机器码直接执行以此来提升程序运行的性能。整体的执行过程大致如下图所示1. JVM中的编译器JVM中集成了两种编译器Client Compiler和Server Compiler它们的作用也不同。Client Compiler注重启动速度和局部的优化Server Compiler则更加关注全局的优化性能会更好但由于会进行更多的全局分析所以启动速度会变慢。两种编译器有着不同的应用场景在虚拟机中同时发挥作用。Client CompilerHotSpot VM带有一个Client Compiler  C1编译器。这种编译器启动速度快但是性能比较Server Compiler来说会差一些。C1会做三件事局部简单可靠的优化比如字节码上进行的一些基础优化方法内联、常量传播等放弃许多耗时较长的全局优化。将字节码构造成高级中间表示(High-level Intermediate Representation以下称为HIR)HIR与平台无关通常采用图结构更适合JVM对程序进行优化。最后将HIR转换成低级中间表示(Low-level Intermediate Representation以下称为LIR)在LIR的基础上会进行寄存器分配、窥孔优化(局部的优化方式编译器在一个基本块或者多个基本块中针对已经生成的代码结合CPU自己指令的特点通过一些认为可能带来性能提升的转换规则或者通过整体的分析进行指令转换来提升代码性能)等操作最终生成机器码。Server CompilerServer Compiler主要关注一些编译耗时较长的全局优化甚至会还会根据程序运行的信息进行一些不可靠的激进优化。这种编译器的启动时间长适用于长时间运行的后台程序它的性能通常比Client Compiler高30%以上。目前Hotspot虚拟机中使用的Server Compiler有两种C2和Graal。C2 Compiler在Hotspot VM中默认的Server Compiler是C2编译器。C2编译器在进行编译优化时会使用一种控制流与数据流结合的图数据结构称为Ideal Graph。Ideal Graph表示当前程序的数据流向和指令间的依赖关系依靠这种图结构某些优化步骤(尤其是涉及浮动代码块的那些优化步骤)变得不那么复杂。Ideal Graph的构建是在解析字节码的时候根据字节码中的指令向一个空的Graph中添加节点Graph中的节点通常对应一个指令块每个指令块包含多条相关联的指令JVM会利用一些优化技术对这些指令进行优化比如Global Value Numbering、常量折叠等解析结束后还会进行一些死代码剔除的操作。生成Ideal Graph后会在这个基础上结合收集的程序运行信息来进行一些全局的优化这个阶段如果JVM判断此时没有全局优化的必要就会跳过这部分优化。无论是否进行全局优化Ideal Graph都会被转化为一种更接近机器层面的MachNode Graph最后编译的机器码就是从MachNode Graph中得的生成机器码前还会有一些包括寄存器分配、窥孔优化等操作。关于Ideal Graph和各种全局的优化手段会在后面的章节详细介绍。Server Compiler编译优化的过程如下图所示Graal Compiler从JDK 9开始Hotspot VM中集成了一种新的Server CompilerGraal编译器。相比C2编译器Graal有这样几种关键特性前文有提到JVM会在解释执行的时候收集程序运行的各种信息然后编译器会根据这些信息进行一些基于预测的激进优化比如分支预测根据程序不同分支的运行概率选择性地编译一些概率较大的分支。Graal比C2更加青睐这种优化所以Graal的峰值性能通常要比C2更好。使用Java编写对于Java语言尤其是新特性比如Lambda、Stream等更加友好。更深层次的优化比如虚函数的内联、部分逃逸分析等。Graal编译器可以通过Java虚拟机参数-XX:UnlockExperimentalVMOptions -XX:UseJVMCICompiler启用。当启用时它将替换掉HotSpot中的C2编译器并响应原本由C2负责的编译请求。2. 分层编译在Java 7以前需要研发人员根据服务的性质去选择编译器。对于需要快速启动的或者一些不会长期运行的服务可以采用编译效率较高的C1对应参数-client。长期运行的服务或者对峰值性能有要求的后台服务可以采用峰值性能更好的C2对应参数-server。Java 7开始引入了分层编译的概念它结合了C1和C2的优势追求启动速度和峰值性能的一个平衡。分层编译将JVM的执行状态分为了五个层次。五个层级分别是解释执行。执行不带profiling的C1代码。执行仅带方法调用次数以及循环回边执行次数profiling的C1代码。执行带所有profiling的C1代码。执行C2代码。profiling就是收集能够反映程序执行状态的数据。其中最基本的统计数据就是方法的调用次数以及循环回边的执行次数。通常情况下C2代码的执行效率要比C1代码的高出30%以上。C1层执行的代码按执行效率排序从高至低则是1层2层3层。这5个层次中1层和4层都是终止状态当一个方法到达终止状态后只要编译后的代码并没有失效那么JVM就不会再次发出该方法的编译请求的。服务实际运行时JVM会根据服务运行情况从解释执行开始选择不同的编译路径直到到达终止状态。下图中就列举了几种常见的编译路径图中第①条路径代表编译的一般情况热点方法从解释执行到被3层的C1编译最后被4层的C2编译。如果方法比较小(比如Java服务中常见的getter/setter方法)3层的profiling没有收集到有价值的数据JVM就会断定该方法对于C1代码和C2代码的执行效率相同就会执行图中第②条路径。在这种情况下JVM会在3层编译之后放弃进入C2编译直接选择用1层的C1编译运行。在C1忙碌的情况下执行图中第③条路径在解释执行过程中对程序进行profiling 根据信息直接由第4层的C2编译。前文提到C1中的执行效率是1层2层3层第3层一般要比第2层慢35%以上所以在C2忙碌的情况下执行图中第④条路径。这时方法会被2层的C1编译然后再被3层的C1编译以减少方法在3层的执行时间。如果编译器做了一些比较激进的优化比如分支预测在实际运行时发现预测出错这时就会进行反优化重新进入解释执行图中第⑤条执行路径代表的就是反优化。总的来说C1的编译速度更快C2的编译质量更高分层编译的不同编译路径也就是JVM根据当前服务的运行情况来寻找当前服务的最佳平衡点的一个过程。从JDK 8开始JVM默认开启分层编译。3. 即时编译的触发Java虚拟机根据方法的调用次数以及循环回边的执行次数来触发即时编译。循环回边是一个控制流图中的概念程序中可以简单理解为往回跳转的指令比如下面这段代码循环回边public void nlp(Object obj) { int sum 0; for (int i 0; i 200; i) { sum i; }}上面这段代码经过编译生成下面的字节码。其中偏移量为18的字节码将往回跳至偏移量为4的字节码中。在解释执行时每当运行一次该指令Java虚拟机便会将该方法的循环回边计数器加1。字节码public void nlp(java.lang.Object); Code: 0: iconst_0 1: istore_1 2: iconst_0 3: istore_2 4: iload_2 5: sipush 200 8: if_icmpge 21 11: iload_1 12: iload_2 13: iadd 14: istore_1 15: iinc 2, 1 18: goto 4 21: return在即时编译过程中编译器会识别循环的头部和尾部。上面这段字节码中循环体的头部和尾部分别为偏移量为11的字节码和偏移量为15的字节码。编译器将在循环体结尾增加循环回边计数器的代码来对循环进行计数。当方法的调用次数和循环回边的次数的和超过由参数-XX:CompileThreshold指定的阈值时(使用C1时默认值为1500使用C2时默认值为10000)就会触发即时编译。开启分层编译的情况下-XX:CompileThreshold参数设置的阈值将会失效触发编译会由以下的条件来判断方法调用次数大于由参数-XX:TierXInvocationThreshold指定的阈值乘以系数。方法调用次数大于由参数-XX:TierXMINInvocationThreshold指定的阈值乘以系数并且方法调用次数和循环回边次数之和大于由参数-XX:TierXCompileThreshold指定的阈值乘以系数时。分层编译触发条件公式i TierXInvocationThreshold * s || (i TierXMinInvocationThreshold * s i b TierXCompileThreshold * s)i为调用次数b是循环回边次数上述满足其中一个条件就会触发即时编译并且JVM会根据当前的编译方法数以及编译线程数动态调整系数s。--知识分享时代前行~~ 时代Java还有更多好文章……请查看历史文章和官网↓有分享有收获~
http://www.sadfv.cn/news/135445/

相关文章:

  • 企业设计网站公司有哪些做app和做网站相同和区别
  • 网站重定向怎么做wordpress keyshot
  • 长春阿凡达网站建设网站建设028
  • 广东网站推广wordpress暴力
  • 大型大型网站建设方案网站开发商业秘密保密协议
  • 网站介绍词百度知道首页
  • 东莞建设网站企业WordPress可以写多少文章
  • 设计软件免费下载官方网站p2p网站建设的步骤过程
  • 网站设计服务营销型网页设计
  • 建设一个网站需要些什么材料庄河建网站
  • 外贸建站 智能营销网站建设与维护 东博
  • 网站制作 牛商网 岳阳 公司wordpress如何去掉分类里面的大字
  • 医院网站建设如何创建二级域名
  • 佛山设计网站设计价格百度点击工具
  • 北京网页制作网站成都企业网站优化服务
  • 网站班级文化建设视频潍坊建设街邮政公司
  • 网站空间续费台州做网站
  • 山东网站排行快3网站制作 优帮云
  • 成都装修网站制作多少钱视频永久免费生成二维码
  • 网站建设300元广州网站设计十年乐云seo
  • php旅游网站cms建设门户网站申请
  • 门户网站开发步骤博客网站外链发布
  • 齐河网站建设电话网站开发工程师适合女生吗
  • 网站结构优化包括哪些营销案例网站
  • 合肥专业做网站的网站和管理系统的区别
  • 长寿做网站的电话集团网站群
  • 越秀微网站建设潍坊网站建设一站式服务
  • 广州制片公司网站网站开发管理方案
  • 要搭建网站谷歌play商店
  • 网站地图怎么生成百度西安分公司地址