A brief taste of JIFA

JIFA 是阿里贡献给 Eclipse 的一个适用于 Java 应用的问题诊断应用。

它以图形化的方式展示

  • Heap Dump Analysis
  • GC Log Analysis
  • Thread Dump Analysis

因为云环境/生产环境的一些限制,应用的问题可能不能被就地分析,所以Jifa provides a web solution, allowing developers to use the browser to troubleshoot.

Start with Docker

A brief taste of JIFA_第1张图片

Heap Dump Analysis

这是一份不断申请内存导致MLE内存泄漏的代码,我们用它来生成Heap Dump这个hprof格式的二进制文件:
A brief taste of JIFA_第2张图片
可以看到内存占用一路走高
A brief taste of JIFA_第3张图片
上传到JIFA
A brief taste of JIFA_第4张图片
打出来了一个内存泄漏的点
A brief taste of JIFA_第5张图片
在支配树里面可以看到主要的内存泄露发生在MemoryLeak这个类里面
A brief taste of JIFA_第6张图片
系统属性也全打出来了
A brief taste of JIFA_第7张图片

GC Log

用下面的命令来生成GC log:

/opt/adopt_jdk8/bin/java -Xloggc:gc.log -XX:+PrintGCDetails  -jar SPECjvm2008.jar -ikv compress

A brief taste of JIFA_第8张图片

Heap
 PSYoungGen      total 47616K, used 22091K [0x00000000dc300000, 0x00000000e0300000, 0x0000000100000000)
  eden space 33280K, 38% used [0x00000000dc300000,0x00000000dcf6f8f8,0x00000000de380000)
  from space 14336K, 65% used [0x00000000de380000,0x00000000deca3530,0x00000000df180000)
  to   space 14336K, 0% used [0x00000000df500000,0x00000000df500000,0x00000000e0300000)
 ParOldGen       total 211968K, used 206426K [0x0000000094800000, 0x00000000a1700000, 0x00000000dc300000)
  object space 211968K, 97% used [0x0000000094800000,0x00000000a1196910,0x00000000a1700000)
 Metaspace       used 16064K, capacity 16294K, committed 16384K, reserved 1064960K
  class space    used 1648K, capacity 1747K, committed 1792K, reserved 1048576K

这段GClog信息提供了关于Java堆内存中的两个主要区域(年轻代和老年代)以及元空间(Metaspace)的统计数据。

对于年轻代(PSYoungGen):

total 47616K:表示年轻代的总容量为47616K(约46.5MB)。
used 22091K:表示当前已使用的年轻代内存大小为22091K(约21.57MB)。
eden space 33280K,38% used:表示年轻代的Eden空间总容量为33280K(约32.5MB),当前已使用了其38%。
from space 14336K,65%used:表示年轻代的From空间总容量为14336K(约14MB),当前已使用了其65%。
to space 14336K,0%used:表示年轻代的To空间总容量为14336K(约14MB),当前未使用。

对于老年代(ParOldGen):

total 211968K:表示老年代的总容量为211968K(约207MB)。
used 206426K:表示当前已使用的老年代内存大小为206426K(约201.6MB)。
object space 211968K,97%used:表示老年代的对象空间总容量为211968K(约207MB),当前已使用了其97%。 对于元空间(Metaspace):

used 16064K:表示当前已使用的元空间大小为16064K(约15.7MB)。
capacity 16294K:表示元空间的容量为16294K(约15.9MB)。
committed 16384K:表示元空间分配的内存大小为16384K(约16MB)。
reserved 1064960K:表示元空间预留的内存大小为1064960K(约1040MB)。 另外,还包括了与类相关的统计信息:

class space used 1648K:表示类空间已使用的大小为1648K(约1.6MB)。
class space capacity 1747K:表示类空间的容量为1747K(约1.7MB)。
class space committed 1792K:表示类空间分配的内存大小为1792K(约1.7MB)。
class space reserved 1048576K:表示类空间预留的内存大小为1048576K(约1024MB)。

A brief taste of JIFA_第9张图片

Thread Dump

简单的生成Thread Dump的代码

import java.util.Map;

public class ThreadDump {
    public static void main(String[] args) {
        // 在主线程中执行一些任务
        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                while (true) {
                    // 无限循环,模拟长时间运行的线程
                }
            }).start();
        }

        // 让主线程休眠一段时间
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 输出Thread Dump
        System.out.println(generateThreadDump());
    }

    // 生成Thread Dump
    private static String generateThreadDump() {
        StringBuilder threadDump = new StringBuilder();
        Map<Thread, StackTraceElement[]> threadMap = Thread.getAllStackTraces();
        for (Map.Entry<Thread, StackTraceElement[]> entry : threadMap.entrySet()) {
            Thread thread = entry.getKey();
            StackTraceElement[] stackTraceElements = entry.getValue();
            threadDump.append("Thread: ").append(thread.getName()).append("\n");
            for (StackTraceElement element : stackTraceElements) {
                threadDump.append("\t").append(element.toString()).append("\n");
            }
            threadDump.append("\n");
        }
        return threadDump.toString();
    }
}

它的输出如下

Thread: Notification Thread

Thread: Thread-4
        app//ThreadDump.lambda$0(ThreadDump.java:8)
        app//ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)
        [email protected]/java.lang.Thread.run(Thread.java:833)

Thread: Signal Dispatcher

Thread: Finalizer
        [email protected]/java.lang.Object.wait(Native Method)
        [email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
        [email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:176)
        [email protected]/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:172)

Thread: Thread-3
        app//ThreadDump.lambda$0(ThreadDump.java:8)
        app//ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)
        [email protected]/java.lang.Thread.run(Thread.java:833)

Thread: Common-Cleaner
        [email protected]/java.lang.Object.wait(Native Method)
        [email protected]/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)
        [email protected]/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:140)
        [email protected]/java.lang.Thread.run(Thread.java:833)
        [email protected]/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:162)

Thread: Thread-0
        app//ThreadDump.lambda$0(ThreadDump.java:8)
        app//ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)
        [email protected]/java.lang.Thread.run(Thread.java:833)

Thread: Thread-1
        app//ThreadDump.lambda$0(ThreadDump.java:8)
        app//ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)
        [email protected]/java.lang.Thread.run(Thread.java:833)

Thread: main
        [email protected]/java.lang.Thread.dumpThreads(Native Method)
        [email protected]/java.lang.Thread.getAllStackTraces(Thread.java:1662)
        app//ThreadDump.generateThreadDump(ThreadDump.java:28)
        app//ThreadDump.main(ThreadDump.java:22)

Thread: Thread-2
        app//ThreadDump.lambda$0(ThreadDump.java:8)
        app//ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)
        [email protected]/java.lang.Thread.run(Thread.java:833)

Thread: Reference Handler
        [email protected]/java.lang.ref.Reference.waitForReferencePendingList(Native Method)
        [email protected]/java.lang.ref.Reference.processPendingReferences(Reference.java:253)
        [email protected]/java.lang.ref.Reference$ReferenceHandler.run(Reference.java:215)


2023-06-23 15:56:47
Full thread dump OpenJDK 64-Bit Server VM (17.0.8+7 mixed mode, sharing):

Threads class SMR info:
_java_thread_list=0x00007f7404157ca0, length=16, elements={
0x00007f740412c120, 0x00007f740412d500, 0x00007f7404132aa0, 0x00007f7404133e50,
0x00007f7404135260, 0x00007f7404136c10, 0x00007f7404138140, 0x00007f74041395b0,
0x00007f7404140ce0, 0x00007f740414cd70, 0x00007f7404152d60, 0x00007f7404153d10,
0x00007f7404154d10, 0x00007f7404155d10, 0x00007f7404156d00, 0x00007f7404025430
}

"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=0.13ms elapsed=309.58s tid=0x00007f740412c120 nid=0x34a waiting on condition  [0x00007f73e85f6000]
   java.lang.Thread.State: RUNNABLE
        at java.lang.ref.Reference.waitForReferencePendingList([email protected]/Native Method)
        at java.lang.ref.Reference.processPendingReferences([email protected]/Reference.java:253)
        at java.lang.ref.Reference$ReferenceHandler.run([email protected]/Reference.java:215)

"Finalizer" #3 daemon prio=8 os_prio=0 cpu=0.23ms elapsed=309.58s tid=0x00007f740412d500 nid=0x34b in Object.wait()  [0x00007f73e84f5000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait([email protected]/Native Method)
        - waiting on <0x000000009b302f40> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:155)
        - locked <0x000000009b302f40> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:176)
        at java.lang.ref.Finalizer$FinalizerThread.run([email protected]/Finalizer.java:172)

"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0.11ms elapsed=309.57s tid=0x00007f7404132aa0 nid=0x34c waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Service Thread" #5 daemon prio=9 os_prio=0 cpu=0.08ms elapsed=309.57s tid=0x00007f7404133e50 nid=0x34d runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Monitor Deflation Thread" #6 daemon prio=9 os_prio=0 cpu=17.19ms elapsed=309.57s tid=0x00007f7404135260 nid=0x34e runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0" #7 daemon prio=9 os_prio=0 cpu=2.99ms elapsed=309.57s tid=0x00007f7404136c10 nid=0x34f waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"C1 CompilerThread0" #10 daemon prio=9 os_prio=0 cpu=3.77ms elapsed=309.57s tid=0x00007f7404138140 nid=0x350 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE
   No compile task

"Sweeper thread" #11 daemon prio=9 os_prio=0 cpu=0.07ms elapsed=309.57s tid=0x00007f74041395b0 nid=0x351 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Notification Thread" #12 daemon prio=9 os_prio=0 cpu=0.07ms elapsed=309.57s tid=0x00007f7404140ce0 nid=0x352 runnable  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #13 daemon prio=8 os_prio=0 cpu=0.28ms elapsed=309.56s tid=0x00007f740414cd70 nid=0x354 in Object.wait()  [0x00007f73d98f6000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait([email protected]/Native Method)
        - waiting on <0x000000009b3180b8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:155)
        - locked <0x000000009b3180b8> (a java.lang.ref.ReferenceQueue$Lock)
        at jdk.internal.ref.CleanerImpl.run([email protected]/CleanerImpl.java:140)
        at java.lang.Thread.run([email protected]/Thread.java:833)
        at jdk.internal.misc.InnocuousThread.run([email protected]/InnocuousThread.java:162)

"Thread-0" #14 prio=5 os_prio=0 cpu=309573.04ms elapsed=309.56s tid=0x00007f7404152d60 nid=0x355 runnable  [0x00007f73d97f5000]
   java.lang.Thread.State: RUNNABLE
        at ThreadDump.lambda$0(ThreadDump.java:8)
        at ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)
        at java.lang.Thread.run([email protected]/Thread.java:833)

"Thread-1" #15 prio=5 os_prio=0 cpu=309571.34ms elapsed=309.56s tid=0x00007f7404153d10 nid=0x356 runnable  [0x00007f73d96f4000]
   java.lang.Thread.State: RUNNABLE
        at ThreadDump.lambda$0(ThreadDump.java:8)
        at ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)
        at java.lang.Thread.run([email protected]/Thread.java:833)

"Thread-2" #16 prio=5 os_prio=0 cpu=309574.32ms elapsed=309.56s tid=0x00007f7404154d10 nid=0x357 runnable  [0x00007f73d95f3000]
   java.lang.Thread.State: RUNNABLE
        at ThreadDump.lambda$0(ThreadDump.java:8)
        at ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)
        at java.lang.Thread.run([email protected]/Thread.java:833)

"Thread-3" #17 prio=5 os_prio=0 cpu=309574.32ms elapsed=309.56s tid=0x00007f7404155d10 nid=0x358 runnable  [0x00007f73d94f2000]
   java.lang.Thread.State: RUNNABLE
        at ThreadDump.lambda$0(ThreadDump.java:8)
        at ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)
        at java.lang.Thread.run([email protected]/Thread.java:833)

"Thread-4" #18 prio=5 os_prio=0 cpu=309574.21ms elapsed=309.56s tid=0x00007f7404156d00 nid=0x359 runnable  [0x00007f73d93f1000]
   java.lang.Thread.State: RUNNABLE
        at ThreadDump.lambda$0(ThreadDump.java:8)
        at ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)
        at java.lang.Thread.run([email protected]/Thread.java:833)

"DestroyJavaVM" #19 prio=5 os_prio=0 cpu=24.68ms elapsed=304.55s tid=0x00007f7404025430 nid=0x343 waiting on condition  [0x0000000000000000]
   java.lang.Thread.State: RUNNABLE

"VM Thread" os_prio=0 cpu=5.65ms elapsed=309.59s tid=0x00007f74041281a0 nid=0x349 runnable  

"GC Thread#0" os_prio=0 cpu=0.15ms elapsed=309.68s tid=0x00007f7404078190 nid=0x344 runnable  

"G1 Main Marker" os_prio=0 cpu=0.08ms elapsed=309.68s tid=0x00007f7404086ea0 nid=0x345 runnable  

"G1 Conc#0" os_prio=0 cpu=0.06ms elapsed=309.68s tid=0x00007f7404087e00 nid=0x346 runnable  

"G1 Refine#0" os_prio=0 cpu=0.06ms elapsed=309.68s tid=0x00007f74040fb6e0 nid=0x347 runnable  

"G1 Service" os_prio=0 cpu=34.92ms elapsed=309.68s tid=0x00007f74040fc5d0 nid=0x348 runnable  

"VM Periodic Task Thread" os_prio=0 cpu=107.07ms elapsed=309.57s tid=0x00007f7404142a10 nid=0x353 waiting on condition  

JNI global refs: 6, weak refs: 0

Heap
 garbage-first heap   total 112640K, used 2016K [0x0000000094800000, 0x0000000100000000)
  region size 1024K, 1 young (1024K), 0 survivors (0K)
 Metaspace       used 142K, committed 384K, reserved 1114112K
  class space    used 5K, committed 128K, reserved 1048576K

在输出的信息中,JNI global refs: 6, weak refs: 0 指的是JNI(Java Native
Interface)全局引用和弱引用的数量。

JNI允许Java程序与本地代码进行交互,通过调用本地方法来执行一些底层的操作。在这个过程中,Java对象可能会被传递给本地代码,并且本地代码可以持有对这些Java对象的引用。这些引用可以是全局引用或者弱引用。

JNI全局引用:全局引用是一个持久的Java对象引用,它在整个应用程序的生命周期中有效,不会因为方法调用结束而销毁。这些全局引用需要手动释放,否则可能会导致内存泄漏。在输出信息中,JNI
global refs: 6表示当前存在的全局引用数量为6。

JNI弱引用:弱引用是一种不会阻止垃圾回收的引用类型,当被引用的Java对象不再有强引用时,它可能被垃圾回收器回收。在输出信息中,weak
refs: 0表示当前不存在弱引用。

接下来是Heap(堆)部分的信息,它提供了关于Java堆内存的详细信息:

garbage-first heap total 112640K, used
2016K:表明整个Java堆的总大小为112640K,已使用的内存为2016K。

[0x0000000094800000, 0x0000000100000000):表示Java堆的内存地址范围。

region size 1024K, 1 young (1024K), 0 survivors
(0K):说明堆被划分为不同的区域,这里有一个年轻代(young
generation)的区域,大小为1024K,并且没有survivor区域用于存放幸存对象。

然后是关于Metaspace(元空间)的信息:

used 142K, committed 384K, reserved
1114112K:表示当前元空间已使用142K的内存,已分配的内存为384K,保留内存为1114112K。 最后是有关Class
space(类空间)的信息:

used 5K, committed 128K, reserved
1048576K:表示当前类空间已使用5K的内存,已分配的内存为128K,保留内存为1048576K。
这些信息提供了对Java堆和元空间的内存使用情况的统计和分析。

 "Common-Cleaner" #13 daemon prio=8 os_prio=0 cpu=0.28ms elapsed=309.56s tid=0x00007f740414cd70 nid=0x354 in Object.wait()  [0x00007f73d98f6000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait([email protected]/Native Method)
        - waiting on <0x000000009b3180b8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:155)
        - locked <0x000000009b3180b8> (a java.lang.ref.ReferenceQueue$Lock)
        at jdk.internal.ref.CleanerImpl.run([email protected]/CleanerImpl.java:140)
        at java.lang.Thread.run([email protected]/Thread.java:833)
        at jdk.internal.misc.InnocuousThread.run([email protected]/InnocuousThread.java:162)

这段输出是有关线程信息的,提供了关于名为 “Common-Cleaner” 的线程的详细信息。下面是对输出信息的逐行解释:

“Common-Cleaner” #13 daemon prio=8 os_prio=0 cpu=0.28ms
elapsed=309.56s tid=0x00007f740414cd70 nid=0x354 in
Object.wait():这是线程的基本描述信息,指示线程名称为
“Common-Cleaner”,线程优先级为8,并且是一个守护线程(daemon)。其他信息包括操作系统优先级、CPU时间以及已经过的时间。

[0x00007f73d98f6000]:这是线程堆栈的起始内存地址。

java.lang.Thread.State: TIMED_WAITING (on object
monitor):这表示线程的状态为TIMED_WAITING,即线程正在等待一段时间。

at java.lang.Object.wait([email protected]/Native Method):这行代码表明线程调用了
Object.wait() 方法进行等待。wait() 方法是Java中的一个同步方法,用于使线程进入等待状态,直到其他线程唤醒它。

waiting on <0x000000009b3180b8> (a
java.lang.ref.ReferenceQueue$Lock):这是线程正在等待的对象,在这里是一个锁对象,它的内存地址为
<0x000000009b3180b8>。 at
java.lang.ref.ReferenceQueue.remove([email protected]/ReferenceQueue.java:155):这表示线程正在执行
ReferenceQueue.remove() 方法,该方法用于从引用队列中移除对象。

locked <0x000000009b3180b8> (a
java.lang.ref.ReferenceQueue$Lock):这表示线程已经获取了 <0x000000009b3180b8>
对象的锁,因为它是在等待该锁被释放之前进行的。 at
jdk.internal.ref.CleanerImpl.run([email protected]/CleanerImpl.java:140):这表示线程正在执行
CleanerImpl.run() 方法,在该方法中清理对象。

at java.lang.Thread.run([email protected]/Thread.java:833):这表示线程正在执行
Thread.run() 方法,即线程的主要执行逻辑。

at
jdk.internal.misc.InnocuousThread.run([email protected]/InnocuousThread.java:162):这表示线程正在执行的特殊线程
InnocuousThread.run() 方法。

总之,这些信息描述了一个名为 “Common-Cleaner”
的线程的状态、等待的锁对象以及正在执行的方法。该线程可能负责执行对象的清理操作,尤其是回收不再被引用的对象。

我用jstack -l PID > threaddump.txt命令生成了threaddump信息,并导入了JIFA

A brief taste of JIFA_第10张图片

踩过的坑

WSL原生环境

Downloading https://services.gradle.org/distributions/gradle-7.3-bin.zip
...........10%...........20%...........30%...........40%...........50%...........60%...........70%...........80%...........90%...........100%

Welcome to Gradle 7.3!

Here are the highlights of this release:
 - Easily declare new test suites in Java projects
 - Support for Java 17
 - Support for Scala 3

For more details see https://docs.gradle.org/7.3/release-notes.html

Starting a Gradle Daemon (subsequent builds will be faster)

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':backend:heap-dump-analyzer:eclipse-mat-deps'.
> java.lang.RuntimeException: java.net.SocketTimeoutException: timeout

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

BUILD FAILED in 1m 45s
➜  jifa git:(master) java -version
openjdk version "11.0.18" 2023-01-17
OpenJDK Runtime Environment (build 11.0.18+10-post-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 11.0.18+10-post-Ubuntu-0ubuntu122.04, mixed mode, sharing)
> Task :backend:master:runVertxCodeGen
Note: Loaded RxJava2 code generator
Note: Loaded service_proxy_handler code generator
Note: Loaded service_proxy code generator
Note: Loaded data_object_converters code generator
warning: Supported source version 'RELEASE_8' from annotation processor 'org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor' less than -source '11'
Note: Non future method org.eclipse.jifa.master.service.AdminService: void isAdmin(java.lang.String userId, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Boolean>> handler)
Note: Non future method org.eclipse.jifa.master.service.AdminService: void add(java.lang.String userId, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.AdminService: void queryAll(io.vertx.core.Handler<io.vertx.core.AsyncResult<java.util.List<org.eclipse.jifa.master.entity.Admin>>> handler)
Note: Non future method org.eclipse.jifa.master.service.SupportService: void isDBConnectivity(io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Boolean>> handler)
Note: Non future method org.eclipse.jifa.master.service.SupportService: void startDummyWorker(io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.SupportService: void stopDummyWorker(io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.ConfigService: void getConfig(java.lang.String configName, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.String>> handler)
Note: Non future method org.eclipse.jifa.master.service.JobService: void findActive(org.eclipse.jifa.master.entity.enums.JobType jobType, java.lang.String target, io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.Job>> handler)
Note: Non future method org.eclipse.jifa.master.service.JobService: void pendingJobsInFrontOf(org.eclipse.jifa.master.entity.Job job, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.util.List<org.eclipse.jifa.master.entity.Job>>> handler)
Note: Non future method org.eclipse.jifa.master.service.JobService: void allocate(java.lang.String userId, java.lang.String hostIP, org.eclipse.jifa.master.entity.enums.JobType jobType, java.lang.String target, java.lang.String attachment, long estimatedLoad, boolean immediate, io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.Job>> handler)
Note: Non future method org.eclipse.jifa.master.service.JobService: void finish(org.eclipse.jifa.master.entity.enums.JobType type, java.lang.String target, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.WorkerService: void queryAll(io.vertx.core.Handler<io.vertx.core.AsyncResult<java.util.List<org.eclipse.jifa.master.entity.Worker>>> handler)
Note: Non future method org.eclipse.jifa.master.service.WorkerService: void diskCleanup(java.lang.String hostIP, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.WorkerService: void selectMostIdleWorker(io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.Worker>> handler)
Note: Non future method org.eclipse.jifa.master.service.WorkerService: void selectWorkerByIP(java.lang.String hostIp, io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.Worker>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void count(java.lang.String userId, org.eclipse.jifa.common.enums.FileType type, java.lang.String expectedFilename, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Integer>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void files(java.lang.String userId, org.eclipse.jifa.common.enums.FileType type, java.lang.String expectedFilename, int page, int pageSize, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.util.List<org.eclipse.jifa.master.entity.File>>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void file(java.lang.String name, io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.File>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void deleteFile(java.lang.String name, org.eclipse.jifa.master.entity.enums.Deleter deleter, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void transfer(java.lang.String userId, org.eclipse.jifa.common.enums.FileType type, java.lang.String originalName, java.lang.String name, org.eclipse.jifa.master.model.TransferWay transferWay, java.util.Map<java.lang.String,java.lang.String> transferInfo, io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.Job>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void transferDone(java.lang.String name, org.eclipse.jifa.common.enums.FileTransferState transferState, long size, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void setShared(java.lang.String name, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void updateDisplayName(java.lang.String name, java.lang.String displayName, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.AdminService: void isAdmin(java.lang.String userId, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Boolean>> handler)
Note: Non future method org.eclipse.jifa.master.service.AdminService: void add(java.lang.String userId, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.AdminService: void queryAll(io.vertx.core.Handler<io.vertx.core.AsyncResult<java.util.List<org.eclipse.jifa.master.entity.Admin>>> handler)
Note: Non future method org.eclipse.jifa.master.service.SupportService: void isDBConnectivity(io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Boolean>> handler)
Note: Non future method org.eclipse.jifa.master.service.SupportService: void startDummyWorker(io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.SupportService: void stopDummyWorker(io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.ConfigService: void getConfig(java.lang.String configName, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.String>> handler)
Note: Non future method org.eclipse.jifa.master.service.JobService: void findActive(org.eclipse.jifa.master.entity.enums.JobType jobType, java.lang.String target, io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.Job>> handler)
Note: Non future method org.eclipse.jifa.master.service.JobService: void pendingJobsInFrontOf(org.eclipse.jifa.master.entity.Job job, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.util.List<org.eclipse.jifa.master.entity.Job>>> handler)
Note: Non future method org.eclipse.jifa.master.service.JobService: void allocate(java.lang.String userId, java.lang.String hostIP, org.eclipse.jifa.master.entity.enums.JobType jobType, java.lang.String target, java.lang.String attachment, long estimatedLoad, boolean immediate, io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.Job>> handler)
Note: Non future method org.eclipse.jifa.master.service.JobService: void finish(org.eclipse.jifa.master.entity.enums.JobType type, java.lang.String target, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.WorkerService: void queryAll(io.vertx.core.Handler<io.vertx.core.AsyncResult<java.util.List<org.eclipse.jifa.master.entity.Worker>>> handler)
Note: Non future method org.eclipse.jifa.master.service.WorkerService: void diskCleanup(java.lang.String hostIP, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.WorkerService: void selectMostIdleWorker(io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.Worker>> handler)
Note: Non future method org.eclipse.jifa.master.service.WorkerService: void selectWorkerByIP(java.lang.String hostIp, io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.Worker>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void count(java.lang.String userId, org.eclipse.jifa.common.enums.FileType type, java.lang.String expectedFilename, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Integer>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void files(java.lang.String userId, org.eclipse.jifa.common.enums.FileType type, java.lang.String expectedFilename, int page, int pageSize, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.util.List<org.eclipse.jifa.master.entity.File>>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void file(java.lang.String name, io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.File>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void deleteFile(java.lang.String name, org.eclipse.jifa.master.entity.enums.Deleter deleter, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void transfer(java.lang.String userId, org.eclipse.jifa.common.enums.FileType type, java.lang.String originalName, java.lang.String name, org.eclipse.jifa.master.model.TransferWay transferWay, java.util.Map<java.lang.String,java.lang.String> transferInfo, io.vertx.core.Handler<io.vertx.core.AsyncResult<org.eclipse.jifa.master.entity.Job>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void transferDone(java.lang.String name, org.eclipse.jifa.common.enums.FileTransferState transferState, long size, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void setShared(java.lang.String name, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Non future method org.eclipse.jifa.master.service.FileService: void updateDisplayName(java.lang.String name, java.lang.String displayName, io.vertx.core.Handler<io.vertx.core.AsyncResult<java.lang.Void>> handler)
Note: Generated model org.eclipse.jifa.master.entity.Admin: org.eclipse.jifa.master.entity.AdminConverter
Note: Generated model org.eclipse.jifa.master.service.AdminService: org.eclipse.jifa.master.service.AdminServiceVertxProxyHandler
Note: Generated model org.eclipse.jifa.master.service.FileService: org.eclipse.jifa.master.service.FileServiceVertxProxyHandler
Note: Generated model org.eclipse.jifa.master.service.ConfigService: org.eclipse.jifa.master.service.ConfigServiceVertxProxyHandler
Note: Generated model org.eclipse.jifa.master.service.FileService: org.eclipse.jifa.master.service.FileServiceVertxEBProxy
Note: Generated model org.eclipse.jifa.master.service.FileService: org.eclipse.jifa.master.service.reactivex.FileService
Note: Generated model org.eclipse.jifa.master.entity.Worker: org.eclipse.jifa.master.entity.WorkerConverter
Note: Generated model org.eclipse.jifa.master.entity.Master: org.eclipse.jifa.master.entity.MasterConverter
Note: Generated model org.eclipse.jifa.master.service.SupportService: org.eclipse.jifa.master.service.SupportServiceVertxEBProxy
Note: Generated model org.eclipse.jifa.master.service.SupportService: org.eclipse.jifa.master.service.SupportServiceVertxProxyHandler
Note: Generated model org.eclipse.jifa.master.entity.File: org.eclipse.jifa.master.entity.FileConverter
Note: Generated model org.eclipse.jifa.master.service.SupportService: org.eclipse.jifa.master.service.reactivex.SupportService
Note: Generated model org.eclipse.jifa.master.service.ConfigService: org.eclipse.jifa.master.service.ConfigServiceVertxEBProxy
Note: Generated model org.eclipse.jifa.master.service.WorkerService: org.eclipse.jifa.master.service.WorkerServiceVertxEBProxy
Note: Generated model org.eclipse.jifa.master.service.JobService: org.eclipse.jifa.master.service.JobServiceVertxProxyHandler
Note: Generated model org.eclipse.jifa.master.entity.Job: org.eclipse.jifa.master.entity.JobConverter
Note: Generated model org.eclipse.jifa.master.service.WorkerService: org.eclipse.jifa.master.service.WorkerServiceVertxProxyHandler
Note: Generated model org.eclipse.jifa.master.entity.Config: org.eclipse.jifa.master.entity.ConfigConverter
Note: Generated model org.eclipse.jifa.master.service.JobService: org.eclipse.jifa.master.service.reactivex.JobService
Note: Generated model org.eclipse.jifa.master.service.ConfigService: org.eclipse.jifa.master.service.reactivex.ConfigService
Note: Generated model org.eclipse.jifa.master.service.AdminService: org.eclipse.jifa.master.service.reactivex.AdminService
Note: Generated model org.eclipse.jifa.master.entity.GlobalLock: org.eclipse.jifa.master.entity.GlobalLockConverter
Note: Generated model org.eclipse.jifa.master.service.WorkerService: org.eclipse.jifa.master.service.reactivex.WorkerService
Note: Generated model org.eclipse.jifa.master.service.AdminService: org.eclipse.jifa.master.service.AdminServiceVertxEBProxy
Note: Generated model org.eclipse.jifa.master.service.JobService: org.eclipse.jifa.master.service.JobServiceVertxEBProxy
warning: Unclosed files for the types 'PathForCodeGenProcessor'; these types will not undergo annotation processing
2 warnings

> Task :backend:master:compileJava
Note: /home/bernard/project/jifa/backend/master/src/main/generated/org/eclipse/jifa/master/entity/FileConverter.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

> Task :generateSSHConfig
Enter passphrase (empty for no passphrase): Enter same passphrase again: 
> Task :backend:thread-dump-analyzer:compileJava
/home/bernard/project/jifa/backend/thread-dump-analyzer/src/main/java/org/eclipse/jifa/tda/model/Snapshot.java:30: warning: Not generating hashCode: One of equals or hashCode exists. You should either write both of these or none of these (in the latter case, lombok generates them).
@Data
^
1 warning

> Task :backend:heap-dump-analyzer:impl:compileJava
Note: /home/bernard/project/jifa/backend/heap-dump-analyzer/impl/src/main/java/org/eclipse/jifa/hda/impl/HeapDumpAnalyzerImpl.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

> Task :backend:worker:test
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.protobuf.UnsafeUtil (file:/home/bernard/project/jifa/backend/heap-dump-analyzer/mat-deps/configuration/org.eclipse.osgi/29/0/.cp/target/dependency/MatCalciteDependencies.jar) to field java.nio.Buffer.address
WARNING: Please consider reporting this to the maintainers of com.google.protobuf.UnsafeUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release

> Task :frontend:npmInstall
npm WARN ERESOLVE overriding peer dependency
npm WARN While resolving: [email protected]
npm WARN Found: [email protected]
npm WARN node_modules/echarts
npm WARN   echarts@"^5.3.3" from the root project
npm WARN   1 more (v-charts)
npm WARN 
npm WARN Could not resolve dependency:
npm WARN peer echarts@"^4.8.0" from [email protected]
npm WARN node_modules/v-charts/node_modules/echarts-liquidfill
npm WARN   echarts-liquidfill@"^2.0.2" from [email protected]
npm WARN   node_modules/v-charts
npm WARN 
npm WARN Conflicting peer dependency: [email protected]
npm WARN node_modules/echarts
npm WARN   peer echarts@"^4.8.0" from [email protected]
npm WARN   node_modules/v-charts/node_modules/echarts-liquidfill
npm WARN     echarts-liquidfill@"^2.0.2" from [email protected]
npm WARN     node_modules/v-charts
npm WARN deprecated [email protected]: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated [email protected]: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
npm WARN deprecated [email protected]: Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility
npm WARN deprecated [email protected]: See https://github.com/lydell/source-map-resolve#deprecated
npm WARN deprecated [email protected]: This SVGO version is no longer supported. Upgrade to v2.x.x.
npm WARN deprecated [email protected]: See https://github.com/lydell/source-map-url#deprecated
npm WARN deprecated [email protected]: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142
npm WARN deprecated [email protected]: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated [email protected]: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated [email protected]: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated [email protected]: You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1
npm WARN deprecated [email protected]: 3.x is no longer supported
npm WARN deprecated [email protected]: this library is no longer supported
npm WARN deprecated [email protected]: This loader has been deprecated. Please use eslint-webpack-plugin
npm WARN deprecated [email protected]: CircularJSON is in maintenance only, flatted is its successor.
npm WARN deprecated [email protected]: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/[email protected]: Switch to 'npm install joi'
npm WARN deprecated @hapi/[email protected]: Moved to 'npm install @sideway/address'
npm WARN deprecated [email protected]: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
npm WARN deprecated [email protected]: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
npm WARN deprecated @hapi/[email protected]: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated [email protected]: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.

added 1445 packages, and audited 1446 packages in 2m

93 packages are looking for funding
  run `npm fund` for details

50 vulnerabilities (1 low, 18 moderate, 26 high, 5 critical)

To address issues that do not require attention, run:
  npm audit fix

To address all issues (including breaking changes), run:
  npm audit fix --force

Run `npm audit` for details.
npm notice 
npm notice New minor version of npm available! 9.5.0 -> 9.7.2
npm notice Changelog: <https://github.com/npm/cli/releases/tag/v9.7.2>
npm notice Run `npm install -g [email protected]` to update!
npm notice 

> Task :frontend:build

> [email protected] prod-build
> vue-cli-service build --mode production --dest build


-  Building for production...
Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:133:10)
    at module.exports (/home/bernard/project/jifa/frontend/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/home/bernard/project/jifa/frontend/node_modules/webpack/lib/NormalModule.js:417:16)
    at handleParseError (/home/bernard/project/jifa/frontend/node_modules/webpack/lib/NormalModule.js:471:10)
    at /home/bernard/project/jifa/frontend/node_modules/webpack/lib/NormalModule.js:503:5
    at /home/bernard/project/jifa/frontend/node_modules/webpack/lib/NormalModule.js:358:12
    at /home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:373:3
    at iterateNormalLoaders (/home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:214:10)
    at iterateNormalLoaders (/home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:221:10)
    at /home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:236:3
    at runSyncOrAsync (/home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:130:11)
    at iterateNormalLoaders (/home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:232:2)
    at Array.<anonymous> (/home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:205:4)
    at Storage.finished (/home/bernard/project/jifa/frontend/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:55:16)
    at /home/bernard/project/jifa/frontend/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:91:9
Browserslist: caniuse-lite is outdated. Please run:
  npx update-browserslist-db@latest
  Why you should do it regularly: https://github.com/browserslist/update-db#readme
/home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:114
                        throw e;
                        ^

Error: error:0308010C:digital envelope routines::unsupported
    at new Hash (node:internal/crypto/hash:71:19)
    at Object.createHash (node:crypto:133:10)
    at module.exports (/home/bernard/project/jifa/frontend/node_modules/webpack/lib/util/createHash.js:135:53)
    at NormalModule._initBuildHash (/home/bernard/project/jifa/frontend/node_modules/webpack/lib/NormalModule.js:417:16)
    at handleParseError (/home/bernard/project/jifa/frontend/node_modules/webpack/lib/NormalModule.js:471:10)
    at /home/bernard/project/jifa/frontend/node_modules/webpack/lib/NormalModule.js:503:5
    at /home/bernard/project/jifa/frontend/node_modules/webpack/lib/NormalModule.js:358:12
    at /home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:373:3
    at iterateNormalLoaders (/home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:214:10)
    at iterateNormalLoaders (/home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:221:10)
    at /home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:236:3
    at context.callback (/home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:111:13)
    at /home/bernard/project/jifa/frontend/node_modules/cache-loader/dist/index.js:118:7
    at /home/bernard/project/jifa/frontend/node_modules/graceful-fs/graceful-fs.js:61:14
    at FSReqCallback.oncomplete (node:fs:198:23) {
  opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ],
  library: 'digital envelope routines',
  reason: 'unsupported',
  code: 'ERR_OSSL_EVP_UNSUPPORTED'
}

Node.js v18.15.0

> Task :frontend:build FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':frontend:build'.
> Process 'command 'npm'' finished with non-zero exit value 1

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

See https://docs.gradle.org/7.3/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 36m 45s
40 actionable tasks: 39 executed, 1 up-to-date

Ref

  1. https://blog.csdn.net/lojze_ly/article/details/49456255

A brief taste of JIFA_第11张图片

你可能感兴趣的:(java,开发语言)