深圳幻海软件技术有限公司 欢迎您!

测试开发同学必须了解的Java11中的重要变化

2023-02-28

目前市场上主流的稳定版是Java8和Java11(java17也推出了稳定版,但使用者寥寥),目前大部分公司的生产环境还是Java8居多。因为正在建设中的系统,擅自更换语言SDK版本更是大忌。因为更换语言SDK就意味着SDKAPI面临着变更风险,极有可能导致很多未知的运行时错误和编译器错误。一个大型

目前市场上主流的稳定版是Java 8和Java 11(java17也推出了稳定版,但使用者寥寥),目前大部分公司的生产环境还是Java 8居多。因为正在建设中的系统,擅自更换语言SDK版本更是大忌。因为更换语言SDK就意味着SDK API面临着变更风险,极有可能导致很多未知的运行时错误和编译器错误。一个大型的软件系统,其实不仅仅光包含了语言SDK,还可能包含了诸多框架和中间件,例如Spring Cloud全家桶、Kafka、Spark等等,升级SDK意味着你要面对大量SDK升级带来的可能对中间组件的非向下兼容特性,一旦遇到,那对整个软件系统那就是灭顶之灾。而对于测试开发工程师而言,升级到jdk11的风险要小很多,因为我们的代码量以及依赖的框架和中间件相对还是较开发人员小很多的!我个人建议测试开发人员可以选择使用jdk11,在这里总结一下使用jdk11的一些重要变化!

总体感受:jdk11的语法越来越像python啦!

变量类型推断

引入关键字var,用var来定义的变量不用写具体类型,编译器能根据=右边的实际赋值来自动推断出变量的类型:

var str="hello jdk 11"
 
System.out.println(str); 
  • 1.
  • 2.
  • 3.

 输出

hello jdk 11 
  • 1.

是不是有了错觉,我是谁?我在哪?我在使用python吗?

Files类文件读写增强

可以通过Files类的静态方法writeString()和readString()完成文件读写操作,核心示例代码如下:

Path path = Paths.get("D: /test.txt"); 
String content = null
try { 
    content = Files.readString(path, StandardCharsets.UTF_8); 
} catch (IOException e) { 
    e.printStackTrace(); 

System.out.println(content); 
try { 
    Files.writeString( path, "老李", StandardCharsets.UTF_8 ); 
} catch (IOException e) { 
    e.printStackTrace(); 
 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

官方提供HTTPClient

现在JDK官方就自带HTTP Client了,位于java.net.http包下,很显然就是对标apache的httpclient,我们直接使用jdk11中自带的httpclient就可以做接口测试相关的工作了!核心示例代码如下:

var request = HttpRequest.newBuilder() 
        .uri( URI.create("https://www.baidu.com") ) 
        .GET() 
        .build(); 
 
HttpResponse<String> httpResponse = null
try { 
    httpResponse = HttpClient.newHttpClient() 
            .send( request, HttpResponse.BodyHandlers.ofString()); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (InterruptedException e) { 
    e.printStackTrace(); 

System.out.println( httpResponse.body() ); // 打印获取到的网页内容 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.

支持java源文件直接运行

通过在cmd中,执行命令java **.java,直接运行**.java文件

是不是又有了错觉,我是谁?我在哪?我在使用python吗?

Jshell交互式工具的使用

从java9开始,java开始引入了类似于python的交互式工具

在jdk bin目录下提供了工具Jshell,使用方法如下图


是不是再次有了错觉,我是谁?我在哪?我在使用python吗?

接下来这两个功能对于性能测试工程师来说,绝对有必要了解一下:

垃圾回收机制性能的提升

ZGC, 这应该是JDK11最为瞩目的特性, 没有之一。但是后面带了Experimental, 说明这还不建议用到生产环境。ZGC的设计目标是:支持TB级内存容量,暂停时间低(<10ms),对整个程序吞吐量的影响小于15%。

完全支持Linux容器(包括Docker)

许多运行在Java虚拟机中的应用程序都可以在Docker容器中运行。但是在Docker容器中运行Java应用程序一直存在一个问题,那就是在容器中运行JVM程序在设置内存大小和CPU使用率后,会导致应用程序的性能下降。这是因为Java应用程序没有意识到它正在容器中运行。随着Java 10的发布,这个问题总算得以解决,JVM现在可以识别由容器控制组(cgroups)设置的约束。可以在容器中使用内存和CPU约束来直接管理Java应用程序,其中包括:

  • 遵守容器中设置的内存限制
  • 在容器中设置可用的CPU
  • 在容器中设置CPU约束

升级到jdk11的问题-软件不兼容

最大的问题就是jdk11跟其他软件的不兼容,例如jmeter4.0在jdk11环境中就会运行失败。因此建议在电脑上同时安装jdk1.8和jdk11!