測試開發(fā)同學(xué)必須了解的Java11中的重要變化
目前市場上主流的穩(wěn)定版是Java 8和Java 11(java17也推出了穩(wěn)定版,但使用者寥寥),目前大部分公司的生產(chǎn)環(huán)境還是Java 8居多。因為正在建設(shè)中的系統(tǒng),擅自更換語言SDK版本更是大忌。因為更換語言SDK就意味著SDK API面臨著變更風(fēng)險,極有可能導(dǎo)致很多未知的運行時錯誤和編譯器錯誤。一個大型的軟件系統(tǒng),其實不僅僅光包含了語言SDK,還可能包含了諸多框架和中間件,例如Spring Cloud全家桶、Kafka、Spark等等,升級SDK意味著你要面對大量SDK升級帶來的可能對中間組件的非向下兼容特性,一旦遇到,那對整個軟件系統(tǒng)那就是滅頂之災(zāi)。而對于測試開發(fā)工程師而言,升級到j(luò)dk11的風(fēng)險要小很多,因為我們的代碼量以及依賴的框架和中間件相對還是較開發(fā)人員小很多的!我個人建議測試開發(fā)人員可以選擇使用jdk11,在這里總結(jié)一下使用jdk11的一些重要變化!
總體感受:jdk11的語法越來越像python啦!
變量類型推斷
引入關(guān)鍵字var,用var來定義的變量不用寫具體類型,編譯器能根據(jù)=右邊的實際賦值來自動推斷出變量的類型:
- var str="hello jdk 11";
- System.out.println(str);
輸出
- hello jdk 11
是不是有了錯覺,我是誰?我在哪?我在使用python嗎?
Files類文件讀寫增強
可以通過Files類的靜態(tài)方法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();
- }
官方提供HTTPClient
現(xiàn)在JDK官方就自帶HTTP Client了,位于java.net.http包下,很顯然就是對標apache的httpclient,我們直接使用jdk11中自帶的httpclient就可以做接口測試相關(guān)的工作了!核心示例代碼如下:
- 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() ); // 打印獲取到的網(wǎng)頁內(nèi)容
支持java源文件直接運行
通過在cmd中,執(zhí)行命令java **.java,直接運行**.java文件
是不是又有了錯覺,我是誰?我在哪?我在使用python嗎?
Jshell交互式工具的使用
從java9開始,java開始引入了類似于python的交互式工具
在jdk bin目錄下提供了工具Jshell,使用方法如下圖

是不是再次有了錯覺,我是誰?我在哪?我在使用python嗎?
接下來這兩個功能對于性能測試工程師來說,絕對有必要了解一下:
垃圾回收機制性能的提升
ZGC, 這應(yīng)該是JDK11最為矚目的特性, 沒有之一。但是后面帶了Experimental, 說明這還不建議用到生產(chǎn)環(huán)境。ZGC的設(shè)計目標是:支持TB級內(nèi)存容量,暫停時間低(<10ms),對整個程序吞吐量的影響小于15%。
完全支持Linux容器(包括Docker)
許多運行在Java虛擬機中的應(yīng)用程序都可以在Docker容器中運行。但是在Docker容器中運行Java應(yīng)用程序一直存在一個問題,那就是在容器中運行JVM程序在設(shè)置內(nèi)存大小和CPU使用率后,會導(dǎo)致應(yīng)用程序的性能下降。這是因為Java應(yīng)用程序沒有意識到它正在容器中運行。隨著Java 10的發(fā)布,這個問題總算得以解決,JVM現(xiàn)在可以識別由容器控制組(cgroups)設(shè)置的約束??梢栽谌萜髦惺褂脙?nèi)存和CPU約束來直接管理Java應(yīng)用程序,其中包括:
- 遵守容器中設(shè)置的內(nèi)存限制
- 在容器中設(shè)置可用的CPU
- 在容器中設(shè)置CPU約束
升級到j(luò)dk11的問題-軟件不兼容
最大的問題就是jdk11跟其他軟件的不兼容,例如jmeter4.0在jdk11環(huán)境中就會運行失敗。因此建議在電腦上同時安裝jdk1.8和jdk11!