精华内容
下载资源
问答
  • 用jdk1.8还是用jdk11
    万次阅读 多人点赞
    2020-12-12 11:20:13

    2020年年初,公司CTO要求我们采用最新版本jdk,甚至直接使用最新版kotlin。前两天(2020年12月),我把公司代码升级到了jdk11 LTS版本,但不是最新版jdk。

    如果不搞rocketmq,不会发现什么问题,而且会感觉这是一个很好的改进,编码写法改进了,甚至性能提高了……

    然后,一搞rocketmq,发现:不说jdk11,甚至jdk9都无法让最新版的rockemq起起来。

    回想一下,这几年,各个大厂都推出了自己的jdk版本,华为有自己的jdk、阿里有自己的jdk,但殊路同归的是都用的是jdk1.8这个版本。要想用大厂优化过的jdk,或者要想用大厂出品的部分组件,你就得考虑你的jdk版本是否基于1.8的版本,比如:rocketmq。

    我一直在想为什么要从jdk1.8升级到jdk11或者jdk14、15,难道jdk1.8不香吗?

    个人认为:jdk1.8依旧很香。因为,jdk1.8已经经过了6年的补丁修复,而Oracle是注重口碑的大厂,它不会让jdk1.8在补丁修复中加入新的漏洞。而jdk12、13、14才经过两三年的维护,你知道jdk12、13、14或者jdk15中未修复的bug有多少吗?你知道jdk15中未发现的漏洞有多少吗?至少,我不知道。而,各个大厂更直接:推出了各自维护的jdk1.8的版本,并向openjdk贡献代码,这使得jdk1.8的漏洞更少,虚机也会更稳定。所以,我的建议是服务器环境依旧采用jdk1.8,而不是冒进采用最新版jdk。

    仅此发表一下本人的见解,仅此而已,并无他意。

     

    2020年12月12日下午补充:

    下午,调研后发现,经过这1年,2020年各大厂已经基本都推出了jdk11的LTS版本,而且已经经过了半年以上的时间的检验,除了腾讯以外,各大厂基本都已开源各自的jdk11版本:

    腾讯开源依旧Kona8,华为已有毕昇11,阿里已有Dragonwell 11,亚马逊已有Corretto11和15,Eclipse基金会已有AdoptOpenJDK11和15,Redhat也已有自己的jdk11版本。

    目前来看,完全可以采用jdk11了。当然,我的想法还是LTS版本的jdk11,而不是最新版本的jdk。

    而,rocketmq问题,如果不是源码开发,就只能暂时安装两个jdk(jdk8和jdk11)或者单独搭建一台装有jdk8的服务器或者搭建一个jdk8的docker镜像来解决了,这可以抛给运维人员了。

    当然,作为小厂,我的想法依旧是只采用大厂用过没有问题或者已有解决方案的LTS版本,而不是最新版本。

    最后,上jdk11(LTS)吧,同志们,大厂都有版本了,而且已经检验了一年了。

    更多相关内容
  • jdk1.8 升级到 jdk11 遇到的一些坑

    千次阅读 多人点赞 2021-08-14 15:11:13
    jdk1.8 升级到 jdk11 遇到的一些坑

    一、jdk11 移除了 Base64

    替代方案

            Base64.getEncoder().encodeToString
    
            Base64.getDecoder().decode
    

    二、Maven 打包报错

    修改方案,更新maven打包插件

    <plugin>
    	<groupId>org.apache.maven.plugins</groupId>
    		<artifactId>maven-compiler-plugin</artifactId>
    		<version>3.8.0</version>
    		<configuration>
    			<release>11</release>
    			<encoding>UTF-8</encoding>
    		</configuration>
    </plugin>
    

    三、Lombok 无法使用

    解决方案,升级lombok

    
            <dependency>
    			<groupId>org.projectlombok</groupId>
    			<artifactId>lombok</artifactId>
    			<version>1.18.4</version>
    			<scope>provided</scope>
    		</dependency>
    

    四、xmlelement 注解无法使用

    解决方案,引入外部jar,jdk11已经移除此包

    <dependency>
    			<groupId>javax.xml.bind</groupId>
    			<artifactId>jaxb-api</artifactId>
    			<version>2.3.0</version>
    		</dependency>
    		<dependency>
    			<groupId>com.sun.xml.bind</groupId>
    			<artifactId>jaxb-core</artifactId>
    			<version>2.3.0</version>
    		</dependency>
    		<dependency>
    			<groupId>com.sun.xml.bind</groupId>
    			<artifactId>jaxb-impl</artifactId>
    			<version>2.3.0</version>
    		</dependency>
    

    福利大放送

    关注微信公众号“AI码师”,领取面试资料和2021最新全套微服务教程
    在这里插入图片描述

    展开全文
  • jdk9、jdk10、jdk11、jdk12、jdk13新特性

    万次阅读 多人点赞 2019-10-28 09:03:22
    我们绝大部分人估计都还在用着jdk8,12其实是一个非LTS(long time support)版本,而11与8一样是LTS版,意味着下个通用的版本将从8直接到11,毕竟11包含了9和10的所有新特性,因此9和10估计就直接被废弃啦。...

    我们绝大部分人估计都还在用着jdk8,12其实是一个非LTS(long time support)版本,而11与8一样是LTS版,意味着下个通用的版本将从8直接到11,毕竟11包含了9和10的所有新特性,因此9和10估计就直接被废弃啦。不过9、10、11、12面向开发者的新特性其实并不是很多,大部分都是一些优化、收集器加强以及增加了一些新功能等等

    而我们开发人员最为关注的肯定是对我们搬砖有用的特性,虽然可能还用不太上,但这边还是先记录一下从jdk9-12的新特性:

     

    jdk9新特性


    1、集合加强

    jdk9为所有集合(List/Set/Map)都增加了of和copyOf方法,用来创建不可变集合,即一旦创建就无法再执行添加、删除、替换、排序等操作,否则将报java.lang.UnsupportedOperationException异常。一般在特定场景下用还是可以的,不过如果引用了guava库的话推荐还是使用guava把hhhh,例子如下:

        List strs = List.of("Hello", "World");
     
        List strsCopy = List. copyOf(strs);
     
        Set strs = Set.of("Hello", "World");
     
        Map maps = Map.of("Hello", 1, "World", 2);


    2、私有接口方法

    jdk8提供了接口的默认方法(default)和静态方法,打破了之前接口只能定义方法而不能存在行为。jdk9则是允许接口定义私有方法,私有方法可以作为通用方法放在默认方法中调用,不过实际中并无多大用处,至少对我来说。

    3、垃圾收集机制

    jdk9把G1作为默认的垃圾收集器实现,替换了jdk7和jdk8的默认垃圾收集器实现:Parallel Scavenge(新生代)+Parallel Old(老年代)。

    4、I/O流加强

    java.io.InputStream 中增加了新的方法来读取和复制 InputStream 中包含的数据:

    readAllBytes:读取 InputStream 中的所有剩余字节

    readNBytes: 从 InputStream 中读取指定数量的字节到数组中

    transferTo:读取 InputStream 中的全部字节并写入到指定的 OutputStream 中 

    5、JShell工具

    jdk9引入了jshell这个交互性工具,让Java也可以像脚本语言一样来运行,可以从控制台启动 jshell ,在 jshell 中直接输入表达式并查看其执行结果。当需要测试一个方法的运行效果,或是快速的对表达式进行求值时,jshell 都非常实用。举个例子:

     

    jdk10新特性


    1、局部变量类型推断

    局部变量类型推断可以说是jdk10中最值得注意的特性,这是Java语言开发人员为了简化Java应用程序的编写而采取的又一步,举个例子:

    原先我们需要这么定义一个list

    List<String> list = new ArrayList<>();
    使用局部类型推断var关键词定义

    var list = new ArrayList<String>();
    不过局部变量类型推断仅仅适用在:

    有初始化值的局部变量

    增强 for 循环中的索引

    传统 for 循环中声明的局部变量

    Oracle 的 Java 团队申明,以下不支持局部变量类型推断:

    方法参数

    构造函数参数

    方法返回类型

    字段

    catch 代码块(或任何其他类型的变量声明)

    2、线程本地握手

    jdk10将引入一种在线程上执行回调的新方法,因此这将会很方便能停止单个线程而不是停止全部线程或者一个都不停。说实话并不是很懂是什么意思...

    3、GC改进和内存管理

    jdk10中有2个JEP专门用于改进当前的垃圾收集元素。

    第一个垃圾收集器接口是(JEP 304),它将引入一个纯净的垃圾收集器接口,以帮助改进不同垃圾收集器的源代码隔离。

    预定用于Java 10的第二个JEP是针对G1的并行完全GC(JEP 307),其重点在于通过完全GC并行来改善G1最坏情况的等待时间。G1是Java 9中的默认GC,并且此JEP的目标是使G1平行。

     

    jdk11新特性


    1、字符串加强

    // 判断字符串是否为空白
    " ".isBlank(); // true
    // 去除首尾空格
    " Javastack ".strip(); // "Javastack"
    // 去除尾部空格 
    " Javastack ".stripTrailing(); 
    // 去除首部空格 
    " Javastack ".stripLeading(); // "Javastack "
    // 复制字符串
    "Java".repeat(3); // "JavaJavaJava"
    // 行数统计
    "A\nB\nC".lines().count(); // 3


    2、HttClient Api

    这是 Java 9 开始引入的一个处理 HTTP 请求的的孵化 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在java.net包中找到这个 Api

    3、用于 Lambda 参数的局部变量语法

    用于 Lambda 参数的局部变量语法简单来说就是支持类型推导:

    var x = new A();
     
    for (var x : xs) { ... }
     
    try (var x = ...) { ... } catch ...


    4、ZGC

    从JDK 9开始,JDK使用G1作为默认的垃圾回收器。G1可以说是GC的一个里程碑,G1之前的GC回收,还是基于固定的内存区域,而G1采用了一种“细粒度”的内存管理策略,不在固定的区分内存区域属于surviors、eden、old,而我们不需要再去对于年轻代使用一种回收策略,老年代使用一种回收策略,取而代之的是一种整体的内存回收策略。这种回收策略在我们当下cpu、内存、服务规模都越来越大的情况下提供了更好的表现,而这一代ZGC更是有了突破性的进步。

    从原理上来理解,ZGC可以看做是G1之上更细粒度的内存管理策略。由于内存的不断分配回收会产生大量的内存碎片空间,因此需要整理策略防止内存空间碎片化,在整理期间需要将对于内存引用的线程逻辑暂停,这个过程被称为"Stop the world"。只有当整理完成后,线程逻辑才可以继续运行,一般而言,主要有如下几种方式优化"Stop the world":

    使用多个线程同时回收(并行回收)
    回收过程分为多次停顿(增量回收)
    在程序运行期间回收,不需要停顿或只停顿很短时间(并发回收)
    只回收内存而不整理内存
    ZGC主要采用的是并发回收的策略,相较于G1 ZGC最主要的提升是使用Load Barrier技术实现,引用R大对于ZGC的评价:

    与标记对象的传统算法相比,ZGC在指针上做标记,在访问指针时加入Load Barrier(读屏障),比如当对象正被GC移动,指针上的颜色就会不对,这个屏障就会先把指针更新为有效地址再返回,也就是,永远只有单个对象读取时有概率被减速,而不存在为了保持应用与GC一致而粗暴整体的Stop The World。

     

    jdk12新特性


    1、Switch Expressions

    这是一个为开发者准备的特性,我们可以利用具体代码快速了解一下,下面是传统 statement 形式的 switch 语法:

    switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
    System.out.println(6);
    break;
    case TUESDAY:
    System.out.println(7);
    break;
    case THURSDAY:
    case SATURDAY:
    System.out.println(8);
    break;
    case WEDNESDAY:
    System.out.println(9);
    break;
    }
    如果有编码经验,你一定知道,switch 语句如果漏写了一个 break,那么逻辑往往就跑偏了,这种方式既繁琐,又容易出错。如果换成 switch 表达式,Pattern Matching 机制能够自然地保证只有单一路径会被执行,请看下面的代码示例:

    switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY -> System.out.println(7);
    case THURSDAY, SATURDAY -> System.out.println(8);
    case WEDNESDAY -> System.out.println(9);
    }
    更进一步,下面的表达式,为我们提供了优雅地表达特定场合计算逻辑的方式

    int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> 9;
    };
    Switch Expressions 或者说起相关的 Pattern Matching 特性,为我们提供了勾勒出了 Java 语法进化的一个趋势,将开发者从复杂繁琐的低层次抽象中逐渐解放出来,以更高层次更优雅的抽象,既降低代码量,又避免意外编程错误的出现,进而提高代码质量和开发效率。

    2、Shenandoah GC

    新增了一个名为 Shenandoah 的 GC 算法,通过与正在运行的 Java 线程同时进行 evacuation 工作来减少 GC 暂停时间。使用 Shenandoah 的暂停时间与堆大小无关,这意味着无论堆是 200 MB 还是 200 GB,都将具有相同的暂停时间。


    JDK13新特性

    JDK13于9月17日正式发布。目前该版本包含的特性已经全部固定,主要包含以下五个:
    在这里插入图片描述

    下面来逐一介绍下这五个重要的特性。

    Dynamic CDS Archives

    这一特性是在JEP310:Application Class-Data Sharing基础上扩展而来的,Dynamic CDS Archives中的CDS指的就是Class-Data Sharing。

    那么,这个JEP310是个啥东西呢?

    我们知道在同一个物理机/虚拟机上启动多个JVM时,如果每个虚拟机都单独装载自己需要的所有类,启动成本和内存占用是比较高的。所以Java团队引入了CDS的概念,通过把一些核心类在每个JVM间共享,每个JVM只需要装载自己的应用类,启动时间减少了,另外核心类是共享的,所以JVM的内存占用也减少了。

    CDS 只能作用于 Boot Class Loader 加载的类,不能作用于 App Class Loader 或者自定义的 Class Loader 加载的类。

    在 Java 10 中,则将 CDS 扩展为 AppCDS,顾名思义,AppCDS 不止能够作用于 Boot Class Loader了,App Class Loader 和自定义的 Class Loader 也都能够起作用,大大加大了 CDS 的适用范围。也就说开发自定义的类也可以装载给多个JVM共享了。

    Java 10中包含的JEP310的通过跨不同Java进程共享公共类元数据来减少了内存占用和改进了启动时间。

    但是,JEP310中,使用AppCDS的过程还是比较复杂的,需要有三个步骤:
    在这里插入图片描述
    这一次的JDK 13中的JEP 350 ,在JEP310的基础上,又做了一些扩展。允许在Java应用程序执行结束时动态归档类,归档类将包括默认的基础层 CDS(class data-sharing)存档中不存在的所有已加载的应用程序类和库类。

    也就是说,在Java 13中再使用AppCDS的时候,就不在需要这么复杂了。

    ZGC: Uncommit Unused Memory

    在讨论这个问题之前,想先问一个问题,JVM的GC释放的内存会还给操作系统吗?

    GC后的内存如何处置,其实是取决于不同的垃圾回收器的。因为把内存还给OS,意味着要调整JVM的堆大小,这个过程是比较耗费资源的。

    在JDK 11中,Java引入了ZGC,这是一款可伸缩的低延迟垃圾收集器,但是当时只是实验性的。并且,ZGC释放的内存是不会还给操作系统的。

    在这里插入图片描述

    而在Java 13中,JEP 351再次对ZGC做了增强,本次 ZGC 可以将未使用的堆内存返回给操作系统。之所以引入这个特性,是因为如今有很多场景中内存是比较昂贵的资源,在以下情况中,将内存还给操作系统还是很有必要的:

    1、那些需要根据使用量付费的容器

    2、应用程序可能长时间处于空闲状态并与许多其他应用程序共享或竞争资源的环境。

    3、应用程序在执行期间可能有非常不同的堆空间需求。例如,启动期间所需的堆可能大于稍后在稳定状态执行期间所需的堆。

    Reimplement the Legacy Socket API

    使用易于维护和调试的更简单、更现代的实现替换 java.net.Socket 和 java.net.ServerSocket API。

    java.net.Socket和java.net.ServerSocket的实现非常古老,这个JEP为它们引入了一个现代的实现。现代实现是Java 13中的默认实现,但是旧的实现还没有删除,可以通过设置系统属性jdk.net.usePlainSocketImpl来使用它们。

    运行一个实例化Socket和ServerSocket的类将显示这个调试输出。这是默认的(新的).

    在这里插入图片描述
    上面输出的sun.nio.ch.NioSocketImpl就是新提供的实现。

    如果使用旧的实现也是可以的(指定参数jdk.net.usePlainSocketImpl):

    在这里插入图片描述
    上面的结果中,旧的实现java.net.PlainSocketImpl被用到了。

    Switch Expressions (Preview)

    在JDK 12中引入了Switch表达式作为预览特性。JEP 354修改了这个特性,它引入了yield语句,用于返回值。这意味着,switch表达式(返回值)应该使用yield, switch语句(不返回值)应该使用break。

    在以前,我们想要在switch中返回内容,还是比较麻烦的,一般语法如下:

    在这里插入图片描述
    在JDK13中使用以下语法:

    在这里插入图片描述
    或者
    在这里插入图片描述
    在这之后,switch中就多了一个关键字用于跳出switch块了,那就是yield,他用于返回一个值。和return的区别在于:return会直接跳出当前循环或者方法,而yield只会跳出当前switch块。

    Text Blocks (Preview)

    在JDK 12中引入了Raw String Literals特性,但在发布之前就放弃了。这个JEP在引入多行字符串文字(text block)在意义上是类似的。

    text block,文本块,是一个多行字符串文字,它避免了对大多数转义序列的需要,以可预测的方式自动格式化字符串,并在需要时让开发人员控制格式。

    我们以前从外部copy一段文本串到Java中,会被自动转义,如有一段以下字符串:

    在这里插入图片描述
    将其复制到Java的字符串中,会展示成以下内容:

    在这里插入图片描述

    使用“”“作为文本块的开始符合结束符,在其中就可以放置多行的字符串,不需要进行任何转义。看起来就十分清爽了。

    如常见的SQL语句:

    在这里插入图片描述
    看起来就比较直观,清爽了。

     

    JDK13中包含的5个特性,能够改变开发者的编码风格的主要有Text Blocks和Switch Expressions两个新特性,但是这两个特性还处于预览阶段。

    而且,JDK13并不是LTS(长期支持)版本,如果你正在使用Java 8(LTS)或者Java 11(LTS),暂时可以不必升级到Java 13.

    展开全文
  • 从JDK8到JDK11,带来了哪些新特性新变化

    万次阅读 多人点赞 2018-10-02 16:50:04
    从JDK8到JDK11,带来了哪些新特性新变化 文章目录从JDK8到JDK11,带来了哪些新特性新变化写在前面下载链接Stringlines()repeat(int)isBlank()strip()/stripLeading()/stripTrailing()CharSequencecompare...

    从JDK8到JDK11,带来了哪些新特性新变化

    写在前面

    JDK 11 正式发布了哈,网上摘录了一些api的修改。
    一般都是3个版本为一个节点,jdk5/8都是用的最普遍的,而且官方也宣布jdk11将会是后面几年持续更新修复的版本。
    一起来看看吧。

    下载链接

    https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html
    或者
    https://download.csdn.net/download/cmqwan/10699883

    String

    lines()

    字符串实例方法,使用专门的 Spliterator 来懒惰地提供源字符串中的行。

    repeat(int)

    按照参数 int 提供的次数来重复字符串的运行次数。

    isBlank()

    验证当前字符串是否为空,或者是否只包括空白字符(空白字符由 Character.isWhiteSpace(int) 验证)。

    strip()/stripLeading()/stripTrailing()

    这三个方法的作用分别是去掉字符串头和尾的空白符、字符串头的空白符、字符串尾的空白符,基本与 trim()/trimLeft()/trimRight() 方法相同,不过它们的空白字符由 Character.isWhiteSpace(int) 验证。

    CharSequence

    compare(CharSequence, CharSequence)

    按字典顺序进行排序。
    它被 CharSequence/StringBuffer/StringBuilder 中的 compareTo() 使用。因此,这三个类都实现了 Comparable。

    Character

    toString(int)

    of(String, String…)

    此前我们需要使用 Paths.get()。现在,我们像其他类一样使用 of()。

    Files

    writeString(Path, CharSequence)

    我们可以使用该方法来保存一个 String 字符串。

    readString(Path)

    我们可以使用该方法来读取一个 String 字符串。

    Reader

    nullReader()

    使用该方法,我们可以得到一个不执行任何操作的 Reader。

    Writer

    nullWriter()

    使用该方法,我们可以得到一个不执行任何操作的 Writer。

    InputStream

    nullInputStream()

    使用该方法,我们可以得到一个不执行任何操作的 InputStream。

    OutputStream

    nullOutputStream()

    使用该方法,我们可以得到一个不执行任何操作的 OutputStream。

    Predicate

    not(Predicate)

    此前在需要反转条件的地方,我们选择不使用方法引用。现在相反,我们可以使用方法引用。

    Collection

    toArray(IntFunction)

    此前,我们需要使用像 list.toArray(new String[list.size())]) 这样的无风格标记(non-stylish notation)来从一个集合创建一个类型化数组。现在,我们可以以风格标记(stylish notation)的方式进行编写。

    Optional/OptionalInt/OptionalLong/OptionalDouble

    isEmpty()

    isPresent() 方法此前已经存在,现在我们使用 isEmpty() 方法。

    TimeUnit

    convert(Duration)

    该方法已经添加到 java.util.concurrent.TimeUnit 中。

    Pattern

    asMatchPredicate()

    到目前为止,只有 asPredicate() 方法,但现在我们还拥有 asMatchPredicate() 方法。

    更多其他特性

    ListSelectionModel

    已添加 getSelectedIndices() / getSelectedCount() 方法

    Thread

    destroy()/stop(Throwable)

    移除 destroy() 方法,保留 stop() 方法。

    Policy

    已移除 javax.security.auth.Policy。

    ArrayIndexOutOfBoundsException

    抛出的异常信息已修改:

    IndexOutOfBoundsException

    在本次变更中,已在异常信息中移除 hyphens。

    System

    arraycopy

    setProperty(String, String)

    之前改变 java.home 会导致一些问题,现在问题已得到解决。
    支持 Japanese New Era
    Japanese Imperial Era 计划于 2019.5.1 改用新的规则。本次变更是作为 NewEra 占位符引入的。
    在日本政府宣布之后,它将在 JDK 12.0.1 中进行更新。
    JDK10.0.1
    JDK11 ea18
    目前我们还未能将 May 1st Heisei 31 作为我们的 JapaneseDate。

    Base64

    从 ea20 起,使用 AVX512 进行编码会变得更快,但在 Windows 上无法确定。

    Boolean

    parseBoolean

    官方表示,在删除冗余的空检查后,它的速度变得更快。

    TimSort

    TimSort 是用于 Array.sort() 和 Collection.sort() 的主要算法。
    但它有一个错误,主要发生在为某些序列抛出一个 ArrayIndexOutOfBoundsException 异常,不过似乎已修复,尚未确定。

    jdk10中带来了var隐式变量声明,如:

    var x = new Foo();
    for (var x : xs) { ... }
    try (var x = ...) { ... } catch ...
    

    jdk11中将允许在声明隐式类型的 lambda 表达式的形式参数时使用 var,如:

    (var x, var y) -> x.process(y)
      或者干脆省略掉var符号
    
    (x, y) -> x.process(y)
    

    324: Key Agreement with Curve25519 and Curve448(Curve25519 和 Curve448 算法的密钥协议)
    327: Unicode 10
    328: Flight Recorder(飞行记录器)

    "飞行记录器"旨在“提供一个低开销的数据收集框架,用于对Java应用程序和HotSpot JVM进行故障诊断”。

    Java Launcher

    329: ChaCha20 and Poly1305
    Cryptographic Algorithms(ChaCha20 和 Poly1305 加密算法)
    330: Launch Single-File Source-Code Programs(启动单一文件的源代码程序)

    主要是改进 Java Launcher 以支持一个命令执行单个 Java 源代码文件。换句话说,在条件满足的情况下,可以简单地直接编译并运行单文件程序,而不再需要调用 javac ,也不需要打包 jar 文件。

    比如说,可直接运行:

    java HelloWorld.java
    而不再需要:

    javac -d <memory> HelloWorld.java
    java -cp <memory> hello.World
    

    垃圾回收器

    331: Low-Overhead Heap Profiling(低开销的 Heap Profiling)
    332: Transport Layer Security (TLS) 1.3(支持 TLS 1.3)
    333: ZGC: A Scalable Low-Latency Garbage Collector(可伸缩低延迟垃圾收集器)

    上一代的垃圾回收器G1已经足够强大,但是,ZGC可能会更加惊艳,ZGC的一个目标是将垃圾回收的暂停时间压缩到10ms之内,这意味着Java可以成为应用到更广泛的领域。官方文档提供了ZGC与G1的benchmarks测试对比,我们看到对比G1的156.806ms平均时间,ZGC的垃圾收集时间低至1.091ms

    ZGC
    avg: 1.091ms (+/-0.215ms)
    95th percentile: 1.380ms
    99th percentile: 1.512ms
    99.9th percentile: 1.663ms
    99.99th percentile: 1.681ms
    max: 1.681ms

    G1
    avg: 156.806ms (+/-71.126ms)
    95th percentile: 316.672ms
    99th percentile: 428.095ms
    99.9th percentile: 543.846ms
    99.99th percentile: 543.846ms
    max: 543.846ms

    320: Remove the Java EE and CORBA Modules(删除 Java EE 和 CORBA 模块)
    335: Deprecate the Nashorn JavaScript Engine(弃用 Nashorn JavaScript 引擎)
    336: Deprecate the Pack200 Tools and API(弃用 Pack200 工具和 API)
    

    此外,还有一些除 JEP 之外的API变化,比较实用的有以下几个:

    String

    lines()

    字符串实例方法,使用专门的 Spliterator 来懒惰地提供源字符串中的行

    jshell> “test\nhoge\n”.lines().map(String::toUpperCase).toArray()
    $11 ==> Object[2] { “TEST”, “HOGE” }
    repeat(int)
      按照参数 int 提供的次数来重复字符串的运行次数

    jshell> "test".repeat(3) $7 ==> "testtesttest"
    

    isBlank()

    验证当前字符串是否为空,或者是否只包括空白字符(空白字符由 Character.isWhiteSpace(int) 验证)

    jshell> var halfSpace = "\u0020"
    halfSpace ==> " "
     
    jshell> halfSpace.isBlank()
    $11 ==> true
     
    jshell> var fullSpace = "\u3000"
    fullSpace ==> " "
     
    jshell> fullSpace.isBlank()
    $13 ==> true
    

    strip()/stripLeading()/stripTrailing()

    这三个方法的作用分别是去掉字符串头和尾的空白符、字符串头的空白符、字符串尾的空白符,基本与 trim()/trimLeft()/trimRight() 方法相同,不过它们的空白字符由 Character.isWhiteSpace(int) 验证

    jshell> var aaa = fullSpace + "aaa" + fullSpace
    aaa ==> " aaa "
    
    jshell> aaa.strip()
    $14 ==> "aaa"
    
    jshell> aaa.trim()
    $15 ==> " aaa "
    

    Character

    toString(int)

    JDK 11 使这个过程变得更加方便

    jdk10:

    jshell> Character.toString(65)
    |  Error:
    |  incompatible types: possible lossy conversion from int to char
    |  Character.toString(65)
    |
    

    jdk11:

    jshell> Character.toString(65)
    $9 ==> "A"
    

    Path

    of(String, String…)

    此前我们需要使用 Paths.get()。现在,我们像其他类一样使用 of()。

    Files

    writeString(Path, CharSequence)

    我们可以使用该方法来保存一个 String 字符串。

    shell> Files.writeString(Path.of("test.txt"), "Hello!!!")
    $3 ==> test.txt
    

    readString(Path)

    我们可以使用该方法来读取一个 String 字符串。

    jshell> Files.readString(Path.of("test.txt"))
    $4 ==> "Hello!!!"
    

    Collection

    toArray(IntFunction)

    此前,我们需要使用像 list.toArray(new String[list.size())]) 这样的无风格标记(non-stylish notation)来从一个集合创建一个类型化数组。现在,我们可以以风格标记(stylish notation)的方式进行编写。

    在这里插入代码片shell> List.of(“aa”,“bb”).toArray(String[]::new) $1 ==> String[2] { “aa”, “bb” }

    Thread

    destroy()/stop(Throwable)

    移除 destroy() 方法,保留 stop() 方法。

    Java 9以来,oracle实行了半年一次版本的新计划,很多同学说 9未掌握10刚了解11已进冻结期,

    展开全文
  • windows同时安装jdk8和jdk11

    千次阅读 2021-11-15 18:54:13
    本来电脑上装的是jdk11,但是这学期做数据库实验用jdbc连接openGuass时需要用到jdk8,装了jdk8后电脑上的ecipse又报错 于是想到在电脑上同时安装jdk8和jdk11,在此记录一下安装过程。 安装jdk jdk8和jdk11的安装包...
  • 关于JDK8和JDK11切换问题

    千次阅读 2021-03-07 19:21:59
    在已经配置好JDK8后(如果从未安装任何jdk,还是需要配置环境变量的JAVA_HOME),如果需要使用JDK11,可以在Oracle官网注册登录后下载JDK11对应的安装包(.exe),安装完成后,JDK11会自动替换JDK8,不需要重新配置...
  • JDK8升级JDK11过程记录

    千次阅读 2020-12-16 20:10:39
    最新版本Java15都出来了,很多小伙伴还在使用Java8,当然JDK15不是长期支持版本,最新的长期支持版本是Java11,而下一个长期支持版本要等到2021年9月发布的Java17。最近把内部几个系统从Java8升级到了Java11,升级...
  • Linux 安装jdk11

    千次阅读 2021-02-27 21:47:53
    JDK11安装 下载: wget https://download.java.net/java/GA/jdk11/13/GPL/openjdk-11.0.1_linux-x64_bin.tar.gz ## 解压安装包: 解压安装包 mkdir /usr/local/jdk tar -zxf openjdk-11.0.1_linux-x64_bin.tar.gz -...
  • 安装JDK11并配置环境变量(附百度网盘下载地址)

    千次阅读 多人点赞 2021-07-01 14:29:29
    一、首先咱们先获取JDK11的安装包 1.可以直接去oracle官网获取JDK:https://www.oracle.com/technetwork/java/javase/downloads/index.html 因为现在从oracle下载安装包需要注册oracle账号,并且下载速度受到限制...
  • win10同时安装jdk8和jdk11

    千次阅读 多人点赞 2021-03-29 20:41:45
    我原先是安装的jdk8,为了配合学习新特性,于是又安装了jdk11,但是以前的项目还是得用jdk8来跑,所以就又装了一个jdk11来回切换(不过最后发现idea可以很方便的自动切换) 过程 先下载jdk11,记下安装路径 配置...
  • JDK11win版安装包(正版免费)

    万次阅读 2021-08-25 10:14:41
    链接:https://pan.baidu.com/s/1S10D5sA8WkYcyOjnE1M5IA 提取码:pl26
  • JDK11下载安装、JRE生成、环境配置

    千次阅读 热门讨论 2021-05-04 22:32:00
    JDK11官网下载: Java SE - Downloads | Oracle Technology Network | Oracle 选择自己合适的版本。 安装 生成JRE 1、安装目录 找到jdk的安装目录 2、jdk11安装目录里面我们可以看到是没有jre的,但是我们在之后...
  • JDK11无法启动VisualVM

    千次阅读 2019-09-25 22:36:17
    最近新项目从JDK8升级到JDK11,在使用IDEA启动项目同时启动VisualVM时,发现启动并不成功。 然后笔者在JDK的目录里查找,发现bin目录下并没有jvisualvm的可执行文件。 谷歌查找一番之后,原来从jdk 9开始, visualVM...
  • JDK8和JDK11同时安装在一台电脑上

    千次阅读 2021-07-14 10:23:47
    在学校安装的JDK11,一直用的就是11。多数人建议使用JDK8,暑假来公司实习了都是用8。所以就摸索着同时安装了两个JDK。不知道为什么,安装完JDK8以后没配置环境变量,但是命令窗口使用java -version查询的时候显示的...
  • jdk8升级jdk11出现的问题汇总

    千次阅读 2021-11-13 21:11:01
    问题1:java.lang.NoClassDefFoundError: org/springframework/core/NativeDetector <dependency> <groupId>org.springframework</groupId> <artifactId>.../dependency
  • 首先区官网下载JDK8和JDK11安装包,安装后打开bash 官网下载 https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html cd /Library/Java/JavaVirtualMachines ls -al 上图可知有...
  • JDK11 下载与安装

    千次阅读 2021-02-10 18:03:19
    JDK 概述 JDK 全称 Java Development ToolKit,是 Java 语言开发工具包。JDK 是整个 JAVA 的核心,包括了 Java 运行环 境(Java Runtime Environment),一堆 Java工具(javac/java/jdb 等)...JDK11 下载 目前 JDK 13
  • CentOS 7 安装 jdk11

    万次阅读 多人点赞 2019-10-29 18:17:21
    jdk11下载地址: https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html 下载: jdk-11.0.5_linux-x64_bin.tar.gz 需要登录后才能下载。 我当前是Window环境,下载后要把文件...
  • macOS下安装JDK11和配置环境变量

    千次阅读 2022-04-04 19:58:52
    dmg会把JDK一键安装到 /Library/Java/JavaVirtualMachines下。 安装后 /Library/Java/JavaVirtualMachines目录下文件夹如图: 2. 安装 过程不做过多讲解。 3. 打开配置文件: open ~/.bash_profile 在最后一行...
  • win10 jdk1.8/jdk11安装及卸载

    千次阅读 2020-07-31 20:38:24
    jdk卸载 控制面板 — 卸载程序,注意下图的两个java程序都要卸载
  • 前言 在实际的工作环境中,因为资源有限,一个人...项目使用的JDK是基于1.8的版本或更低版本,系统上线后,该条生产线就不需要这么多人了,人员就需要调整到其它生产线上,而这条生产线上使用的是基于JDK11进行开...
  • JDK11最新版本。最新Java11。
  • JDK11下载与安装 win10 64位

    千次阅读 2020-12-27 22:55:50
    JDK11下载 Java11 为**LTS(长期支持)**版本。 jdk11百度网盘 链接:https://pan.baidu.com/s/13HcQjpe3XU-RNj0gaVQjpA 提取码:ga6s 如下图选择第一个即可。
  • JDK11安装教程(WIN10)

    千次阅读 2021-04-06 21:09:16
    文章目录 前言 一、Java是什么? 二、搭建Java环境 1.... 用管理员身份运行命令提示符,进入jdk11/bin的安装路径,再输入“java-version”,就会出现jdk11的版本信息了。 总结 提示:这里对文章进行总结: `
  • Docker手动构建OracleJDK11镜像

    千次阅读 2021-04-30 00:59:21
    docker官方的jdk镜像多为8(如下图),目前jdk的长期支持版有8、11、14,目前使用最多的还是8,我自己做项目一般喜欢用11,如果开发中使用的是jdk11,Dockerfile中就不能写FROM java:8了,就需要我们自己制作镜像了...
  • JDK11简单安装教程

    千次阅读 2020-09-05 08:51:01
    JDK11 官网下载地址 根据每个电脑的操作系统不同而选择不同的版本,.exe是安装版本的,.zip是解压版本,根据个人喜好自己选择下载,还有要点击版本上面的同意按钮才能下载。 安装 等待安装完成 1.桌面“此电脑...
  • Win10安装jdk11及环境变量配置

    万次阅读 多人点赞 2018-10-21 16:14:50
    Win10安装jdk11及环境变量配置写在前面卸载旧版本jdk下载jdk11配置环境变量经验教训 写在前面 我第一次安装java是在17年初,距离现在已经一年半了。今天上oracle官网一看,jdk都已经更新到11.0.1了,然而我用的还是...
  • jdk11+Tomcat9配置

    千次阅读 2019-05-08 13:52:46
    最近折腾了一下,尝试jdk11和Tomcat9,由于jdk11里没有jre以及版本更新等原因,出现了很多问题,那就一个一个解决吧。 会报这个错误(此图是别人的): Error:Could not create the Java Virtual Machine. Error:A ...
  • jdk11 及jdk8阿里云快速下载链接

    千次阅读 2020-05-23 18:39:20
    1 jdk11 及jdk8阿里云快速下载链接 #### 1-jdk11 linux版本 jdk-11.0.7_linux-x64_bin.tar.gz ... #### 2-jdk11 mac jdk-11.0.7_osx-x64_bin.tar.gz ...
  • jdk11压缩包下载

    千次阅读 多人点赞 2020-09-01 14:04:01
    oracle官方下载jdk11.0.8放心使用 百度网盘地址: 链接:https://pan.baidu.com/s/1Kb_MHTHcebYTpH5C-Z-2TA 提取码:sjs3

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,723,930
精华内容 689,572
关键字:

jdk11

友情链接: 8.rar