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

电商网站有哪些特色深圳网站制作要多少钱

电商网站有哪些特色,深圳网站制作要多少钱,17网站一起做,帝国cms做电影网站文章目录 深入JVM#xff1a;详解JIT即时编译器一、序言二、基础概念1、何为JIT即时编译2、热点代码 三、HotSpot内置的即时编译器1、C1编译器2、C2编译器3、分层编译3.1 协作流程 四、常见JIT优化技术1、方法内联2、逃逸分析#xff08;1#xff09;同步锁消除#xff08;… 文章目录 深入JVM详解JIT即时编译器一、序言二、基础概念1、何为JIT即时编译2、热点代码 三、HotSpot内置的即时编译器1、C1编译器2、C2编译器3、分层编译3.1 协作流程 四、常见JIT优化技术1、方法内联2、逃逸分析1同步锁消除2栈上分配3标量替换 五、后记 深入JVM详解JIT即时编译器 一、序言 对于Java工程师而言深入理解JVMJava虚拟机不仅是掌握Java程序运行机制的基础也是提升系统性能、优化应用和解决复杂问题能力的重要一步更是Java进阶之路的重中之重。 本文小豪将带大家认识JIT即时编译器介绍主流HotSpot虚拟机内置的几款即时编译器同时结合代码实例着重讲解JIT优化手段话不多说我们直接进入正题。 二、基础概念 在之前网上可能经常说Java语言的运行速度不如C或CJava运行速度慢主要是因为它是解释执行的而C或C是编译执行的解释执行需要通过JVM虚拟机将字节码实时翻译成机器码边翻译边执行才能运行在操作系统上这个过程会比编译执行慢。 但现在再说这个结论就不太对了随着JIT即时编译技术的发展性能差距正在逐步缩小甚至在某些情况下执行速度是优于C或C的。 1、何为JIT即时编译 在Java程序执行过程中主要依靠字节码指令来进行。这些字节码指令按照顺序逐行被实时翻译成机器码以便于在操作系统上运行。当某些方法或代码块它们都对应特定的字节码被频繁调用时这部分代码就被视为热点代码。 JVM虚拟机会针对性的对这部分热点代码进行优化编译将它们从字节码转换为本地机器码然后将优化后的本地机器码缓存起来后续再执行时可以直接从缓存中获取并运行无需再次编译。 完成这个过程的编译器就称为JIT即时编译器Just In Time Compiler。JIT即时编译器显著提升了Java的性能缩小了与其它编译型语言运行速度的差距。 2、热点代码 热点代码是指在运行过程中被频繁执行的代码被即时编译的热点代码有两种分别是 被多次调用的方法被多次执行的循环体 而热点代码由热点探测进行发现热点探测基于计数器JVM虚拟机会为每个方法建立对应的计数器统计方法的执行次数、方法内的循环次数等如果计数器超过指定阈值则标识其为热点代码。 方法调用计数器统计方法被调用的次数 回边计数器统计方法内循环体代码执行的次数 三、HotSpot内置的即时编译器 主流的HotSpot虚拟机内置了两个JIT编译器C1Client Compiler编译器和C2Server Compiler编译器在常用的JDK 8版本中C1和C2是相互协同工作的。 1、C1编译器 C1编译器注重启动时间和编译时间编译速度较快但优化程度相对较低。 C1的优化策略相对简单也比较轻量级比如方法内联、公共子表达式消除C1编译器编译的代码的执行速度通常比C2编译器慢。 2、C2编译器 C2编译器侧重于深度优化与C1正好相反C2编译器的编译时间较长但优化的程度较高。 C2的优化策略比较深度会进行更高级的优化比如逃逸分析等C2编译器编译的代码的执行速度通常比C1编译器快。 C2编译器由于深度优化代码过于复杂已经很难维护了从JDK 10开始Graal编译器已经代替了C2编译器与C1编译器协同工作 3、分层编译 由于C1和C2编译器在优化方面有不同的侧重点C1侧重编译速度C2侧重深度优化。 从JDK 7开始采用分层编译的方式C1和C2相互协同共同发挥作用HotSpot虚拟机根据代码的运行性能动态的选择具体采用哪个编译器完成优化。 在分层编译中整个优化过程分为五个层次对应着不同的优化策略 第0层解释器执行开启Profiling性能监控功能第1层C1编译器执行不开启Profiling执行不带Profiling功能的C1编译代码第2层C1编译器执行开启Profiling仅执行带部分Profiling功能的C1编译代码方法调用次数和循环次数第3层C1编译器执行开启Profiling执行带全部Profiling功能的C1编译代码第4层C2编译器执行执行C2编译代码 Profiling性能监控是指在程序执行过程中收集程序执行的各项数据包括方法调用次数、循环次数、类型转换等等收集的数据越多额外的性能开销越大。 第1层到第3层都是由C1编译器执行的显然第1层由于不开启Profiling执行性能会高于第2层同时第2层只收集少量数据第2层的执行性能也会高于第3层总体性能第4层 第1层 第2层 第3层 第0层 3.1 协作流程 在分层编译中C1和C2编译器是相互协作的它们都由各自独立的线程来处理编译任务线程内部维护着任务队列用来存放待编译的热点代码具体协作流程如下 默认情况下热点方法首先会被第3层的C1编译器执行当Profiling性能监控收集到的数值达到阈值JVM会评估C1和C2的优化性能字节码数较少等 若判定C1和C2的执行效率相当交由第1层的C1编译器进行优化停止Profiling监控不再收集运行信息若判定C2执行效率相当优于C1交由第4层的C2编译器进行深度优化 C1线程忙碌时会直接交由第4层的C2编译器进行深度优化C2线程忙碌时会先交由第2层的C1编译器执行优化进行信息的初步收集待C2线程空闲时再交由第3层的C1编译器执行 四、常见JIT优化技术 JIT即使编译器主要是通过方法内联和逃逸分析两种技术来实现代码的优化。 1、方法内联 方法内联其实就是将被调用方法的字节码直接插入到调用该方法的地方调用时减少了栈帧的创建销毁开销。 举个例子 实际上JIT修改的是字节码指令为便于理解本文使用代码举例 // 方法内联 public double methodInlining() {double num1 Math.random();double num2 Math.random();// 等价于 - double sum num1 num2double sum add(num1, num2);return sum; }public double add(double num1, double num2) {return num1 num1; }在代码中方法内联会将其中的add(num1, num2)方法转换为实际的num1 num1直接进行计算操作避免了方法调用。 这里我们简单测试一下 public static void main(String[] args) {long startTime System.currentTimeMillis();JitTest demo new JitTest();for (int i 0; i 1000000; i) {demo.methodInlining();}long endTime System.currentTimeMillis();System.out.println(执行耗时 (endTime - startTime)); }测试代码也比较简单循环调用百万次统计总耗时。 首先我们测试不启用JIT优化下这段代码的执行耗时禁用JIT优化只需要添加JVM参数-Xint即可禁用后控制台输出 执行耗时881取消掉禁用参数-Xint启用JIT优化重新执行这段测试代码 执行耗时47我们进一步验证一下add方法是否进行了方法内联优化添加三个JVM参数-XX:PrintCompilation -XX:UnlockDiagnosticVMOptions -XX:PrintInlining打印JVM优化内容 -XX:PrintCompilation输出被JIT编译的方法信息-XX:UnlockDiagnosticVMOptions解锁用于诊断JVM的选项默认关闭-XX:PrintInlining打印内联方法 如图大量方法都被内联其中也包括我们自己写的methodInlining和add方法并且同时打印出了方法对应的字节大小我们发现这些被内联的方法字节数都比较小。 其实这是由于方法内联也有一点的限制即字节数过大的方法体不会进行内联具体限制如下 非热点代码默认限制字节数小于35可通过参数调整限制 // 非热点代码的内联字节大小最大阈值 -XX:MaxInlineSizen热点代码默认限制字节数小于325可通过参数调整限制 // 热点代码的内联字节大小最大阈值 -XX:FreqInlineSizen接口实现限制若接口的实现方法数量超过3个则不会被内联 2、逃逸分析 逃逸分析核心思想是判断方法内创建的对象是否会被外部所引用当JIT编译器判断到对象在方法外部不会被引用即该对象的生命周期被限定在当前方法执行期间编译器就能采取多种优化措施比如锁消除、标量替换和栈上分配。 1同步锁消除 同步锁消除旨在消除代码中的同步操作若某个对象不会逃逸出当前方法只在方法内部使用则不存在线程安全问题因为每个方法的栈都是私有的JIT编译器就会消除该同步锁操作提高程序的执行效率。 举个例子 public void syncLockEliminate() {// 等价于 - 不执行该同步锁synchronized (JitTest.class) {// 业务代码逻辑} }public static void main(String[] args) {long startTime System.currentTimeMillis();JitTest demo new JitTest();for (int i 0; i 1000000; i) {demo.syncLockEliminate();}long endTime System.currentTimeMillis();System.out.println(执行耗时 (endTime - startTime)); }这里启用和禁用JIT锁消除禁用锁消除参数-XX:-EliminateLocks对应控制台输出的执行耗时分别为 // 启用锁消除 执行耗时143// 禁用锁消除 执行耗时2032栈上分配 栈上分配是将被创建的对象内存分配在栈上而不是堆上降低GC垃圾回收的频率。 举个例子 static class UserInfo {// 姓名private String name;// 年龄private int age;public UserInfo() {}public UserInfo(String name, int age) {this.name name;this.age age;} }// 栈上分配不赋值对象属性 public static void createUser() {UserInfo user new UserInfo(); }public static void main(String[] args) throws Exception {long startTime System.currentTimeMillis();for (int i 0; i 1000000; i) {createUser();}long endTime System.currentTimeMillis();System.out.println(执行耗时 (endTime - startTime)); }这里我们验证一下这个结论我们在JVM参数上添加-XX:PrintGC输出GC日志信息同时将堆内存空间设小一些 -Xms10m -Xmn10m -XX:PrintGC首先默认启用JIT逃逸分析优化控制台输出 执行耗时72接着禁用逃逸分析优化添加参数-XX:-DoEscapeAnalysis关闭逃逸分析控制台输出 [GC (Allocation Failure) 7679K-1041K(9216K), 0.0010975 secs] [GC (Allocation Failure) 8721K-904K(9216K), 0.0006550 secs] [GC (Allocation Failure) 8584K-840K(9216K), 0.0007822 secs] 执行耗时103关闭逃逸分析优化后JVM执行了几次的GC垃圾回收。 3标量替换 标量替换是将需要被创建的对象拆解成独立的标量对象内部的基本数据类型方法执行时不创建该对象实例而是直接创建它的成员变量代替它这些成员变量作为该方法的局部变量被分配在栈上。 标量替换是针对栈上分配更进一步的优化技术栈上分配只是将对象从堆上分配到栈上而标量替换是将对象进行拆解作为方法的局部变量被分配在栈上。 举个例子 // 标量替换赋值对象属性 public static void createUser() {// 等价于 - String name user.name xiaohao;// int age user.name 24UserInfo user new UserInfo(xiaohao, 24);String userInfo user.name user.age; }public static void main(String[] args) throws Exception {long startTime System.currentTimeMillis();for (int i 0; i 1000000; i) {createUser();}long endTime System.currentTimeMillis();System.out.println(执行耗时 (endTime - startTime)); }若JIT判断到UserInfo对象不会逃逸出当前方法则会将UserInfo对象的name和age属性替换为两个局部变量不进行创建UserInfo对象避免在堆上分配对象实例。 控制台输出的执行耗时分别为 // 启用逃逸分析 执行耗时162// 禁用逃逸分析 执行耗时203五、后记 本文从JIT即时编译器基础概念开始介绍着重讲解了常见的JIT优化技术包括方法内联与逃逸分析额外拓展了HotSpot虚拟机内置的C1、C2编译器及分层编译协作流程。 JIT即时编译器在运行时对Java字节码进行优化极大地提升了Java程序的执行效率。不过也要求我们日常编写代码要注意一定的规范让JIT发挥最大效果。比如控制方法的代码行数避免写过长的代码方法可以将复杂的逻辑拆分成多个小方法提升方法内联的生效几率另外也可以控制接口的实现数量尽量不超过两个降低方法内联的复杂度以及注意在方法内创建对象时尽量不让对象逃逸。 如果大家觉得内容有价值不妨考虑点点赞关注关注小豪后续小豪将会继续更新其它Java相关文章大家共同进步~
http://www.pierceye.com/news/514534/

相关文章:

  • 副食店年报在哪个网站做mc建筑网站
  • 网站建设不足之处2017网站设计尺寸
  • 网站架构招聘怎么免费的安装wordpress主题
  • 海天建设集团网站深圳西乡地铁站
  • 上海html5网站建设第九影院用wordpress版权信息
  • 东莞网站建设运营方案尺寸在线做图网站
  • 萍乡网站推广陕西省住房和城乡建设厅网站上查询
  • 南京市浦口区建设局网站多商户商城app开发
  • 网站设置不能通过链接访问中专网站建设与管理就业前景
  • 大连网站建设哪个公司好郑州最新通告
  • 如何自己搭建网站做装修的业务网站
  • app网站的优点手机自助建站永久免费
  • 搜索栏搜索网站?热?文市场调研流程
  • 外贸网站建设课本建设网站群的好处
  • 网站开发文献综述范文网络推广计划书格式
  • 有免费网站服务器吗在线美图
  • 电商网站设计的原则免费下载app软件下载大全
  • 餐饮网站建设优化建站wordpress copyright
  • 腾讯建站官网设计网页步骤
  • 网站建设三方合同范本wordpress数字链接出现404
  • 下载用的网站怎么做网站模板怎么使用教程
  • 没有网站 可以做百度口碑吗展馆的科普网站建设
  • 河北网站备案查询系统商城网站seo
  • 网站申请页面网站空间不够用怎么办
  • 网站开发最合适的搭配螺栓球网架
  • 广东网站建设排名凡科建站下载
  • 建设厅网站预算员报名时间网站建设策划书的编制
  • 厦门手机网站建设公司哪家好鲜花网站源码
  • 北京家居网站建设如何制作软件手机软件
  • 北京网站建设策划解决方案长沙建设工程造价网站