Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性 序 本文主要讲述一下Java12的新特性 版本号 javaversion openjdkversion1220190319 OpenJDKRuntimeEnvironment(build1233) OpenJDK64BitServerVM(build1233,mixedmode) 从version信息可以看出是build1233 特性列表189:Shenandoah:ALowPauseTimeGarbageCollector(Experimental) ShenandoahGC是一个面向lowpausetime的垃圾收集器,它最初由RedHat实现,支持aarch64及amd64architecture;ZGC也是面向lowpausetime的垃圾收集器,不过ZGC是基于coloredpointers来实现,而ShenandoahGC是基于brookspointers来实现;如果要使用ShenandoahGC需要编译时withjvmfeatures选项带有shenandoahgc,然后启动时使用XX:UnlockExperimentalVMOptionsXX:UseShenandoahGC230:MicrobenchmarkSuite在jdk源码里头新增了一套基础的microbenchmarkssuite325:SwitchExpressions(Preview)对switch进行了增强,除了使用statement还可以使用expression,比如原来的写法如下: switch(day){ caseMONDAY: caseFRIDAY: caseSUNDAY: System。out。println(6); break; caseTUESDAY: System。out。println(7); break; caseTHURSDAY: caseSATURDAY: System。out。println(8); break; caseWEDNESDAY: System。out。println(9); break; } 现在可以改为如下写法: switch(day){ caseMONDAY,FRIDAY,SUNDAYgt;System。out。println(6); caseTUESDAYgt;System。out。println(7); caseTHURSDAY,SATURDAYgt;System。out。println(8); caseWEDNESDAYgt;System。out。println(9); } 以及在表达式返回值 intnumLettersswitch(day){ caseMONDAY,FRIDAY,SUNDAYgt;6; caseTUESDAYgt;7; caseTHURSDAY,SATURDAYgt;8; caseWEDNESDAYgt;9; }; 对于需要返回值的switchexpression要么正常返回值要么抛出异常,以下这两种写法都是错误的 intiswitch(day){ caseMONDAYgt;{ System。out。println(Monday); ERROR!Blockdoesntcontainabreakwithvalue } defaultgt;1; }; iswitch(day){ caseMONDAY,TUESDAY,WEDNESDAY: break0; default: System。out。println(Secondhalfoftheweek); ERROR!Groupdoesntcontainabreakwithvalue }; 334:JVMConstantsAPI 新增了JVMConstantsAPI,具体来说就是java。base模块新增了java。lang。constant包,引入了ConstantDesc接口(ClassDesc、MethodTypeDesc、MethodHandleDesc这几个接口直接继承了ConstantDesc接口)以及Constable接口;ConstantDesc接口定义了resolveConstantDesc方法,Constable接口定义了describeConstable方法;String、Integer、Long、Float、Double均实现了这两个接口,而EnumDesc实现了ConstantDesc接口340:OneAArch64Port,NotTwo64bitArmplatform(arm64),也可以称之为aarch64;之前JDK有两个关于aarch64的实现,分别是srchotspotcpuarm以及opensrchotspotcpuaarch64,它们的实现重复了,为了集中精力更好地实现aarch64,该特性在源码中删除了opensrchotspotcpuarm中关于64bit的实现,保留其中32bit的实现,于是opensrchotspotcpuaarch64部分就成了64bitARMarchitecture的默认实现341:DefaultCDSArchivesjava10的新特性JEP310:ApplicationClassDataSharing扩展了JDK5引入的ClassDataSharing,支持application的ClassDataSharing;ClassDataSharing可以用于多个JVM共享class,提升启动速度,最早只支持systemclasses及serialGC,JDK9对其进行扩展以支持applicationclasses及其他GC算法,并在JDK10中开源出来(以前是commercialfeature);JDK11将Xshare:off改为默认Xshare:auto,以更加方便使用CDS特性;JDK12的这个特性即在64bit平台上编译jdk的时候就默认在{JAVAHOME}libserver目录下生成一份名为classes。jsa的默认archive文件(大概有18M)方便大家使用344:AbortableMixedCollectionsforG1G1在garbagecollection的时候,一旦确定了collectionset(CSet)开始垃圾收集这个过程是withoutstopping的,当collectionset过大的时候,此时的STW时间会过长超出目标pausetime,这种情况在mixedcollections时候比较明显。这个特性启动了一个机制,当选择了一个比较大的collectionset,允许将其分为mandatory及optional两部分(当完成mandatory的部分,如果还有剩余时间则会去处理optional部分)来将mixedcollections从withoutstopping变为abortable,以更好满足指定pausetime的目标346:PromptlyReturnUnusedCommittedMemoryfromG1G1目前只有在fullGC或者concurrentcycle的时候才会归还内存,由于这两个场景都是G1极力避免的,因此在大多数场景下可能不会及时会还committedJavaheapmemory给操作系统。JDK12的这个特性新增了两个参数分别是G1PeriodicGCInterval及G1PeriodicGCSystemLoadThreshold,设置为0的话,表示禁用。当上一次garbagecollectionpause过去G1PeriodicGCInterval(milliseconds)时间之后,如果getloadavg()(oneminute)低于G1PeriodicGCSystemLoadThreshold指定的阈值,则触发fullGC或者concurrentGC(如果开启G1PeriodicGCInvokesConcurrent),GC之后Javaheapsize会被重写调整,然后多余的内存将会归还给操作系统 细项解读 上面列出的是大方面的特性,除此之外还有一些api的更新及废弃,主要见JDK12ReleaseNotes,这里举几个例子。 添加项支持unicode11支持CompactNumberFormatting 使用实例如下 Test publicvoidtestCompactNumberFormat(){ varcnfNumberFormat。getCompactNumberInstance(Locale。CHINA,NumberFormat。Style。SHORT); System。out。println(cnf。format(10000)); System。out。println(cnf。format(19200)); System。out。println(cnf。format(1000000)); System。out。println(cnf。format(1Llt;lt;30)); System。out。println(cnf。format(1Llt;lt;40)); System。out。println(cnf。format(1Llt;lt;50)); } 输出 1万 2万 100万 11亿 1兆 1126兆 String支持transform、indent操作 Test publicvoidtestStringTransform(){ System。out。println(hello。transform(newFunctionlt;String,Integergt;(){ Override publicIntegerapply(Strings){ returns。hashCode(); } })); } Test publicvoidtestStringIndent(){ System。out。println(hello。indent(3)); } Files新增mismatch方法 Test publicvoidtestFilesMismatch()throwsIOException{ FileWriterfileWriternewFileWriter(tmpa。txt); fileWriter。write(a); fileWriter。write(b); fileWriter。write(c); fileWriter。close(); FileWriterfileWriterBnewFileWriter(tmpb。txt); fileWriterB。write(a); fileWriterB。write(1); fileWriterB。write(c); fileWriterB。close(); System。out。println(Files。mismatch(Path。of(tmpa。txt),Path。of(tmpb。txt))); } Collectors新增teeing方法用于聚合两个downstream的结果 Test publicvoidtestCollectorTeeing(){ varresultStream。of(Devoxx,VoxxedDays,CodeOne,BaselOne) 。collect(Collectors。teeing(Collectors。filtering(ngt;n。contains(xx),Collectors。toList()), Collectors。filtering(ngt;n。endsWith(One),Collectors。toList()), (Listlt;Stringgt;list1,Listlt;Stringgt;list2)gt;List。of(list1,list2) )); System。out。println(result。get(0)); System。out。println(result。get(1)); } CompletionStage新增exceptionallyAsync、exceptionallyCompose、exceptionallyComposeAsync方法 Test publicvoidtestExceptionallyAsync()throwsExecutionException,InterruptedException{ LOGGER。info(begin); intresultCompletableFuture。supplyAsync(()gt;{ LOGGER。info(calculate); inti10; return100; })。exceptionallyAsync((t)gt;{ LOGGER。info(errorerror:{},t。getMessage()); return0; })。get(); LOGGER。info(result:{},result); } JDK12之前CompletionStage只有一个exceptionally,该方法体在主线程执行,JDK12新增了exceptionallyAsync、exceptionallyComposeAsync方法允许方法体在异步线程执行,同时新增了exceptionallyCompose方法支持在exceptionally的时候构建新的CompletionStageAllocationofOldGenerationofJavaHeaponAlternateMemoryDevices G1及ParallelGC引入experimental特性,允许将oldgeneration分配在诸如NVDIMMmemory的alternativememorydeviceZGC:ConcurrentClassUnloading ZGC在JDK11的时候还不支持classunloading,JDK12对ZGC支持了ConcurrentClassUnloading,默认是开启,使用XX:ClassUnloading可以禁用新增XX:ExtensiveErrorReports XX:ExtensiveErrorReports可以用于在jvmcrash的时候收集更多的报告信息到hserrlt;pidgt;。log文件中,productbuilds中默认是关闭的,要开启的话,需要自己添加XX:ExtensiveErrorReports参数新增安全相关的改进支持java。security。manager系统属性,当设置为disallow的时候,则不使用SecurityManager以提升性能,如果此时调用System。setSecurityManager则会抛出UnsupportedOperationException keytool新增groupname选项允许在生成keypair的时候指定一个namedgroup 新增PKCS12KeyStore配置属性用于自定义PKCS12keystores的生成 JavaFlightRecorder新增了securityrelated的event 支持ChaCha20andPoly1305TLSCipherSuitesjdepsReportsTransitiveDependences jdeps的printmoduledeps,listdeps,以及listreducedeps选项得到增强,新增norecursive用于nontransitive的依赖分析,ignoremissingdeps用于suppressmissingdependenceerrors 移除项移除com。sun。awt。SecurityWarnin移除FileInputStream、FileOutputStream、Java。util。ZipFileInflatorDeflator的finalize方法移除GTECyberTrustGlobalRoot移除javac的source,target对6及1。6的支持,同时移除release选项 废弃项废弃的API列表见deprecatedlist废弃XX:MonitorInUseLists选项废弃DefaultKeytool的keyalg值 已知问题Swing不支持GTK3。20及以后的版本在使用JVMCICompiler(比如Graal)的时候,JVMTI的canpopframe及canforceearlyreturn的capabilities是被禁用的 其他事项如果用户没有指定user。timezone且从操作系统获取的为空,那么user。timezone属性的初始值为空变为nulljava。net。URLPermission的行为发生轻微变化,以前它会忽略url中的query及fragment部分,这次改动新增query及fragment部分,即scheme:authority〔path〕变动为scheme:authority〔path〕〔ignoredqueryorfragment〕javax。net。ssl。SSLContextAPI及JavaSecurityStandardAlgorithmNames规范移除了必须实现TLSv1及TLSv1。1的规定 小结java12不是LTS(LongTermSupport)版本(oracle版本才有LTS),oracle对该版本的support周期为6个月。这个版本主要有几个更新点,一个是语法层更新,一个是API层面的更新,另外主要是GC方面的更新。语法层面引入了preview版本的SwitchExpressions;API层面引入了JVMConstantsAPI,引入CompactNumberFormat,让NumberFormat支持COMPACTSTYLE,对String、Files、Collectors、CompletionStage等新增方法;GC方面引入了experimental版本的ShenandoahGC,不过oraclebuild的openjdk没有enableShenandoahGCsupport;另外主要对ZGC及G1GC进行了改进其中JDK12对ZGC支持了ConcurrentClassUnloading,默认是开启,使用XX:ClassUnloading可以禁用;对于G1GC则新增支持AbortableMixedCollections以及PromptlyReturnUnusedCommittedMemory特性 docopenjdk12JDK12ReleaseNotesJava12ReleasedwithExperimentalSwitchExpressionsandShenandoahGCDefinitiveGuideToJava12DefinitiveGuideToSwitchExpressionsInJava12JVMClassDataSharingJEP310:ApplicationClassDataSharingImproveLaunchTimesOnJava10WithApplicationClassDataSharingMakeXshare:autothedefaultforserverVMUsingapplicationclassdatasharingJavaPerformanceTuningNewsFebruary2018JDK12SecurityEnhancements