前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java13的新特性

Java13的新特性

作者头像
code4it
发布2019-09-19 16:46:58
8250
发布2019-09-19 16:46:58
举报

Java语言特性系列

  • Java5的新特性
  • Java6的新特性
  • Java7的新特性
  • Java8的新特性
  • Java9的新特性
  • Java10的新特性
  • Java11的新特性
  • Java12的新特性
  • Java13的新特性
  • Java14的新特性

本文主要讲述一下Java13的新特性

版本号

java -version
openjdk version "13" 2019-09-17
OpenJDK Runtime Environment (build 13+33)
OpenJDK 64-Bit Server VM (build 13+33, mixed mode, sharing)

从version信息可以看出是build 13+33

特性列表

350: Dynamic CDS Archives

JDK5引入了Class-Data Sharing可以用于多个JVM共享class,提升启动速度,最早只支持system classes及serial GCJDK9对其进行扩展以支持application classes及其他GC算法java10的新特性JEP 310: Application Class-Data Sharing扩展了JDK5引入的Class-Data Sharing,支持application的Class-Data Sharing并开源出来(以前是commercial feature)JDK11将-Xshare:off改为默认-Xshare:auto,以更加方便使用CDS特性JDK12的341: Default CDS Archives即在64-bit平台上编译jdk的时候就默认在${JAVA_HOME}/lib/server目录下生成一份名为classes.jsa的默认archive文件(大概有18M)方便大家使用JDK13的这个特性支持在Java application执行之后进行动态archive

  • 导出jsa
java -XX:ArchiveClassesAtExit=hello.jsa -cp hello.jar Hello
  • 使用jsa
java -XX:SharedArchiveFile=hello.jsa -cp hello.jar Hello

351: ZGC: Uncommit Unused Memory

Java12的346: Promptly Return Unused Committed Memory from G1新增了两个参数分别是G1PeriodicGCInterval及G1PeriodicGCSystemLoadThreshold用于GC之后重新调整Java heap size,然后将多余的内存归还给操作系统Java12的189: Shenandoah: A Low-Pause-Time Garbage Collector (Experimental)拥有参数-XX:ShenandoahUncommitDelay=<milliseconds>来指定ZPage的page cache的失效时间,然后归还内存Java13则给ZGC新增归还unused heap memory给操作系统的特性;它新增了几个参数,-XX:ZUncommitDelay=<seconds>用于指定ZPage的page cache的失效时间;ZGC的归还内存默认是开启的,可以使用-XX:-ZUncommit来显式禁用

353: Reimplement the Legacy Socket API

本特性替换了java.net.Socket以及java.net.ServerSocket API的底层实现;它使用NioSocketImpl来替换JDK1.0的PlainSocketImpl;如果要继续使用旧版的Socket实现,可以使用-Djdk.net.usePlainSocketImpl参数来切换到旧版本

/Library/Java/JavaVirtualMachines/jdk-13.jdk/Contents/Home/lib/src.zip!/java.base/java/net/SocketImpl.java

public abstract class SocketImpl implements SocketOptions {
    private static final boolean USE_PLAINSOCKETIMPL = usePlainSocketImpl();

    private static boolean usePlainSocketImpl() {
        PrivilegedAction<String> pa = () -> NetProperties.get("jdk.net.usePlainSocketImpl");
        String s = AccessController.doPrivileged(pa);
        return (s != null) && !s.equalsIgnoreCase("false");
    }

    /**
     * Creates an instance of platform's SocketImpl
     */
    @SuppressWarnings("unchecked")
    static <S extends SocketImpl & PlatformSocketImpl> S createPlatformSocketImpl(boolean server) {
        if (USE_PLAINSOCKETIMPL) {
            return (S) new PlainSocketImpl(server);
        } else {
            return (S) new NioSocketImpl(server);
        }
    }

    //......
}

SocketImpl的USE_PLAINSOCKETIMPL取决于usePlainSocketImpl方法,而它会从NetProperties读取dk.net.usePlainSocketImpl配置,如果不为null且不为false,则usePlainSocketImpl方法返回true;createPlatformSocketImpl会根据USE_PLAINSOCKETIMPL来创建PlainSocketImpl或者NioSocketImpl

354: Switch Expressions (Preview)

本特性主要是使用yield替换了break来避免歧义,因为break可以用来进行跳转执行类似goto的操作

    @Test
    public void testSwitchYield(){
        String dayOfWeek = switch(1){
            case 1 -> {
                String day = "Monday";
                yield day;
            }
            case 2 -> {
                String day = "Tuesday";
                yield day;
            }
            default -> "Unknown";
        };
        System.out.println(dayOfWeek);
    }

355: Text Blocks (Preview)

本特性主要引入了Text Blocks,使用"""来包围一段text block,可以内置占位符最后使用String.format来填充

    @Test
    public void testTextBlock(){
        // Without Text Blocks
        String html = "<html>\n" +
                "   <body>\n" +
                "      <p>Hello, Escapes</p>\n" +
                "   </body>\n" +
                "</html>\n";
        System.out.println(html);

        // With Text Blocks
        String html2 = """
            <html>
                <body>
                <p>Hello, %s</p>
                </body>
            </html>""";

        System.out.println(String.format(html2, "World"));

        String htmlWithNewLine = """
            <html>
                <body>
                <p>Hello World</p>
                </body>
            </html>
            """;
        System.out.print(htmlWithNewLine);
        System.out.println("a new line");
    }

需要注意text blocks不能在一行,另外如果结尾的"""在新的一行则会输出新的一行

细项解读

上面列出的是大方面的特性,除此之外还有一些api的更新及废弃,主要见JDK 13 Release Notes,这里举几个例子。

添加项

  • 添加FileSystems.newFileSystem(Path, Map<String, ?>) Method
  • 新的java.nio.ByteBuffer Bulk get/put Methods Transfer Bytes Without Regard to Buffer Position
  • 支持Unicode 12.1
  • 添加-XX:SoftMaxHeapSize Flag,目前仅仅对ZGC起作用
  • ZGC的最大heap大小增大到16TB

移除项

  • 移除awt.toolkit System Property
  • 移除Runtime Trace Methods
  • 移除-XX:+AggressiveOpts
  • 移除Two Comodo Root CA Certificates、Two DocuSign Root CA Certificates
  • 移除内部的com.sun.net.ssl包

废弃项

  • 废弃-Xverify:none及-noverify
  • 废弃rmic Tool并准备移除
  • 废弃javax.security.cert并准备移除

已知问题

  • 不再支持Windows 2019 Core Server
  • 使用ZIP File System (zipfs) Provider来更新包含Uncompressed Entries的ZIP或JAR可能造成文件损坏

其他事项

  • GraphicsEnvironment.getCenterPoint()及getMaximumWindowBounds()已跨平台统一
  • 增强了JAR Manifest的Class-Path属性处理

jdk.net.URLClassPath.showIgnoredClassPathEntries属性设置为true可以用来帮助查看非法的Class-Path entries

  • 针对Negatively Sized Argument,StringBuffer(CharSequence)及StringBuilder(CharSequence)会抛出NegativeArraySizeException
  • linux的默认进程启动机制已经使用posix_spawn
  • Lookup.unreflectSetter(Field)针对static final fields会抛出IllegalAccessException
  • 使用了java.net.Socket.setSocketImplFactory及java.net.ServerSocket.setSocketFactory方法的要注意,要求客户端及服务端要一致,不能一端使用自定义的factory一端使用默认的factory
  • SocketImpl的supportedOptions, getOption及setOption方法的默认实现发生了变化,默认的supportedOptions返回空,而默认的getOption,及setOption方法抛出UnsupportedOperationException
  • JNI NewDirectByteBuffer创建的Direct Buffer为java.nio.ByteOrder.BIG_ENDIAN
  • Base64.Encoder及Base64.Decoder可能抛出OutOfMemoryError
  • 改进了Serial GC Young pause time report
  • 改进了MaxRAM及UseCompressedOops参数的行为

小结

  • Java13主要新增了如下特性
    • 350: Dynamic CDS Archives
    • 351: ZGC: Uncommit Unused Memory
    • 353: Reimplement the Legacy Socket API
    • 354: Switch Expressions (Preview)
    • 355: Text Blocks (Preview)
  • 语法层面,改进了Switch Expressions,新增了Text Blocks,二者皆处于Preview状态;API层面主要使用NioSocketImpl来替换JDK1.0的PlainSocketImpl
  • GC层面则改进了ZGC,以支持Uncommit Unused Memory

doc

  • JDK 13 Features
  • JDK 13 Release Notes
  • Oracle JDK 13 Release Notes
  • Java SE deprecated-list
  • The arrival of Java 13!
  • Improve Launch Times On Java 13 With Application Class-Data Sharing
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 版本号
  • 特性列表
    • 350: Dynamic CDS Archives
      • 351: ZGC: Uncommit Unused Memory
        • 353: Reimplement the Legacy Socket API
          • 354: Switch Expressions (Preview)
            • 355: Text Blocks (Preview)
            • 细项解读
              • 添加项
                • 移除项
                  • 废弃项
                    • 已知问题
                      • 其他事项
                      • 小结
                      • doc
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档