Java 8新特性探究(八)精简的JRE详解
http://www.importnew.com/14926.html


Java 8新特性探究(八)精简的JRE详解
Oracle公司如期发布了Java 8正式版!没有让广大javaer失望。对于一个人来说,18岁是人生的转折点,从稚嫩走向成熟,法律意味着你是完全民事行为能力人,不再收益于未成年人保护法,到今年为止,java也走过了18年,java8是一个新的里程碑,带来了前所未有的诸多特性,lambda表达式,Stream API,新的Date time api,多核并发支持,重大安全问题改进等,相信java会越来越好,丰富的类库以及庞大的开源生态环境是其他语言所不具备的,说起丰富的类库,很多同学就吐槽了,java该减肥了,确实是该减肥,java8有个很好的特性,即JEP161(http://openjdk.java.net/jeps/161 ),该特性定义了Java SE平台规范的一些子集,使java应用程序不需要整个JRE平台即可部署和运行在小型设备上。开发人员可以基于目标硬件的可用资源选择一个合适的JRE运行环境。
好处
- 更小的Java环境需要更少的计算资源。
- 一个较小的运行时环境可以更好的优化性能和启动时间。
- 消除未使用的代码从安全的角度总是好的。
- 这些打包的应用程序可以下载速度更快。
概念
紧凑的JRE分3种,分别是compact1、compact2、compact3,他们的关系是compact1<compact2<compact3,他们包含的API如下图所示
使用javac根据profile编译应用程序
javac –bootclasspath, or javac –profile <profile>
如果不符合compact的api,则报错。
1
2
3
4
5
6
7
8
|
$ javac -profile compact2 Test.java Test.java: 7 : error: ThreadMXBean is not available in profile 'compact2' ThreadMXBean bean = ManagementFactory.getThreadMXBean(); ^ Test.java: 7 : error: ManagementFactory is not available in profile 'compact2' ThreadMXBean bean = ManagementFactory.getThreadMXBean(); ^ 2 errors |
使用工具开发的效果
JPEDS工具使用
java8新增一个工具,用来分析应用程序所依赖的profile,有三个参数比较常用 -p,-v,-r
1
2
3
4
5
6
7
8
9
|
import java.util.Set; import java.util.HashSet; public class Deps { public static void main(String[] args) { System.out.println(Math.random()); Set<String> set = new HashSet<>(); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
************** PROFILE ******************** jdeps -P Deps. class Deps. class -> /Library/Java/JavaVirtualMachines/jdk1. 8.0 .jdk/Contents/Home/jre/lib/rt.jar <unnamed> (Deps. class ) -> java.io compact1 -> java.lang compact1 -> java.util compact1 ************** VERBOSE ******************** jdeps -v Deps. class Deps. class -> /Library/Java/JavaVirtualMachines/jdk1. 8.0 .jdk/Contents/Home/jre/lib/rt.jar Deps (Deps. class ) -> java.io.PrintStream -> java.lang.Math -> java.lang.Object -> java.lang.String -> java.lang.System -> java.util.HashSet ************** RECURSIVE ******************** jdeps -R Deps. class Deps. class -> /Library/Java/JavaVirtualMachines/jdk1. 8.0 .jdk/Contents/Home/jre/lib/rt.jar <unnamed> (Deps. class ) -> java.io -> java.lang -> java.util /Library/Java/JavaVirtualMachines/jdk1. 8.0 .jdk/Contents/Home/jre/lib/jce.jar -> /Library/Java/JavaVirtualMachines/jdk1. 8.0 .jdk/Contents/Home/jre/lib/rt.jar javax.crypto (jce.jar) -> java.io -> java.lang -> java.lang.reflect -> java.net -> java.nio -> java.security -> java.security.cert -> java.security.spec -> java.util -> java.util.concurrent -> java.util.jar -> java.util.regex -> java.util.zip -> javax.security.auth -> sun.security.jca JDK internal API (rt.jar) -> sun.security.util JDK internal API (rt.jar) -> sun.security.validator JDK internal API (rt.jar) javax.crypto.interfaces (jce.jar) -> java.lang -> java.math -> java.security javax.crypto.spec (jce.jar) -> java.lang -> java.math -> java.security.spec -> java.util /Library/Java/JavaVirtualMachines/jdk1. 8.0 .jdk/Contents/Home/jre/lib/rt.jar -> /Library/Java/JavaVirtualMachines/jdk1. 8.0 .jdk/Contents/Home/jre/lib/jce.jar java.security (rt.jar) -> javax.crypto JDK internal API (jce.jar) sun.security.util (rt.jar) -> javax.crypto JDK internal API (jce.jar) -> javax.crypto.interfaces JDK internal API (jce.jar) -> javax.crypto.spec JDK internal API (jce.jar) |
在linux上构建profile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
$ hg clone http: //hg.openjdk.java.net/jdk8/jdk8/ $ cd jdk8 $ make images profiles : ## Finished profiles (build time 00 : 00 : 27 ) ----- Build times ------- Start 2013 - 03 - 17 14 : 47 : 35 End 2013 - 03 - 17 14 : 58 : 26 00 : 00 : 25 corba 00 : 00 : 15 demos 00 : 01 : 50 hotspot 00 : 00 : 24 images 00 : 00 : 21 jaxp 00 : 00 : 31 jaxws 00 : 05 : 37 jdk 00 : 00 : 43 langtools 00 : 00 : 18 nashorn 00 : 00 : 27 profiles 00 : 10 : 51 TOTAL ------------------------- Finished building Java(TM) for target 'images profiles' $ cd images $ ls -d *image j2re-compact1-image j2re-compact2-image j2re-compact3-image j2re-image j2sdk-image |
编译后compact大致的占用空间
总结
如今,物联网正风行一时。我们看到大量不同的设备在市场上出现,每一种的更新速度都越来越快。java需要一个占用资源少的JRE运行环境,紧凑的JRE特性的出现,希望能带来以后的物联网的发展,甚至还是会有大量的java应用程序出现在物联网上面。目前oracle也发布了针对raspberry pi的JRE了。
另外该特性也是为java9的模块化项目做准备,模块化特性是javaer所期待的特性。他是解决业务系统复杂度的一个利器,当然OSGI也是相当的出色。但osgi对于新学者来说未免太复杂了。
Java 8新特性探究(八)精简的JRE详解的更多相关文章
- Java 8新特性探究(五)Base64详解
BASE64 编码是一种常用的字符编码,在很多地方都会用到.但base64不是安全领域下的加密解密算法.能起到安全作用的效果很差,而且很容易破解,他核心作用应该是传输数据的正确性,有些网关或系统只能使 ...
- Java 8新特性探究(十一)Base64详解
开发十年,就只剩下这套架构体系了! >>> BASE64 编码是一种常用的字符编码,在很多地方都会用到.但base64不是安全领域下的加密解密算法.能起到安全作用的效果很差,而且 ...
- [转帖]Java 8新特性探究(八)精简的JRE详解
Java 8新特性探究(八)精简的JRE详解 https://my.oschina.net/benhaile/blog/211804 精简版的api 撸了今年阿里.网易和美团的面试,我有一个重要发 ...
- [转帖]Java 8新特性探究 前言
Java 8新特性探究 前言 https://my.oschina.net/benhaile/blog/174136 讲下java的历史 感觉挺好的. 评论 17 jdk8java8javase新特性 ...
- [转帖]Java 8新特性探究(九)跟OOM:Permgen说再见吧
Java 8新特性探究(九)跟OOM:Permgen说再见吧 https://my.oschina.net/benhaile/blog/214159 need study 很多开发者都在其系统中见过“ ...
- Java 8新特性探究(二)深入解析默认方法
什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法.只需在方法名前面加个default关键字即可. 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是 ...
- Java 8新特性探究(九)跟OOM:Permgen说再见吧
PermGen space简单介绍 元空间(MetaSpace)一种新的内存空间诞生 PermGen 空间的状况 Metaspace 内存分配模型 Metaspace 容量 Metaspace 垃圾回 ...
- Java 8新特性探究(三)泛型的目标类型推断
简单理解泛型 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.通俗点将就是"类型的变量".这种类型变量可以用在类.接口和方法 ...
- Java 8新特性探究(二)类型注解和重复注解
本文将介绍java 8的第二个特性:类型注解. 注解大家都知道,从java5开始加入这一特性,发展到现在已然是遍地开花,在很多框架中得到了广泛的使用,用来简化程序中的配置.那充满争议的类型注解究竟是什 ...
随机推荐
- 校验 MD5 值
Linux 环境下:打开终端,输入命令:"md5sum filename",将结果与网页提供值对比.Windows 环境下:下载 MD5 校验软件并使用.
- 深入理解javascript执行上下文(Execution Context)
本文转自:http://blogread.cn/it/article/6178 在这篇文章中,将比较深入地阐述下执行上下文 - Javascript中最基础也是最重要的一个概念.相信读完这篇文章后,你 ...
- Inno Setup入门(三)——指定压缩方式
Setup段中的compression指定了采用的压缩方式,较高的压缩率需要较多的时间或者需要更大的内存空间,可用的值如下: zip zip/1到zip/9 bzip bzip/1 到bzip/9 l ...
- 初次stack-overflow 提交答案
初次在stack-overflow上面提交答案,首先编辑器非常好用,语法检查都有, 还有付费版的,更高级,更好用,nice. 付费版:https://www.grammarly.com/upgrade ...
- Arrays类与Array类探究
这里所说的Arrays类是util包中的java.util.Arrays,Array是反射包中的java.lang.reflect.Array. 首先介绍Arrays类的常用的静态方法: 1.排序方法 ...
- 通过js来修改div的style(background,border,。。。。。。。)
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- Mesos架构简介
1. 前言 同其他大部分分布式系统一样,Apache Mesos为了简化设计,也是采用了master/slave结构,为了解决master单点故障,将master做得尽可能地轻量级,其上面所有的元数据 ...
- java 基础的几种算法
1:冒泡排序:2个之间进行循环筛选 public void sort(int[] a) { int temp = 0; for (int i = a.length - 1; i > 0; i ...
- Linux学习 -- 用户和用户组管理
1 用户配置文件 1.1 用户信息文件 /etc/passwd 查看帮助 man 5 passwd -- account:password:UID:GID:GECOS:directory:shell ...
- Hibernate锁机制
业务逻辑的实现过程中,往往需要保证数据访问的排他性.因此,我们就需要通过一些机制来保证这些数据在某个操作过程中不会被外界修改,这样的机制,在这里,也就是所谓的“锁”,即给我们选定的目标数据上锁,使其无 ...