Java9新特性(2)--Java标准模块系统(Jigsaw)(一)

参考地址:http://openjdk.java.net/projects/jigsaw/

前言

    很多朋友可能觉得java9都还没有整明白,java10就出来取代java9了,java11在官网上也已经提上日程了,那我们还有需要学习java9么?

    有,当然有,因为无论怎么变,它的开发核心思想是不会变的,就好像我们的标准模块化系统,模块化系统可谓是java的一个重大突破,他的存在使java的运行速度有了一个质的飞跃.并且即使java版本怎么变,这个java的模块系统这一特性是不会变的,从新出的java10就可以体现了,java10依然沿用了这个标准模块化系统.所以现在你们想要用java9,java10甚至是以后的java版本这个标准模块化系统的学习是必须的.那到底标准模块化系统到底是什么东西,他和之前的java版本区别在呢!我们将在本文中掀开他的面纱.

1. 标准模块化系统存在的意义

    虽然jdk版本升级了,但是还是有的人在使用旧的版本,为了兼容旧版本的内容,我们不能把旧的东西丢弃,可是新的东西又越来越多,导致jdk越来越臃肿,越来越大,就像一个胖子一样,可是在运行的时候所有的内容都要加载进去内存中,导致了加载时间变长,运行速度变慢,为了改变这样一个问题,提出了模块独立、化繁为简的设计理念,从此Jigsaw项目由此诞生.

    Jigsaw项目分为Java SE平台设计和实现标准模块系统两个内容,也就是说模块化系统只是Jigsaw项目的一部分。其主要目标是为了让我们的java平台的实现更容易扩展到小型设备,提高安全性和可维护性,提高应用程序性能,并为开发人员提供更好的大型编程工具。

2. 与之前的版本相比,jdk的改变.

安装目录的改变:

安装目录变化图

通过安装目录我们可以知道java9做出了一个洗牌性的改变:
    1.jre文件夹没有了,jre文件夾包含rt.jar类库等,jre里面包含了我们java的运行环境和jvm,他被jmods文件夹取代了
    2.lib中删掉了tools.jar,tools.jar中存放的是javac编译器等工具类库.
    3.还有一个新的conf 目录,可以让管理员更改 JDK 配置. Conf 中有网络和日志属性。

那些改变是和标准模块化系统相关的呢?

java8及之前版本的运行目录

    Java8以及之前版本的jdk在jvm启动的时候都需要把所有的jar包通过classloader加载进内存,不管你是否用到都加载进内存,所以内存需要消耗120MB左右,如果不改变这种加载方式,这个占的内存空间会随着版本的更新而增加.

java9运行目录

    java9改变了之后,它把必须加载的jre中的jar包转换成jmods一个个的jmod文件了,而这些jmod文件是可选的,系统会默认一个java.base.jmod文件,其余的我们可以根据自己的需求进行一个配置,系统会根据我们的配置进行一个加载,这样更好的贴合我们的要求,改变了之后我们的内存要求就大大的减少了只需要2-120MB内存,这样做到了因地制宜,我们就可以让java使用在一些内存比较小的设备中了,甚至可以使用在现在非常流行的物联网的应用,让java这个语言的使用更为广泛.

    没有了tools.jar这些jar包,classpath的配置都变得没有意义了,解决了很多关于classpath配的问题.类的引用都是通过module-info.java文件进行的,清晰明了可维护性更加高.模块与模块之间还需要配置关系,所以现在类与类之间的访问不再是单单根据访问权限来了,即使你的类使用了public,如果模块和模块之间没有进行依赖也是访问不了的,提高了访问的安全性实现了强封装.

3. 类加载机制的变化

Jar包变为jmod模块,可想而知类的加载机制也会发生改变

类关系图

    通过类加载机制的类关系图可以发现,java8和java9最大的不同在于ExtClassLoader变成了PlatformClassLoader加载器.

我们现在先来一起了解一下这些加载类的作用吧!

Java8的类加载类:

    Bootstrp loader:启动类加载器,负责加载%JAVA_HOME%/jre/lib目录下的类库,如rt.jar,为什么上面类关系图中没有显示这个类呢,因为BootClassLoader这个类是C++语言写的,所以我们不能直接引用.
    ExtClassLoader:扩展类加载器,负责加载%JAVA_HOME%/jre/lib/ext目录的类库
    AppClassLoader:应用程序类加载器,负责加载系统类路径classpath目录下的类库

三者的加载机制模型关系图如下:

java8双亲委托机制

    这种模型叫做双亲委托模型,其实就是当我们写的自定义类需要加载,那么这个是我们自己写的程序,是需要AppClassLoader来加载的,但是在AppClassLoader加载之前他先会委托给ExtClassLoader看看%JAVA_HOME%/jre/lib/ext目录中有没有这个类,那么此时ExtClassLoader还会先委托给Bootstrp loader先查%JAVA_HOME%/jre/lib目录下有没有这个类.这样一级一级地确认自定义类是唯一的,这样的加载方式就是双亲委托加载机制.
    目的是为了能够防止重复加载.

Java9的类加载类:

    BootClassLoader:启动类加载器,加载启动的基础模块类,例如: java.base、java.logging 、java.desktop等模块.
    PlatformClassLoader:加载平台相关的模块,例如:java.activation 、java.se 、jdk.desktop等模块
    AppClassLoader:加载应用级别的模块,例如: jdk.javadoc 、 jdk.jshell 、 jdk.jlink 等模块

三者的加载机制模型关系图如下:

java9双亲委托机制

    Java9还是双亲委托模型,这是没毛病的,这样做的目的还是和之前的版本兼容,但是它在之前的基础上多加了一层,就是加载自定类,还是通过AppClassLoader加载,

    AppClassLoader先查找BootClassLoader和PlatformClassLoader中我们配置的模块中有没有,找了模块之后如果还是找不到的话就证明这些类可能不在模块中,所以还是按照旧的加载方式先找PlatformClassLoader对应目录中的类,没有找到再去找BootClassLoader中对应的类.
    PlatformClassLoader也是一样的,所有加载器配置模块中找到对应的类,找不到再去找BootClassLoader对应的目录中的类.
    BootClassLoader就只需要从自己的模块中找,模块找不到再找自己目录中的类.
    也就是先加载模块中的类再找目录下的类

小结:

本文讲述了标准模块化系统对java的好处和加载机制和之前版本的一个区别,但是具体的怎么用我们还没有去实现,请期待下一篇文章,下一篇文章我们将带大家使用模块化系统来开发,真正通过代码来感受其强大之处.

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • JAVA类装载方式,有两种: 1.隐式装载, 程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器...
    代码之尖阅读 653评论 0 48
  • 首先声明,我是因为看了ImportNew网站上的几篇关于类加载器的文章之后,才萌生了写这篇文章的想法。所以在写这篇...
    陈安妮annie1阅读 256评论 0 1
  • JAVA类装载方式,有两种 隐式装载:程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应...
    yincb阅读 601评论 0 2
  • 什么是面向对象程序设计 程序设计的本质是把人们在现实生活中遇到的问题通过抽象处理,利用编程语言转换到计算机能够理解...
    辽A丶孙悟空阅读 734评论 2 23
  • JVM类加载器ClassLoader JAVA类装载方式 1.隐式装载, 程序在运行过程中当碰到通过new 等方式...
    步二小哥阅读 432评论 0 1