java9 揭秘 jlink_Java 中的Jlink详解
Jlink是Java的新命令行工具,通过它我们可以创建自己的自定义JRE。
通常,我们使用默认的JRE运行程序,但是如果您要创建自己的JRE,则可以使用jlink概念。
为什么要建立自己的JRE?
让我们来看一个例子。
假设我们有一个简单的“ hello world”程序,例如:
class Test {
public static void main(String[]args) {
System.out.prinltn("Hello World");
}
}
如果要在我们的系统上运行此小程序,则需要安装默认的JRE。安装默认的JRE之后,我可以愉快地运行我的小型“ hello world”应用程序。
问题
要执行这个小的“ hello world”应用程序,我们需要以下.class文件:
· 测试类
· 字符串类
· 系统类
· 对象类
在这里,这4个.class足以运行我的应用程序。
Oracle提供的默认JRE包含4300多个预定义的Java .class文件。
如果我使用默认的JRE执行“ hello world”应用程序,则将执行所有预定义的.class文件。但是,如果我只需要3-4个.class文件来执行“ hello world”应用程序,那么为什么我需要维护外部.class文件?
因此,默认JRE的问题在于,无论您是否愿意,它都会执行所有预定义的.class文件。
并且,如果您还查看默认JRE的大小,则将发现它为203 MB。为了执行简单的1 KB代码,我必须在计算机中维护203 MB的JRE。这完全是浪费内存。
因此,使用默认的JRE意味着:
· 浪费内存并降低性能
· 将无法开发包含很少内存的微服务。=
· 不适合物联网设备
因此,Java不是微服务和IoT设备的最佳选择,但这只是Java 1.8中的一个问题。同时,Java 1.9带有jlink。使用jlink,我们可以创建自己的小型JRE,该JRE包含我们想要的唯一相关类。不会浪费内存,性能将会提高。
Jlink允许我们链接仅所需模块的集合以创建运行时映像(我们自己的JRE)
使用所需模块创建我们的JRE
假设我的“ hello world”程序位于名为DemoModule的模块中。我们可以使用Java 9编译基于模块的应用程序:
javac –module-source-path src -d out -m demoModule
成功编译后,将创建一个包含Test.class文件的文件夹。如果使用默认的JRE运行此基于模块的应用程序,则可以使用以下命令:
java –module-path out -m demoModule/knoldus.Test
但是正如我们讨论的那样,我们的“ hello world”程序仅需要几个.class文件-String.class,System.class和Object.class。这些.class文件是java.lang包的一部分,而java.lang包是java.base模块的一部分。因此,如果我想运行“ hello world”程序,则只需要两个模块-DemoModule和java.base模块。使用这两个模块,我们可以创建自己的自定义JRE来运行该应用程序。
您可以在路径中找到java.base模块:
java\jdk-9\jmods
因此,只需复制java.base模块并将其粘贴到具有Test.class文件的文件夹中即可。现在,我们可以使用以下命令创建自己的JRE:
jlink –module-path out –add-modules demoModule,java.base –output myjre
成功执行此命令后,您会发现有一个myjre文件夹,除了您自定义的JRE外,什么都没有。只需按照几步使用自定义的JRE执行程序
· cd myjre
· cd bin
· java -m demoModule/knoldus.Test
通过执行这些命令,您可以愉快地运行“ hello world”应用程序。这就是jlink的全部!我希望您现在对如何使用它来制作自己的JRE有一个清晰的了解。
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。
java9 揭秘 jlink_Java 中的Jlink详解相关推荐
- ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route
前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...
- Asp.net中GridView使用详解(引)【转】
Asp.net中GridView使用详解(引) GridView无代码分页排序 GridView选中,编辑,取消,删除 GridView正反双向排序 GridView和下拉菜单DropDownList ...
- Linux中iptraf命令详解(IP局域网监控工具)
2019独角兽企业重金招聘Python工程师标准>>> Linux中iptraf命令详解(IP局域网监控工具) 发布时间:2017-12-27 20:46:03 作者:佚名 ...
- ArcGIS Engine中的Symbols详解
转自原文 ArcGIS Engine中的Symbols详解 本文由本人翻译ESRI官方帮助文档.尊重劳动成果,转载请注明来源. Symbols ArcObjects用了三种类型的Symbol(符号样式 ...
- js路由在php上面使用,React中路由使用详解
这次给大家带来React中路由使用详解,React中路由使用的注意事项有哪些,下面就是实战案例,一起来看一下. 路由 通过 URL 映射到对应的功能实现,React 的路由使用要先引入 react-r ...
- Linux中etc目录详解
Linux中etc目录详解 /etc目录 包含很多文件.许多网络配置文件也在/etc 中. /etc/rc or/etc/rc.d or/etc/rc*.d 启动.或改变运行级时运行的sc ...
- java 自定义正则表达式_java中正则表达式实例详解
Java中正则表达式运用实例(参看java中正则表达式运用详解): 测试代码 package test; /** * 在String的matches()方法,split()方法中使用正则表达式. * ...
- numpy中reshape方法详解
numpy中reshape方法详解_zhanggonglalala的博客-CSDN博客_reshape
- JavaScript中getBoundingClientRect()方法详解
JavaScript中getBoundingClientRect()方法详解 getBoundingClientRect() 这个方法返回一个矩形对象,包含四个属性:left.top.right和bo ...
最新文章
- k8s,nginx备份日志脚本
- 【pmcaff】12月5日凯文·凯利上海演讲实录
- mysql实现类似oracle的序列,mysql 创建[序列],功能类似于oracle的序列
- [LeetCode] Remove Duplicates from Sorted List - 链表问题
- C和汇编混合编程---do while
- php递归操作目录 递归对参数转义
- 计算机出现假桌面怎么解决办法,win10系统apphangxprocb1引起桌面假死怎么解决【图文】...
- SpannableString与SpannableStringBuilder使用
- 并不对劲的bzoj5340:loj2552:uoj399:p4564: [Ctsc2018]假面
- OpenCV-实现直方图均衡化(对比cv::equalizeHist)
- php黑名单绕过,利用最新Apache解析漏洞(CVE-2017-15715)绕过上传黑名单
- python项目小案例:一个网页响应超时提醒小闹钟
- Atitit 开发2d游戏的技术选型attilax总结
- python 公众号开发框架_基于werobot框架的微信公众号开发
- 隐形缝针法_裤腰大了怎么改小的隐形针法
- Typora任意更改样式
- 电路原理 的 一些基础知识
- 中间件是什么?通俗易懂的解释
- odi12配置mysql_Oracle Data Integrator 12c 安装(ODI安装)
- 免费的PDF转换工具,简单高效有它就够了!