Java10新特性 - Go语言中文社区

Java10新特性


1、var关键字

(1)var关键字简介
在以前版本的Java中,我们想定义定义局部变量时。我们需要在赋值的左侧提供显式类型,并在赋值的右边提供实现类型,如下面的片段所示。

MyObject value = new MyObject();
List list = new ArrayList();

var关键字代替局部变量前面的类型修饰,从而起到简化代码的作用。这里的var不是一个数据类型,只是起到一个占位符的作用。给变量留一个保留的类型名称,在编译器当中,仍旧转化为相对应的类型。在Java 10中,你可以这样定义对象。

var value = new MyObject();
var list = new ArrayList();

我们这里的var相当于是一个标志符,所有凡是命名为var的类将不再生效。Java10里面的var和JavaScript里面的var是不相同的,JavaScript里面的var是一个弱类型,Java10里面仍然是强类型的。
(2)var关键字的适用范围
传统for循环:

for (int i = 0; i < stringList.size(); i++) {
     System.out.println(stringList.get(i));
}

var关键字修饰的传统for循环:

for (var i = 0; i < stringList.size(); i++) {
     System.out.println(stringList.get(i));
}

传统增强for循环:

for (int s1 : stringList) {
     System.out.println(s1);
}

var关键字修饰的增强for循环:

for (var s1 : stringList) {
     System.out.println(s1);
}

(3)var关键字的不适用范围
1)方法的参数

public void java10(var n){

}

2)构造函数的参数

public HelloWorld(var n){

}

3)方法的返回值类型

public var java10(){

}

4)对象的成员变量

private var name="java";

5)变量只是定义而不初始化

var x;

2、应用程序类数据共享 (AppCDS)

AppCDS通过在不同的Java进程间共享公共类元数据来减少占用空间,改善启动时间。我们可以扩展CDS以允许将归档类加载到自定义类加载器中。
决定要dump哪些类:

java -Xshare:on -XX:+UseAppCDS -XX:SharedArchiveFile=hello.jsa

将内存中的类dump到归档文件中:

java -Xshare:dump -XX:+UseAppCDS -XX:SharedClassListFile=hello.lst -XX:SharedArchiveFile=hello.jsa

-Xshare:dump:表示现在要进行类的内存的 Dump。
-XX:SharedClassListFile:用来指定需要 Dump 的类的列表。
-XX:SharedArchiveFile:表示需要将类的内存 Dump 到哪个归档文件中。

使用CDS存档:

java –Xshare:on –XX:+UseAppCDS –XX:SharedAchiveFile=hello.jsa

3、线性本地握手

(1)Safepoint
从线程角度看,Safepoint可以理解成是在代码执行过程中的一些特殊位置,当线程执行到这些位置的时候,说明虚拟机当前的状态是安全的,如果有需要,可以在这个位置暂停。
会用到Safepoint的一些场景:垃圾回收(GC)、debug、偏向锁等一些场合。
(2)Safepoint的不足
让所有线程都到就近的Safepoint停下来需要较长的时间,而且让所有线程都停下来对很多JVM的全局操作是没有必要的。
(3)Thread Local Handshake的作用
当线程处于Safepoint时,可以直接由线程本身或者JVM线程做回调。
这样在很多的线程操作中,可以不必要求所有的线程都进入了Safepoint再操作,大大减少了操作时间和性能开销。

4、JIT编译器

(1)什么是JIT
动态编译(dynamic compilation)指的是“在运行时进行编译”;与之相对的是事前编译(ahead-of-time compilation,简称AOT),也叫静态编译(static compilation)。
JIT编译(just-in-time compilation)狭义来说是当某段代码即将第一次被执行时进行编译,因而叫“即时编译”。JIT编译是动态编译的一种特例。JIT编译一词后来被泛化,时常与动态编译等价;但要注意广义与狭义的JIT编译所指的区别。
(2)JIT编译流程图

(3)JIT的使用
如何关闭JIT(JIT默认情况是开启的):

java -Xint your_main_class_file_name
java -Djava.compiler your_main_class_file_name

如何查看JIT生成的汇编代码:

java -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly your_main_class_file_name

5、删除工具javah

javah命令主要用于在JNI开发时,把java代码声明的JNI方法转化成CC++头文件,以便进行JNI的CC++端程序的开发。该工具已被JDK 8中添加的javac中的功能所取代。此功能提供了在编译Java源代码时编写本机头文件的功能,从而无需使用单独的工具。

6、其他新特性

(1)使用附加的 Unicode 语言标记扩展。
(2)能将堆内存占用分配给用户指定的备用内存设备。
(3)在 OpenJDK 中提供一组默认的根证书颁发机构证书。开源目前 Oracle 提供的 Java SE 的根证书,这样 OpenJDK 对开发人员使用起来更方便。
(4)JEP322,基于时间定义的发布版本,即上述提到的发布周期。版本号为$FEATURE.$INTERIM.$UPDATE.$PATCH,分别是大版本,中间版本,升级包和补丁版本。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/gongxifacai_believe/article/details/104418900
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢