进程 API
在 Java 9 之前,Process API 仍然缺乏对使用本地进程的基本支持,例如获取进程的 PID 和所有者,进程的开始时间,进程使用了多少 CPU 时间,多少本地进程正在运行等。
Java 9 向 Process API 添加了一个名为 ProcessHandle 的接口来增强 java.lang.Process 类。
ProcessHandle 接口的实例标识一个本地进程,它允许查询进程状态并管理进程。
ProcessHandle 嵌套接口 Info 来让开发者逃离时常因为要获取一个本地进程的 PID 而不得不使用本地代码的窘境。
我们不能在接口中提供方法实现。如果我们要提供抽象方法和非抽象方法(方法与实现)的组合,那么我们就得使用抽象类。
ProcessHandle 接口中声明的 onExit() 方法可用于在某个进程终止时触发某些操作。
// 获取当前正在运行的 JVM 的进程ProcessHandle currentProcess = ProcessHandle.current();// 输出进程的 idSystem.out.println(currentProcess.pid());// 输出进程的信息System.out.println(currentProcess.info());
不能使用下划线命名变量
String _ = "张三";
兼容性
javadoc文档兼容 HTML5 标准
javadoc -encoding UTF-8 -charset UTF-8 -d [文档输出位置] -html5 [需要输出文档的文件]
javadoc -encoding UTF-8 -charset UTF-8 -d C:\JAVA\doc-java9 -html5 C:\JAVA\doc-java9\Java9Test.java
多版本兼容 jar 包
多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本。
通过 --release 参数指定编译版本。
@Deprecated
Java 9 中注解增加了两个新元素:since 和 forRemoval。
- since: 元素指定已注解的API元素已被弃用的版本。
- forRemoval: 元素表示注解的 API 元素在将来的版本中被删除,应该迁移 API。
/*** Returns the version in which the annotated element became deprecated.* The version string is in the same format and namespace as the value of* the {@code @since} javadoc tag. The default value is the empty* string.** @return the version string* @since 9*/ String since() default "";/*** Indicates whether the annotated element is subject to removal in a* future version. The default value is {@code false}.** @return whether the element is subject to removal* @since 9*/ boolean forRemoval() default false;
钻石操作符(Diamond Operator)
钻石操作符是在 java 7 中引入的,可以让代码更易读,但它不能用于匿名的内部类。
在 java 9 中, 它可以与匿名的内部类一起使用,从而提高代码的可读性。
List<Integer> integerList = new List<>() {@Overridepublic int size() {return 0;}@Overridepublic boolean isEmpty() {return false;}@Overridepublic boolean contains(Object o) {return false;}@Overridepublic Iterator<Integer> iterator() {return null;}@Overridepublic Object[] toArray() {return new Object[0];}@Overridepublic <T> T[] toArray(T[] a) {return null;}@Overridepublic boolean add(Integer integer) {return false;}@Overridepublic boolean remove(Object o) {return false;}@Overridepublic boolean containsAll(Collection<?> c) {return false;}@Overridepublic boolean addAll(Collection<? extends Integer> c) {return false;}@Overridepublic boolean addAll(int index, Collection<? extends Integer> c) {return false;}@Overridepublic boolean removeAll(Collection<?> c) {return false;}@Overridepublic boolean retainAll(Collection<?> c) {return false;}@Overridepublic void clear() {}@Overridepublic Integer get(int index) {return 0;}@Overridepublic Integer set(int index, Integer element) {return 0;}@Overridepublic void add(int index, Integer element) {}@Overridepublic Integer remove(int index) {return 0;}@Overridepublic int indexOf(Object o) {return 0;}@Overridepublic int lastIndexOf(Object o) {return 0;}@Overridepublic ListIterator<Integer> listIterator() {return null;}@Overridepublic ListIterator<Integer> listIterator(int index) {return null;}@Override public List<Integer> subList(int fromIndex, int toIndex) {return Collections.emptyList();}};integerList.add(1);integerList.add(1);integerList.add(1);
new List<>()然后根据idea提示实现方法
虽然能add元素不报错,但是这样也添加不进去元素
统一JVM日志
在Java 9中,JVM日志的管理和配置相较于之前版本有了一些改进,特别是在统一日志管理方面。以下是一些关于如何在Java 9中统一管理JVM日志的步骤和技巧:
使用-Xlog
选项
Java 9引入了-Xlog
选项,这是一个强大的工具,用于统一配置和记录JVM的日志。你可以使用-Xlog
选项来启用或禁用不同的日志记录级别,并指定日志输出的位置。
示例
ava -Xlog:gc*:file=gc.log:time,level -jar your-application.jar
这个命令会将所有与垃圾回收(GC)相关的日志信息输出到gc.log
文件中,并包含时间戳和日志级别。
配置日志级别
你可以通过-Xlog
选项设置不同的日志级别,例如:
-Xlog:gc
:启用GC日志-Xlog:class+load
:记录类加载事件-Xlog:os+cpu
:记录操作系统和CPU相关的信息
指定日志输出的位置
你可以将日志输出到文件或控制台,例如:
ava -Xlog:gc*:file=gc.log:time,level -jar your-application.jar
使用Java Management Extensions (JMX)
虽然JMX不是专门用于日志管理的,但它可以用来监控和管理JVM的各个方面,包括日志级别。你可以通过JMX来动态调整日志级别,这对于生产环境中的日志管理非常有用。
使用第三方库
对于更复杂的日志管理需求,可以考虑使用第三方库,如Log4j2或SLF4J结合Logback。这些库提供了更丰富的配置选项和更好的灵活性。例如,使用Log4j2,你可以在log4j2.xml
配置文件中详细配置JVM的日志输出。
Log4j2 示例配置
<Configuration><Appenders><File name="LogFile" fileName="gc.log"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"/></File></Appenders><Loggers><Root level="info"><AppenderRef ref="LogFile"/></Root></Loggers>
</Configuration>
日志轮转和压缩
对于生产环境,你可能还需要对日志文件进行轮转和压缩以节省空间。Java 9的-Xlog
选项支持基本的文件输出功能,但对于更高级的轮转和压缩,建议使用专门的日志框架(如Log4j2)来实现。
结论
Java 9通过引入-Xlog
选项为JVM日志管理提供了更直接和灵活的方式。然而,对于更复杂的场景,结合使用第三方日志框架(如Log4j2)可能会更加合适。无论选择哪种方法,确保你的日志策略能够满足你的监控、调试和生产需求。