将Java编译为本地代码
将Java编译为本地代码
通常Java程序的执行流程为:将Java代码编译为Byte Code(字节码),然后JVM执行引擎执行编译好的Byte Code。这是一种中间语言的特性,它的好处就是可以做到平台的无关性,一份代码可以在任意的平台上运行。而且JVM语言采用了JIT(Just In Time)即时编译技术,会将执行中的热点代码(字节码)编译为本地代码运行,提高代码执行性能。
虽然Java的这种中间语言+即时编译的技术有很多优点,同时也有很多缺点。比如JVM执行引擎执行会比较占用资源,而且JIT有热加载的问题,所以执行的性能发挥不太稳定。对于软件的发布来说,我们通常会将JRE连同我们的应用程序一同发布,这样虽然能解决用户PC上JRE版本与要求版本不一致问题,但是也增大了软件包的体积。
针对上述JVM存在的问题,Oracel公司推出了一个名为GraalVM的项目,这个项目可以将Java字节码编译为本地代码。编译生成的本地代码无须JVM,可以直接在目标机器上运行。而且这种AOT(Ahead Of Time)的编译方式并不会对性能造成太大的影响,同时它还能够减少运行时的内存占用与CPU资源消耗。具体的其他特性,可以查看GraalVM官网。
GraalVM安装(OSX)
GraalVM JDK可以与你本机的JDK互补的存在,GraalVM并没有提供相应的安装程序,而是以压缩的包的形式进行发布,你可以从Github上进行下载:https://github.com/graalvm/graalvm-ce-builds/releases/tag/vm-21.0.0.2
下载完毕后解压缩至相应目录即可。
安装完毕GraalVM之后,你可以安装native-image本地代码编译工具,这个工具需要依赖于GraalVM,所以在安装这个工具前,请先安装GraalVM。native-image本地代码编译工具也可以在上文中的Github仓库中进行下载,它也是压缩包的形式进行发布的,下载下来解压即可。但是与GraalVM不同的是这个工具并不是开箱即用,而是需要一些配置。
sudo xattr -r -d com.apple.quarantine /path/to/GRAALVM_HOME
<GraalVM安装目录>/Contents/Home/bin/gu install native-image
执行完这个命令后,native-image就会安装到GraalVM的bin目录下。
测试编译本地代码
Java源代码:
public class Test
{
public static void main(String... args)
{
System.out.println("Hello world");
}
}
将源代码编译为字节码:
javac Test.java
将字节码编译为本地代码:
native-image Test
将Java编译为本地代码的更多相关文章
- java编译期优化
java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程: 1.前端编译:把.java文件转变为.class文件 2.后端编译:把字节码转变为机器码 3.静态提前编译:直接把*.ja ...
- java编译期优化与执行期优化技术浅析
java语言的"编译期"是一段不确定的过程.由于它可能指的是前端编译器把java文件转变成class字节码文件的过程,也可能指的是虚拟机后端执行期间编译器(JIT)把字节码转变成机 ...
- java编译过程(字节码编译和即时编译)
Javac编译与JIT编译 简介: 编译包括两种情况: 1,源码编译成字节码 2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行也包括两种情况: 1,源码解释执行 2,字节码解释执行 解释 ...
- 作业5:Java编译原理
零.编译 1.编译器 (1)前端编译器:.java文件转变为.class文件Sun的javacEclipse JDT中的增量编译器(ECJ) (2)后端编译器:.class文件转变为机器码HotSpo ...
- 15个问题自查你真的了解java编译优化吗?
摘要:为什么C++的编译速度会比java慢很多?二者运行程序的速度差异在哪? 了解了java的早期和晚期过程,就能理解这个问题了. 本文分享自华为云社区<你真的了解java编译优化吗?15个问题 ...
- java编译后字节码解析
java编译后字节码解析 参考网摘: https://my.oschina.net/indestiny/blog/194260
- JAVA - JAVA编译运行过程
Java编译原理 *.java→*.class→机器码 java编译器 (编译) → 虚拟机(解释执行) → 解释器(翻译) → 机器码 1.Java编译过程与c/c++编译过程不同 Java编译程 ...
- 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序
如何用javac 和java 编译运行整个Java工程 (转载) http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...
- java编译错误 程序包javax.servlet不存在javax.servlet.*
java编译错误 程序包javax.servlet不存在javax.servlet.* 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax. ...
随机推荐
- Win/Mac 键位映射 & 在 Mac 上更改“键盘”偏好设置
Win/Mac 键位映射 & 在 Mac 上更改"键盘"偏好设置 PC键盘 在Mac下Command/Option键切换 https://support.apple.com ...
- js 获取是否为闰年,以及各月的天数 & isLeapYear
js 获取是否为闰年,以及各月的天数 calendar utils isLeapYear const isLeapYear = (year) => { return (year % 4 === ...
- nasm 函数返回一个数组 x86
getArguments.asm: extern VirtualAlloc section .text global dllmain export getArguments dllmain: mov ...
- vue components registration & vue error & Unknown custom element
vue components registration & vue error & Unknown custom element vue.esm.js:629 [Vue warn]: ...
- 智能合约稳定币USDN的价值在哪里?
近几年来,区块链和数字货币市场快速发展,客观上需要价格相对稳定的交易媒介和贮藏手段,从而推动以链上资产或链下资产抵押型稳定币和算法型稳定币出现,以实现币价相对稳定的数字货币.市场上开始出现了诸如USD ...
- Python数据结构与算法_删除排序数组中的重复项(06)
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成. ...
- Java 动态调试技术原理及实践
本文转载自Java 动态调试技术原理及实践 导语 断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径.但断点调试会在断点位置停顿,使得整个应用停止响应. ...
- 翻译:《实用的Python编程》02_03_Formatting
目录 | 上一节 (2.2 容器) | 下一节 (2.4 序列) 2.3 格式化 虽然本节稍微有点离题,但是当处理数据时,通常想要生成结构化的输出(如表格).示例: Name Shares Price ...
- 页面强制重新加载js的办法
1:线上强制重新加载js的办法 js后缀?v1.0 2:开发环境强制重新加载js的办法?now=Date.now() 3:开发环境强制重新加载js的办法F12进入调试页面选择network下单 dis ...
- Vue学习笔记-vue-element-admin 前端学习
一 使用环境 开发系统: windows 后端IDE: PyCharm 前端IDE: VSCode 数据库: msyql,navicat 编程语言: python3.7 (Windows x86- ...