?
目前市場(chǎng)上主流的穩(wěn)定版是Java 8和Java 11(java17也推出了穩(wěn)定版椰于,但使用者寥寥)贩汉,目前大部分公司的生產(chǎn)環(huán)境還是Java 8居多菩佑。因?yàn)檎诮ㄔO(shè)中的系統(tǒng)蓖捶,擅自更換語(yǔ)言SDK版本更是大忌。因?yàn)楦鼡Q語(yǔ)言SDK就意味著SDK API面臨著變更風(fēng)險(xiǎn)沛膳,極有可能導(dǎo)致很多未知的運(yùn)行時(shí)錯(cuò)誤和編譯器錯(cuò)誤扔枫。一個(gè)大型的軟件系統(tǒng),其實(shí)不僅僅光包含了語(yǔ)言SDK于置,還可能包含了諸多框架和中間件茧吊,例如Spring Cloud全家桶贞岭、Kafka八毯、Spark等等,升級(jí)SDK意味著你要面對(duì)大量SDK升級(jí)帶來(lái)的可能對(duì)中間組件的非向下兼容特性瞄桨,一旦遇到话速,那對(duì)整個(gè)軟件系統(tǒng)那就是滅頂之災(zāi)。而對(duì)于測(cè)試開(kāi)發(fā)工程師而言芯侥,升級(jí)到j(luò)dk11的風(fēng)險(xiǎn)要小很多泊交,因?yàn)槲覀兊拇a量以及依賴的框架和中間件相對(duì)還是較開(kāi)發(fā)人員小很多的!我個(gè)人建議測(cè)開(kāi)人員可以選擇使用jdk11柱查,在這里總結(jié)一下使用jdk11的一些重要變化廓俭!
總體感受:jdk11的語(yǔ)法越來(lái)越像python啦!
變量類型推斷
引入關(guān)鍵字var唉工,用var來(lái)定義的變量不用寫具體類型研乒,編譯器能根據(jù)=右邊的實(shí)際賦值來(lái)自動(dòng)推斷出變量的類型:
var str="hello jdk 11";
System.out.println(str);
輸出
hello jdk 11
是不是有了錯(cuò)覺(jué),我是誰(shuí)淋硝?我在哪雹熬?我在使用python嗎?
Files類文件讀寫增強(qiáng)
可以通過(guò)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包下,很顯然就是對(duì)標(biāo)apache的httpclient继谚,我們直接使用jdk11中自帶的httpclient就可以做接口測(cè)試相關(guān)的工作了烈菌!核心示例代碼如下:
var request= HttpRequest.newBuilder() .uri( URI.create("https://www.baidu.com") ).GET().build();
HttpResponse httpResponse =null;
try {
??? httpResponse = HttpClient.newHttpClient() .send( request,HttpResponse.BodyHandlers.ofString());
}
catch (IOExceptione) {
??? e.printStackTrace();
}
catch (InterruptedExceptione) {
??? e.printStackTrace();
}
System.out.println(httpResponse.body() ); // 打印獲取到的網(wǎng)頁(yè)內(nèi)容
支持java源文件直接運(yùn)行
通過(guò)在cmd中,執(zhí)行命令java **.java,直接運(yùn)行**.java文件
是不是又有了錯(cuò)覺(jué)芽世,我是誰(shuí)侨嘀?我在哪?我在使用python嗎捂襟?
Jshell交互式工具的使用
從java9開(kāi)始咬腕,java開(kāi)始引入了類似于python的交互式工具
在jdk bin目錄下提供了工具Jshell,使用方法如下圖
是不是再次有了錯(cuò)覺(jué)葬荷,我是誰(shuí)涨共?我在哪?我在使用python嗎宠漩?
接下來(lái)這兩個(gè)功能對(duì)于性能測(cè)試工程師來(lái)說(shuō)举反,絕對(duì)有必要了解一下:
垃圾回收機(jī)制性能的提升
ZGC, 這應(yīng)該是JDK11最為矚目的特性, 沒(méi)有之一。但是后面帶了Experimental,說(shuō)明這還不建議用到生產(chǎn)環(huán)境扒吁。ZGC的設(shè)計(jì)目標(biāo)是:支持TB級(jí)內(nèi)存容量火鼻,暫停時(shí)間低(<10ms),對(duì)整個(gè)程序吞吐量的影響小于15%雕崩。
完全支持Linux容器(包括Docker)
許多運(yùn)行在Java虛擬機(jī)中的應(yīng)用程序都可以在Docker容器中運(yùn)行魁索。但是在Docker容器中運(yùn)行Java應(yīng)用程序一直存在一個(gè)問(wèn)題,那就是在容器中運(yùn)行JVM程序在設(shè)置內(nèi)存大小和CPU使用率后盼铁,會(huì)導(dǎo)致應(yīng)用程序的性能下降粗蔚。這是因?yàn)镴ava應(yīng)用程序沒(méi)有意識(shí)到它正在容器中運(yùn)行。隨著Java 10的發(fā)布饶火,這個(gè)問(wèn)題總算得以解決鹏控,JVM現(xiàn)在可以識(shí)別由容器控制組(cgroups)設(shè)置的約束》羟蓿可以在容器中使用內(nèi)存和CPU約束來(lái)直接管理Java應(yīng)用程序当辐,其中包括:
遵守容器中設(shè)置的內(nèi)存限制
在容器中設(shè)置可用的CPU
在容器中設(shè)置CPU約束
?升級(jí)到j(luò)dk11的問(wèn)題-軟件不兼容
最大的問(wèn)題就是jdk11跟其他軟件的不兼容,例如jmeter4.0在jdk11環(huán)境中就會(huì)運(yùn)行失敗鲤看。因此建議在電腦上同時(shí)安裝jdk1.8和jdk11缘揪!
?