java9学习笔记-part2

发布于:2025-08-13 ⋅ 阅读:(8) ⋅ 点赞:(0)

进程 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();
        // 输出进程的 id
        System.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<>() {
            @Override
            public int size() {return 0;}
            @Override
            public boolean isEmpty() {return false;}
            @Override
            public boolean contains(Object o) {return false;}
            @Override
            public Iterator<Integer> iterator() {return null;}
            @Override
            public Object[] toArray() {return new Object[0];}
            @Override
            public <T> T[] toArray(T[] a) {return null;}
            @Override
            public boolean add(Integer integer) {return false;}
            @Override
            public boolean remove(Object o) {return false;}
            @Override
            public boolean containsAll(Collection<?> c) {return false;}
            @Override
            public boolean addAll(Collection<? extends Integer> c) {return false;}
            @Override
            public boolean addAll(int index, Collection<? extends Integer> c) {return false;}
            @Override
            public boolean removeAll(Collection<?> c) {return false;}
            @Override
            public boolean retainAll(Collection<?> c) {return false;}
            @Override
            public void clear() {}
            @Override
            public Integer get(int index) {return 0;}
            @Override
            public Integer set(int index, Integer element) {return 0;}
            @Override
            public void add(int index, Integer element) {}
            @Override
            public Integer remove(int index) {return 0;}
            @Override
            public int indexOf(Object o) {return 0;}
            @Override
            public int lastIndexOf(Object o) {return 0;}
            @Override
            public ListIterator<Integer> listIterator() {return null;}
            @Override
            public 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)可能会更加合适。无论选择哪种方法,确保你的日志策略能够满足你的监控、调试和生产需求。


网站公告

今日签到

点亮在社区的每一天
去签到