java分层编译

编译没学完直接变异了🧬

 java源代码文件变成可直接执行的机器指令:java转成class,class转换成机器指令

  • java=》字节码打包成jar包
  • 字节码执行:一 解释器interpreter即使解释执行,二 jit编译器编译执行

热点代码

 方法/代码块频繁允许,jit将部分热点代码class编译机器码 优化后缓存到codeCache

         codeCache默认大小2496kb 扩容 最大240M

    java9 codeCache三区:减少内存碎片,提高运行效率

  1. non-method segment存储jvm内部代码,XX:NonNMethodCodeHeapSize配置
  2. profiled-code segment生命周期短C1编译后的代码XX:ProfiledCodeHeapSize
  3. non-profiled segment生命周期长C2编译后的代码XX:NonProfiledCodeHeapSize

JIT编译器:client /server

   client客户端程序idea等注重应用启动速度,不长使用;C1

   server服务端程序spring后端应用,长期驻守 长时间profiling获使用信息;C2

C2编译慢 性能高!

方法内联

编译器 热点代码 字节码大小 <325b 内联 ;非热点代码 方法字节码<35b 内联

   方法栈 入栈/出栈 消耗性能:内联 也是一种合并,减少不必要的操作

   内联方法多,生成代码执行效率高 / 编译时间长 程序达到性能峰值晚

        循环计数器由int改成long,循环展开不会被发送(不会优化减少循环次数)

             for int=》 for long

              优化不能低成本处理long溢出情况,启发式安全点检查/全量数组范围检查(降低效率)

安全点

运行到这 表示 对当前代码块内部变量的修改动作done(真的都执行完了)

   就可以代表宇宙授予你安全中断当前线程运行的权力,可进行额外操作:GC内存换代/STW

    解释执行:安插字节码之间就行,之间不是之内

    编译执行:循环的跳转前/循环完 has check

     int类型循环,jvm优化掉前向跳转时安全点,

        多线程场景下,如循环非常耗时,出现其他所有线程都到达安全点后 还在等一颗小心心 呸~ 等这一循环线程的情况

       外在表现:某一次STW时间特别长 XX:+SafepointTimeout -XX:SafepointTimeoutDelay=1000

          安全点检查等待时间超过1000ms jvm打印超时日志

          java10临危受命,loop strip mining通profiling统计抵达安全点时间,设计安全点

注意⚠️ 安全点检查的优化 只针对计数循环(可以偷个懒)  其他的非计数都要安插安全点

边界检查消除:

 前序循环pre loog

  依据步长变化和数组最大长度 推断 不进行边界检查的max循环次数N

 N次主循环之后 访问数值带上边界检查 后序循环

逃逸分析

 标量替换:没有被外部访问 创建成员变量来替代 不分配内存空间

 锁消除:未发生逃逸 可锁消除 去除同步逻辑 提高效率

窥孔优化:编译器后期,局部代码块中的指令 运算强度消减

   代码的静态分析得出  依据不同处理器指令集

死代码消除:很简单不说了

深入探讨Java的分层编译

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java多文件分层导出是指将一个Java项目按照不同的功能或模块进行划分,并将每个功能或模块分别保存在不同的文件中,以便于管理和维护。这种方式在大型项目中尤为常见。 实现Java多文件分层导出的步骤如下: 1. 创建主文件:首先创建一个主文件,该文件负责初始化程序的运行以及整个项目的调用。在主文件中引入所有其他模块或功能所在的文件,以便在程序运行时调用。 2. 创建模块文件:根据项目的需求,将不同的功能或模块划分为多个文件。每个文件对应一个功能或模块,并在文件中编写相应的代码。可以根据项目的复杂程度,继续针对每个模块再进行细分,创建更多的子模块文件。 3. 导出模块:在主文件中,根据需要调用相应的功能或模块文件。通过导入相应文件的路径,可以在程序中使用该文件中所定义的类和方法。导出模块的方式可以使用import关键字。 4. 编译和运行:完成以上步骤后,将所有文件编译成字节码文件,以便能够在Java虚拟机上运行。通过命令行或IDE提供的运行选项,可以启动程序并使用已经导出的模块。 Java多文件分层导出的优点是能够提高代码的可读性和可维护性。不同的功能或模块被分隔在不同的文件中,使得代码更加清晰和易于理解。同时,当需要修改或添加某个模块时,只需修改或添加相应的文件,而无需影响其他部分的代码。 总结来说,Java多文件分层导出是一种更好地组织和管理Java项目的方式,可以提高代码的可读性、可维护性和可扩展性。通过合理划分不同的功能或模块,并将其保存在不同的文件中,可以更好地组织和管理代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值