亿源网

查看: 25711|回复: 100

jdk 10.0.2绿色免环境变量精简版

  [复制链接]
  • TA的每日心情
    开心
    昨天 05:33
  • 签到天数: 71 天

    连续签到: 2 天

    [LV.6]常住居民II

    25

    主题

    142

    帖子

    758

    积分

    VIP会员

    Rank: 16Rank: 16Rank: 16Rank: 16

    积分
    758
    发表于 2018-10-14 23:22:22 | 显示全部楼层 |阅读模式

    JDK(Java Development Kit)是整个Java的核心,包括了Java运行环境、Java工具和Java基础类库。JDK作为JAVA开发的环境,运行JAVA程序不可缺少的环境,不管是做JAVA开发还是做安卓开发,都必须在电脑上安装JDK。小到小型设备,大到智慧城市,Java的贡献力量是其他任何技术都无可比拟的。

    Java 8 已经出来三年多的时间了,原本计划2016年七月份release Java 9,但是基于种种原因,Java 9 被推迟到了2017年的3月份,本人也在Open JDK的官网上看到了Java 10的标准也在制定当中,Java的发展真的越来越快了,在Java 9正式发布之前,我们可以使用它的SNAPSHOT版本,先来体验一下Java 9 有哪些新的特性,下面的清单来自于官方文档,看着似乎很多,但是真正具有颠覆意义的其实就是Module System,其余很多主要是一些新的feature增加,还有一些功能的加强,在本篇文章中,我们将介绍一下主要的几个,不会一一去说,资料也不多,所以我想说也没的说,另外Java 8 是我认为迄今为止Java 最大的一次变化,不光是特性的增加,更多的是编程风格的转变,如果你还没有掌握Java 8,建议你赶紧学一下java8的一些新特性吧。以下是java9 所带来的新特性


    1. Modular System – Jigsaw Project

    该特性是Java 9 最大的一个特性,Java 9起初的代号就叫Jigsaw,最近被更改为Modularity,Modularity提供了类似于OSGI框架的功能,模块之间存在相互的依赖关系,可以导出一个公共的API,并且隐藏实现的细节,Java提供该功能的主要的动机在于,减少内存的开销,我们大家都知道,在JVM启动的时候,至少会有30~60MB的内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去,模块化可以根据模块的需要加载程序运行需要的class,那么JVM是如何知道需要加载那些class的呢?这就是在Java 9 中引入的一个新的文件module.java我们大致来看一下一个例子(module-info.java)

    1.         modulecom.baeldung.java9.modules.car{
    2.             requirescom.baeldung.java9.modules.engines;
    3.             exportscom.baeldung.java9.modules.car.handling;
    4.         }
    复制代码


    关于更多Java 9 模块编程的内容请参考一本书:《Java 9 Modularity》里面讲的比较详细,介绍了当前Java对jar之间以来的管理是多么的混乱,引入modularity之后的改变会是很明显的差别。


    2. 全新的HttpClient

    就目前而言,JDK提供的Http访问功能,几乎都需要依赖于HttpURLConnection,但是这个类大家在写代码的时候很少使用,我们一般都会选择Apache的Http Client,此次在Java 9的版本中引入了一个新的package:java.net.http,里面提供了对Http访问很好的支持,不仅支持Http1.1而且还支持HTTP2,以及WebSocket,据说性能可以超过Apache HttpClient,Netty,Jetty,简单的来看一个代码片段

    1. URIhttpURI=newURI("[color=rgb(0, 0, 255) !important]http://www.masuit.com");
    2. HttpRequestrequest=HttpRequest.create(httpURI).GET();
    3. HttpResponseresponse=request.response();
    4. StringresponseBody=response.body(HttpResponse.asString());
    复制代码



    3. Process API Enhance

    在Java很早的版本中,提供了Process这样的API可以获得进程的一些信息,包括runtime,甚至是用它来执行当前主机的一些命令,但是请大家思考一个问题,你如何获得你当前Java运行程序的PID?很显然通过Process是无法获得的,需要借助于JMX才能得到,但是在这一次的增强中,你将会很轻松的得到这样的信息,我们来看一个简单的例子

    1. ProcessHandleself=ProcessHandle.current();
    2. longPID=self.getPid();
    3. ProcessHandle.InfoprocInfo=self.info();
    4. Optionalargs=procInfo.arguments();
    5. Optionalcmd=procInfo.commandLine();
    6. OptionalstartTime=procInfo.startInstant();
    7. OptionalcpuUsage=procInfo.totalCpuDuration();
    复制代码

    上面有大量的Optional,这是Java 8中的API,同样在Java 9中对其进行了增强,本人在Java 8实战视频中对Optional API进行了源码级别的剖析,感兴趣的一定要去看看。

    已经获取到了JVM的进程,我们该如何将该进程优雅的停掉呢?下面的代码给出了答案

    1. childProc=ProcessHandle.current().children();
    2. childProc.forEach(procHandle->{
    3. assertTrue("Couldnotkillprocess"+procHandle.getPid(),procHandle.destroy());
    4. });
    复制代码


    通过上面的一小段代码,我们也发现了Java 9对断言机制同样增加了一些增强,多说一些题外话,我们目前的系统中运行一个严重依赖于Hive beelineServer的程序,beeline server不是很稳定,经常出现卡顿,甚至假死,假死后也不回复的问题,这样就导致我们的程序也会出现卡顿,如果运维人员不对其进行清理,系统运行几个月之后会发现很多僵尸进程,于是增加一个获取当前JVM PID的功能,然后判断到超过给定的时间对其进行主动杀死,完全是程序内部的行为,但是获取PID就必须借助于JMX的动作,另外杀死它也必须借助于操作系统的命令,诸如kill这样的命令,显得非常的麻烦,但是Java 9的方式明显要优雅方便许多。


    4. Try-With-Resources的改变

    我们都知道,Try-With-Resources是从JDK 7 中引入的一项重要特征,只要接口继承了Closable就可以使用Try-With-Resources,减少finally语句块的编写,在Java 9 中会更加的方便这一特征

    1. MyAutoCloseablemac=newMyAutoCloseable();
    2. try(mac){
    3. //dosomestuffwithmac
    4. }
    5. try(newMyAutoCloseable(){}.finalWrapper.finalCloseable){
    6. //dosomestuffwithfinalCloseable
    7. }catch(Exceptionex){}
    复制代码


    我们的Closeable完全不用写在try()中。


    5. Diamond Operator Extension
    1. interface InterfaceWithPrivateMethods{
    2. private static StringstaticPrivate(){
    3. return"staticprivate";
    4. }
    5. private String instancePrivate(){
    6. return"instanceprivate";
    7. }
    8. default void check(){
    9. Stringresult=staticPrivate();
    10. InterfaceWithPrivateMethodspvt=new InterfaceWithPrivateMethods(){
    11. //anonymousclass
    12. };
    13. result=pvt.instancePrivate();
    14. }
    15. }}
    复制代码


    该特性完全是为了Java 8中default方法和static方法服务的。


    7.JShell Command Line Tool

    在Java 8 出来的时候,很多人都喊着,这是要抢夺Scala等基于JVM动态语言的市场啊,其中有人给出了一个Java做不到的方向,那就是Scala可以当作脚本语言,Java可以么?很明显在此之前Java不行,ta也不具备动态性,但是此次Java 9 却让Java也可以像脚本语言一样来运行了,主要得益于JShell,我们来看一下这个演示

    1. jdk-9in>jshell.exe
    2. |WelcometoJShell--Version9
    3. |Foranintroductiontype:/helpintro
    4. jshell>"Thisismylongstring.Iwantapartofit".substring(8,19);
    5. $5==>"mylongstring"
    复制代码


    这是我们在Jshell这个控制台下运行,我们如何运行脚本文件呢?

    1. jshell>/savec:developJShell_hello_world.txt
    2. jshell>/openc:developJShell_hello_world.txt
    3. HelloJShell!
    复制代码



    8.JCMD Sub-Commands

    记得在Java 8中,放弃了Jhat这个命令,但是很快在Java 9中增加了一些新的命令,比如我们要介绍到的jcmd,借助它你可以很好的看到类之间的依赖关系

    1. jdk-9in>jcmd14056VM.class_hierarchy-i-sjava.net.Socket
    2. 14056:
    3. java.lang.Object/null
    4. |--java.net.Socket/null
    5. |implementsjava.io.Closeable/null(declaredintf)
    6. |implementsjava.lang.AutoCloseable/null(inheritedintf)
    7. ||--org.eclipse.ecf.internal.provider.filetransfer.httpclient4.CloseMonitoringSocket
    8. ||implementsjava.lang.AutoCloseable/null(inheritedintf)
    9. ||implementsjava.io.Closeable/null(inheritedintf)
    10. ||--javax.net.ssl.SSLSocket/null
    11. ||implementsjava.lang.AutoCloseable/null(inheritedintf)
    12. ||implementsjava.io.Closeable/null(inheritedintf)
    复制代码

    9.Мulti-Resolution Image API

    接口java.awt.image.MultiResolutionImage封装了一系列的不同分辨率图像到一个单独对象的API,我么可以根据给定的DPI 矩阵获取resolution-specific,看一下下面的代码片段

    1. BufferedImage[]resolutionVariants=....
    2. MultiResolutionImagebmrImage
    3. =new BaseMultiResolutionImage(baseIndex,resolutionVariants);
    4. ImagetestRVImage=bmrImage.getResolutionVariant(16,16);
    5. assertSame("Imagesshouldbethesame",testRVImage,resolutionVariants[3]);
    复制代码


    关于AWT的东西,本人几乎不怎么接触,如果有用到的朋友,等JDK 9出来之后,自己体会使用一下吧。


    10.Variable Handles

    很早之前就传言Java 会将unsafe这一个类屏蔽掉,不给大家使用,这次看他的官方文档,貌似所有已sun开头的包都将不能在application中使用,但是java 9 提供了新的API供大家使用。

    在JDK 9中提供了一个新的包,叫做java.lang.invoke里面有一系列很重要的类比如VarHandler和MethodHandles,提供了类似于原子操作以及Unsafe操作的功能。


    11.Publish-Subscribe Framework

    在新版的JDK 9 中提供了消息发布订阅的框架,该框架主要是由Flow这个类提供的,他同样会在java.util.concurrent中出现,并且提供了Reactive编程模式。


    12.Unified JVM Logging

    该特性为JVM的所有组件引入了一个通用的日志系统,提供了JVM日志的基础设施,你可以不用专门为了打印某些日志而添加一些专门的标签,只需要使用统一的log指令即可,比如:

    1. java-Xlog:gc=debug:file=gc.txt:none...
    2. jcmd9615VM.logoutput=gc_logswhat=gc
    复制代码


    13.Immutable Set

    其实在Java的早期版本中就已经有这样的功能了,比如Collections.xxx就可以将某个collection封装成不可变,但是此次的Java 9版本将其加到了对应的Set和List中,并且有一个专门的新包用来存放这些具体的实现java.util.ImmutableCollections,这一个特性和Scala真的如出一辙。

    1. SetstrKeySet=Set.of("key1","key2","key3");
    复制代码


    14. Optional To Stream

    对Option提供了stream功能,关于Optional的用法,我在我的教程中讲的非常详细,如果你还没有掌握,抓紧啊

    1. ListfilteredList=listOfOptionals.stream()
    2. .flatMap(Optional::stream)
    3. .collect(Collectors.toList());
    复制代码



    15. 其他
    • 大致的特性我就介绍这么多,你也可以到openJDK官网下载snapshot版本的java 9 来玩一下,当然还有其他很多功能我就不一一介绍了,这里只是大概的提一下

    • 轻量级的json文本处理api

    • 移除很多已经被过期的GCC回收器(是移除哦,因为在Jdk 8 中只是加了过期的标记)

    • 使用G1垃圾回收器作为默认的垃圾回收器

    • HTML5风格的java doc

    • java doc只是智能搜索功能

    • javascript的引擎得到了进一步的升级

    • 引入了SHA-3的hash算法



    下载地址:

    游客,如果您要查看本帖隐藏内容请回复


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    回复

    使用道具 举报

  • TA的每日心情
    难过
    3 天前
  • 签到天数: 68 天

    连续签到: 5 天

    [LV.6]常住居民II

    0

    主题

    91

    帖子

    572

    积分

    高级会员

    Rank: 4

    积分
    572
    发表于 2018-10-15 00:21:49 | 显示全部楼层
    楼下的接上。。。。
    回复

    使用道具 举报

  • TA的每日心情

    8 小时前
  • 签到天数: 84 天

    连续签到: 7 天

    [LV.6]常住居民II

    0

    主题

    102

    帖子

    681

    积分

    高级会员

    Rank: 4

    积分
    681
    发表于 2018-10-17 23:06:20 | 显示全部楼层
    顶顶更健康
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    昨天 05:00
  • 签到天数: 67 天

    连续签到: 2 天

    [LV.6]常住居民II

    0

    主题

    102

    帖子

    567

    积分

    高级会员

    Rank: 4

    积分
    567
    发表于 2018-10-18 13:54:49 | 显示全部楼层
    支持你哈...................................
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    7 小时前
  • 签到天数: 69 天

    连续签到: 6 天

    [LV.6]常住居民II

    0

    主题

    96

    帖子

    591

    积分

    高级会员

    Rank: 4

    积分
    591
    发表于 2018-10-20 00:27:56 | 显示全部楼层
    好,很好,非常好!
    回复

    使用道具 举报

  • TA的每日心情
    开心
    昨天 05:33
  • 签到天数: 71 天

    连续签到: 2 天

    [LV.6]常住居民II

    25

    主题

    142

    帖子

    758

    积分

    VIP会员

    Rank: 16Rank: 16Rank: 16Rank: 16

    积分
    758
     楼主| 发表于 2018-10-25 02:05:16 | 显示全部楼层
    纯粹路过,没任何兴趣,仅仅是看在老用户份上回复一下
    回复

    使用道具 举报

  • TA的每日心情
    难过
    2019-5-13 22:06
  • 签到天数: 64 天

    连续签到: 1 天

    [LV.6]常住居民II

    0

    主题

    102

    帖子

    602

    积分

    高级会员

    Rank: 4

    积分
    602
    发表于 2018-11-3 13:59:49 | 显示全部楼层
    回个帖子,下班咯~
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 06:14
  • 签到天数: 72 天

    连续签到: 1 天

    [LV.6]常住居民II

    0

    主题

    113

    帖子

    609

    积分

    高级会员

    Rank: 4

    积分
    609
    发表于 2018-11-19 05:30:31 | 显示全部楼层
    众里寻他千百度,蓦然回首在这里!
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    3 小时前
  • 签到天数: 73 天

    连续签到: 5 天

    [LV.6]常住居民II

    0

    主题

    105

    帖子

    637

    积分

    高级会员

    Rank: 4

    积分
    637
    发表于 2018-11-19 10:55:42 | 显示全部楼层
    楼下的接上。。。。
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    3 天前
  • 签到天数: 70 天

    连续签到: 9 天

    [LV.6]常住居民II

    0

    主题

    116

    帖子

    622

    积分

    高级会员

    Rank: 4

    积分
    622
    发表于 2018-11-25 08:12:42 | 显示全部楼层
    支持支持再支持
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    Archiver|手机版|小黑屋|亿源网

    GMT+8, 2019-5-21 11:11 , Processed in 0.112168 second(s), 52 queries .

    Powered by Discuz! X3.4

    © 2015-2018 keeeg.com.

    快速回复 返回顶部 返回列表