其他内容

类型注解

java8里面注解可以应用在任何地方。类型注解只是语法而不是语义,并不会影响java的编译、加载以及运行时间。

类型注解被用来支持在Java的程序中做强类型检查。 配合插件式的check-framework,可以在编译的时候检测出runtime error来提高代码质量,这就是类型注解的作用了。

重复注解

允许在同一申明类型(类/属性/方法)上多次使用同一个注解。@Repeatable指向注解XXX.class。

泛型的目标类型推断

泛型是JavaSE1.5新特性。泛型的最大优点就是提供了程序的类型安全同时可以向后兼容,但尴尬的地方就是每次定义时都要写明泛型的类型,这样不仅感觉有些冗长,现在通过编译器自动推断泛型的参数类型,能够减少这样的情况并提高代码可读性。

JAVA7对此提出了简化,例如:Map<String, String> myMap = new HashMap<>();但JAVA7只有构造器的参数化类型在上下文中被显著的声明了才可以使用类型推断,其他则不行。

针对JAVA7,JAVA8针对泛型的目标类型推断主要有2个改进:

①支持通过方法上下文推断泛型目标类型,而不局限在构造方法上。

②支持在方法调用链路当中,泛型类型推断传递到最后一个方法。

说白了,JAVA8根据代码上下文来推断其泛型的目标类型,不用再次指明。

精简的JRE

该特性使得JAVA应用程序不需要整个JRE平台即可部署和运行在小型设备上。可以基于目标硬件的可用资源选择一个合适的JRE运行环境。

紧凑的JRE分3种:compact1、compact2、compact3,他们内涵API的数量关系是:compact1<compact2<compact3。

可以通过如下2个工具来判断其最小JAR是哪类:

①javac –bootclasspath/javac –profile

②jdeps可以用来分析应用程序所依赖的profile, 有三个参数比较常用-p/-v/-r。

PermGen空间

java.lang.OutOfMemoryError: PermGen space,该问题往往是由类加载器相关的内存泄漏以及新类加载器的创建导致的。

PermGen space全称是Permanent Generation space,是指内存的永久保存区域,这一部分用于存放Class和Meta的信息,当Class在被Load的时候被放入PermGen space区域, 它和和存放Instance的Heap区域不同,如果LOAD很多CLASS的话,就很可能出现PermGen space错误。

JDK8 JVM将移除永久区,使用计算机本地内存来存储类元数据信息并称之为:元空间( Metaspace),总结如下:

①PermGen空间的状况:这部分内存空间将全部移除。JVM的参数:PermSize和MaxPermSize 会被忽略并给出警告。

②Metaspace内存分配模型:大部分类元数据都在本地内存中分配。

③Metaspace容量:默认情况下,类元数据只受可用的本地内存限制(容量取决于是32位或是64位操作系统的可用虚拟内存大小) 。

新参数( MaxMetaspaceSize)用于限制本地内存分配给类元数据的大小。如果没有指定这个参数,元空间会在运行时根据需要动态调整。

④Metaspace垃圾回收:对于僵死的类及类加载器的垃圾回收将在元数据使用达到“MaxMetaspaceSize”参数的设定值时进行。适时地监控和调整元空间对于减小垃圾回收频率和减少延时是很有必要的。 持续的元空间垃圾回收说明,可能存在类、类加载器导致的内存泄漏或是大小设置不合适。

⑤Java堆内存的影响:一些杂项数据已经移到Java堆空间中。 升级到JDK8之后会发现Java堆空间有所增长。

⑥Metaspace 监控:元空间的使用情况可以从HotSpot1.8的详细GC日志输出中得到。

StampedLock锁

StampedLock控制锁有三种模式(写,读,乐观读) ,一个StampedLock状态是由版本和模式两个部分组成, 锁获取方法返回一个数字作为票据stamp, 它用相应的锁状态表示并控制访问, 数字0表示没有写锁被授权访问。

在读锁上分为悲观锁和乐观锁。所谓的乐观读模式,也就是若读的操作很多,写的操作很少的情况下,你可以乐观地认为,写入与读取同时发生机率很少, 因此不悲观地使用完全的读取锁定, 程序可以查看读取资料之后,是否遭到写入执行的变更,再采取后续的措施。

StampedLock 对吞吐量有巨大的改进, 特别是在读线程越来越多的场景下。StampedLock有一个复杂的API, 对于加锁操作, 很容易误用其他方法;

当只有少量竞争者的时候,synchronized是一个很好的通用的锁实现;当线程增长能够预估,ReentrantLock是一个很好的通用的锁实现;

Base64

在JDK1.6之前,JDK核心类一直没有Base64的实现类。JDK1.6中添加了另一个Base64的实现, javax.xml.bind.DatatypeConver
ter两个静态方法parseBase64Binary和 printBase64Binary,隐藏在javax.xml.bind包下面。

在Java8在java.util包下面实现了BASE64编解码API且性能非常好。

Nashorn

支持JS脚本运行在JVM端,其主要是两个方面:jjs工具以及javax.script包下面的API。jjs是在java_home/bin下面自带。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章