Java8新特性之精简的JRE详解_动力节点Java学院整理

 更新时间:2017年06月08日 11:20:33   投稿:mrr  
这篇文章主要介绍了Java8新特性之精简的JRE详解的相关资料,需要的朋友可以参考下

Oracle公司如期发布了Java 8正式版!没有让广大javaer失望。对于一个人来说,18岁是人生的转折点,从稚嫩走向成熟,法律意味着你是完全民事行为能力人,不再收益于未成年人保护法,到今年为止,java也走过了18年,java8是一个新的里程碑,带来了前所未有的诸多特性,lambda表达式,Stream API,新的Date time api,多核并发支持,重大安全问题改进等,相信java会越来越好,丰富的类库以及庞大的开源生态环境是其他语言所不具备的,说起丰富的类库,很多同学就吐槽了,java该减肥了,确实是该减肥,java8有个很好的特性,该特性定义了Java SE平台规范的一些子集,使java应用程序不需要整个JRE平台即可部署和运行在小型设备上。开发人员可以基于目标硬件的可用资源选择一个合适的JRE运行环境。

好处

1.更小的Java环境需要更少的计算资源。

2.一个较小的运行时环境可以更好的优化性能和启动时间。

3.消除未使用的代码从安全的角度总是好的。

4.这些打包的应用程序可以下载速度更快。

概念

紧凑的JRE分3种,分别是compact1、compact2、compact3,他们的关系是compact1<compact2<compact3,他们包含的API如下图所示

使用javac根据profile编译应用程序

javac –bootclasspath, or javac –profile <profile> 

如果不符合compact的api,则报错。

$ 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

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<>();
 }
}
************** 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

$ 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编程实现UDP网络通讯的方法示例

    JAVA编程实现UDP网络通讯的方法示例

    这篇文章主要介绍了JAVA编程实现UDP网络通讯的方法,简单说明了UDP通讯的原理并结合实例形式分析了java实现UDP通讯的相关类与使用技巧,需要的朋友可以参考下
    2017-08-08
  • java简单实现斗地主发牌功能

    java简单实现斗地主发牌功能

    这篇文章主要为大家详细介绍了java简单实现斗地主发牌功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • 关于@CacheEvict无法解决分页缓存清除的解决思路

    关于@CacheEvict无法解决分页缓存清除的解决思路

    这篇文章主要介绍了关于@CacheEvict无法解决分页缓存清除的解决思路,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Mybatis以main方法形式调用dao层执行代码实例

    Mybatis以main方法形式调用dao层执行代码实例

    这篇文章主要介绍了Mybatis以main方法形式调用dao层执行代码实例,MyBatis 是一款优秀的持久层框架,MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,需要的朋友可以参考下
    2023-08-08
  • mybatis如何批量修改数据

    mybatis如何批量修改数据

    这篇文章主要介绍了mybatis如何批量修改数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • MybatisPlus使用@TableId主键id自增长无效的解决

    MybatisPlus使用@TableId主键id自增长无效的解决

    本文主要介绍了MybatisPlus使用@TableId主键id自增长无效的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • ElasticSearch学习之Es集群Api操作示例

    ElasticSearch学习之Es集群Api操作示例

    这篇文章主要为大家介绍了ElasticSearch学习之Es集群Api操作示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Spring Cloud 覆写远端的配置属性实例详解

    Spring Cloud 覆写远端的配置属性实例详解

    这篇文章主要介绍了Spring Cloud 覆写远端的配置属性的相关知识,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2018-01-01
  • SpringBoot关闭过程中销毁DisposableBean解读

    SpringBoot关闭过程中销毁DisposableBean解读

    这篇文章主要介绍了SpringBoot关闭过程中销毁DisposableBean解读,一个bean的生命周期,指的是 bean 从创建,初始化,一系列使用,销毁的过程,今天来讲讲 bean 的初始化和销毁的方法,需要的朋友可以参考下
    2023-12-12
  • Servlet3.0学习总结之基于Servlet3.0的文件上传实例

    Servlet3.0学习总结之基于Servlet3.0的文件上传实例

    本篇文章主要介绍了Servlet3.0学习总结之基于Servlet3.0的文件上传实例,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07

最新评论