将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编译为本地代码的更多相关文章

  1. java编译期优化

    java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程: 1.前端编译:把.java文件转变为.class文件 2.后端编译:把字节码转变为机器码 3.静态提前编译:直接把*.ja ...

  2. java编译期优化与执行期优化技术浅析

    java语言的"编译期"是一段不确定的过程.由于它可能指的是前端编译器把java文件转变成class字节码文件的过程,也可能指的是虚拟机后端执行期间编译器(JIT)把字节码转变成机 ...

  3. java编译过程(字节码编译和即时编译)

    Javac编译与JIT编译 简介: 编译包括两种情况: 1,源码编译成字节码 2,字节码编译成本地机器码(符合本地系统专属的指令) 解释执行也包括两种情况: 1,源码解释执行 2,字节码解释执行 解释 ...

  4. 作业5:Java编译原理

    零.编译 1.编译器 (1)前端编译器:.java文件转变为.class文件Sun的javacEclipse JDT中的增量编译器(ECJ) (2)后端编译器:.class文件转变为机器码HotSpo ...

  5. 15个问题自查你真的了解java编译优化吗?

    摘要:为什么C++的编译速度会比java慢很多?二者运行程序的速度差异在哪? 了解了java的早期和晚期过程,就能理解这个问题了. 本文分享自华为云社区<你真的了解java编译优化吗?15个问题 ...

  6. java编译后字节码解析

    java编译后字节码解析 参考网摘: https://my.oschina.net/indestiny/blog/194260

  7. JAVA - JAVA编译运行过程

    Java编译原理 *.java→*.class→机器码 java编译器 (编译) → 虚拟机(解释执行) →  解释器(翻译) → 机器码 1.Java编译过程与c/c++编译过程不同 Java编译程 ...

  8. 如何用javac 和java 编译运行整个Java工程 (转载)【转】在Linux下编译与执行Java程序

    如何用javac 和java 编译运行整个Java工程 (转载)  http://blog.csdn.net/huagong_adu/article/details/6929817 [转]在Linux ...

  9. java编译错误 程序包javax.servlet不存在javax.servlet.*

    java编译错误 程序包javax.servlet不存在javax.servlet.* 编译:javac Servlet.java 出现 软件包 javax.servlet 不存在 软件包javax. ...

随机推荐

  1. Chrome DevTools & console & filter warning

    Chrome DevTools & console & filter warning

  2. scrimba & interactive free online tutorials

    scrimba & interactive free online tutorials https://github.com/scrimba/community/blob/master/FAQ ...

  3. SVG to GeoJSON

    SVG to GeoJSON GEOJSON https://geojson.org/ http://geojson.io/ https://github.com/mapbox/geojson.io/ ...

  4. PHP实现一个二维码同时支持支付宝和微信支付

    实现思路 生成一个二维码,加入要处理的url连接 在用户扫完码后,在对应的脚本中,判断扫码终端,调用相应的支付 若能够扫码之后能唤起相应app,支付宝要用手机网站支付方式,微信要使用jsapi支付方式 ...

  5. 教你玩转CSS 居中

    1.元素居中对齐 要水平居中对齐一个元素(如 <div>), 可以使用 margin: auto;. 设置到元素的宽度将防止它溢出到容器的边缘. 元素通过指定宽度,并将两边的空外边距平均分 ...

  6. 验证销售部门的数据查看权限-脚本demo

    1 # coding:utf-8 2 ''' 3 @file: run_old.py 4 @author: jingsheng hong 5 @ide: PyCharm 6 @createTime: ...

  7. CSS绘制三角形和箭头

    <html> <head> <meta charset="utf-8"> <title>CSS绘制三角形和箭头</title& ...

  8. Spring-02 第一个Spring程序

    Spring-02 第一个Spring程序 第一个Spring程序 1.导入依赖 <dependency> <groupId>org.springframework</g ...

  9. Vue脚手架中默认的margin怎么清除

    问题情景:开发中发现我的项目四周有白边,但是并没有设置样式 问题原因:vue脚手架中静态文件夹public中的index.html造成的 解决方案:找到vue脚手架中index.html页面,设置ma ...

  10. 你要是还学不会,请提刀来见 Typora+PicGo+Gitee + node.js 打造个人高效稳定优雅图床

    你要是还学不会,请提刀来见 Typora+PicGo+Gitee + node.js 打造个人高效稳定优雅图床 经过前面两弹的介绍,相信大家对图床都不陌生了吧, 但是小魔童觉得这样做法还是不方便,使用 ...