A brief taste of JIFA

news/2024/10/18 5:41:27/

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

在这里插入图片描述

Heap Dump Analysis

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

GC Log

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

在这里插入图片描述

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 DumpSystem.out.println(generateThreadDump());}// 生成Thread Dumpprivate 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 ThreadThread: Thread-4app//ThreadDump.lambda$0(ThreadDump.java:8)app//ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)java.base@17.0.8/java.lang.Thread.run(Thread.java:833)Thread: Signal DispatcherThread: Finalizerjava.base@17.0.8/java.lang.Object.wait(Native Method)java.base@17.0.8/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)java.base@17.0.8/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:176)java.base@17.0.8/java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:172)Thread: Thread-3app//ThreadDump.lambda$0(ThreadDump.java:8)app//ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)java.base@17.0.8/java.lang.Thread.run(Thread.java:833)Thread: Common-Cleanerjava.base@17.0.8/java.lang.Object.wait(Native Method)java.base@17.0.8/java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:155)java.base@17.0.8/jdk.internal.ref.CleanerImpl.run(CleanerImpl.java:140)java.base@17.0.8/java.lang.Thread.run(Thread.java:833)java.base@17.0.8/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:162)Thread: Thread-0app//ThreadDump.lambda$0(ThreadDump.java:8)app//ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)java.base@17.0.8/java.lang.Thread.run(Thread.java:833)Thread: Thread-1app//ThreadDump.lambda$0(ThreadDump.java:8)app//ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)java.base@17.0.8/java.lang.Thread.run(Thread.java:833)Thread: mainjava.base@17.0.8/java.lang.Thread.dumpThreads(Native Method)java.base@17.0.8/java.lang.Thread.getAllStackTraces(Thread.java:1662)app//ThreadDump.generateThreadDump(ThreadDump.java:28)app//ThreadDump.main(ThreadDump.java:22)Thread: Thread-2app//ThreadDump.lambda$0(ThreadDump.java:8)app//ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)java.base@17.0.8/java.lang.Thread.run(Thread.java:833)Thread: Reference Handlerjava.base@17.0.8/java.lang.ref.Reference.waitForReferencePendingList(Native Method)java.base@17.0.8/java.lang.ref.Reference.processPendingReferences(Reference.java:253)java.base@17.0.8/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: RUNNABLEat java.lang.ref.Reference.waitForReferencePendingList(java.base@17.0.8/Native Method)at java.lang.ref.Reference.processPendingReferences(java.base@17.0.8/Reference.java:253)at java.lang.ref.Reference$ReferenceHandler.run(java.base@17.0.8/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(java.base@17.0.8/Native Method)- waiting on <0x000000009b302f40> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(java.base@17.0.8/ReferenceQueue.java:155)- locked <0x000000009b302f40> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(java.base@17.0.8/ReferenceQueue.java:176)at java.lang.ref.Finalizer$FinalizerThread.run(java.base@17.0.8/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: RUNNABLENo 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: RUNNABLENo 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(java.base@17.0.8/Native Method)- waiting on <0x000000009b3180b8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(java.base@17.0.8/ReferenceQueue.java:155)- locked <0x000000009b3180b8> (a java.lang.ref.ReferenceQueue$Lock)at jdk.internal.ref.CleanerImpl.run(java.base@17.0.8/CleanerImpl.java:140)at java.lang.Thread.run(java.base@17.0.8/Thread.java:833)at jdk.internal.misc.InnocuousThread.run(java.base@17.0.8/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: RUNNABLEat ThreadDump.lambda$0(ThreadDump.java:8)at ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)at java.lang.Thread.run(java.base@17.0.8/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: RUNNABLEat ThreadDump.lambda$0(ThreadDump.java:8)at ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)at java.lang.Thread.run(java.base@17.0.8/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: RUNNABLEat ThreadDump.lambda$0(ThreadDump.java:8)at ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)at java.lang.Thread.run(java.base@17.0.8/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: RUNNABLEat ThreadDump.lambda$0(ThreadDump.java:8)at ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)at java.lang.Thread.run(java.base@17.0.8/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: RUNNABLEat ThreadDump.lambda$0(ThreadDump.java:8)at ThreadDump$$Lambda$1/0x0000000801000a08.run(Unknown Source)at java.lang.Thread.run(java.base@17.0.8/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: 0Heapgarbage-first heap   total 112640K, used 2016K [0x0000000094800000, 0x0000000100000000)region size 1024K, 1 young (1024K), 0 survivors (0K)Metaspace       used 142K, committed 384K, reserved 1114112Kclass 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(java.base@17.0.8/Native Method)- waiting on <0x000000009b3180b8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(java.base@17.0.8/ReferenceQueue.java:155)- locked <0x000000009b3180b8> (a java.lang.ref.ReferenceQueue$Lock)at jdk.internal.ref.CleanerImpl.run(java.base@17.0.8/CleanerImpl.java:140)at java.lang.Thread.run(java.base@17.0.8/Thread.java:833)at jdk.internal.misc.InnocuousThread.run(java.base@17.0.8/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(java.base@17.0.8/Native Method):这行代码表明线程调用了
Object.wait() 方法进行等待。wait() 方法是Java中的一个同步方法,用于使线程进入等待状态,直到其他线程唤醒它。

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

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

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

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

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

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

在这里插入图片描述

踩过的坑

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 3For more details see https://docs.gradle.org/7.3/release-notes.htmlStarting 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.orgBUILD 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: echarts-liquidfill@2.0.6
npm WARN Found: echarts@5.3.3
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 echarts-liquidfill@2.0.6
npm WARN node_modules/v-charts/node_modules/echarts-liquidfill
npm WARN   echarts-liquidfill@"^2.0.2" from v-charts@1.19.0
npm WARN   node_modules/v-charts
npm WARN 
npm WARN Conflicting peer dependency: echarts@4.9.0
npm WARN node_modules/echarts
npm WARN   peer echarts@"^4.8.0" from echarts-liquidfill@2.0.6
npm WARN   node_modules/v-charts/node_modules/echarts-liquidfill
npm WARN     echarts-liquidfill@"^2.0.2" from v-charts@1.19.0
npm WARN     node_modules/v-charts
npm WARN deprecated urix@0.1.0: Please see https://github.com/lydell/urix#deprecated
npm WARN deprecated uuid@3.4.0: 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 stable@0.1.8: 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 source-map-resolve@0.5.3: See https://github.com/lydell/source-map-resolve#deprecated
npm WARN deprecated svgo@1.3.2: This SVGO version is no longer supported. Upgrade to v2.x.x.
npm WARN deprecated source-map-url@0.4.1: See https://github.com/lydell/source-map-url#deprecated
npm WARN deprecated request-promise-native@1.0.9: 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 request@2.88.2: request has been deprecated, see https://github.com/request/request/issues/3142
npm WARN deprecated resolve-url@0.2.1: https://github.com/lydell/resolve-url#deprecated
npm WARN deprecated querystring@0.2.0: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
npm WARN deprecated popper.js@1.16.1: You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1
npm WARN deprecated html-webpack-plugin@3.2.0: 3.x is no longer supported
npm WARN deprecated har-validator@5.1.5: this library is no longer supported
npm WARN deprecated eslint-loader@2.2.1: This loader has been deprecated. Please use eslint-webpack-plugin
npm WARN deprecated circular-json@0.3.3: CircularJSON is in maintenance only, flatted is its successor.
npm WARN deprecated babel-eslint@10.1.0: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates.
npm WARN deprecated @hapi/topo@3.1.6: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/hoek@8.5.1: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated @hapi/joi@15.1.1: Switch to 'npm install joi'
npm WARN deprecated @hapi/address@2.1.4: Moved to 'npm install @sideway/address'
npm WARN deprecated chokidar@2.1.8: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
npm WARN deprecated chokidar@2.1.8: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
npm WARN deprecated @hapi/bourne@1.3.2: This version has been deprecated and is no longer supported or maintained
npm WARN deprecated core-js@2.6.12: 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 2m93 packages are looking for fundingrun `npm fund` for details50 vulnerabilities (1 low, 18 moderate, 26 high, 5 critical)To address issues that do not require attention, run:npm audit fixTo address all issues (including breaking changes), run:npm audit fix --forceRun `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 npm@9.7.2` to update!
npm notice > Task :frontend:build> jifa@0.2.0-SNAPSHOT prod-build
> vue-cli-service build --mode production --dest build-  Building for production...
Error: error:0308010C:digital envelope routines::unsupportedat 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:5at /home/bernard/project/jifa/frontend/node_modules/webpack/lib/NormalModule.js:358:12at /home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:373:3at 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:3at 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@latestWhy you should do it regularly: https://github.com/browserslist/update-db#readme
/home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:114throw e;^Error: error:0308010C:digital envelope routines::unsupportedat 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:5at /home/bernard/project/jifa/frontend/node_modules/webpack/lib/NormalModule.js:358:12at /home/bernard/project/jifa/frontend/node_modules/loader-runner/lib/LoaderRunner.js:373:3at 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:3at 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:7at /home/bernard/project/jifa/frontend/node_modules/graceful-fs/graceful-fs.js:61:14at 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 FAILEDFAILURE: 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.orgDeprecated 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_warningsBUILD FAILED in 36m 45s
40 actionable tasks: 39 executed, 1 up-to-date

Ref

在这里插入图片描述


http://www.ppmy.cn/news/534940.html

相关文章

百度微博视频排名群发(代做代发布群发做排名)软件使用太简单了

百度微博视频排名群发(代做代发布群发做排名)软件使用太简单了&#xff0c;百度排名有些行业还是值得做的。#创业 #职场 #人脉 微信创作者 微信视频号创造营 微信时刻 当我们网站出现了一些收录的问题&#xff0c;我们该怎么处理&#xff1f;网站收录是什么&#xff1f;就是搜索…

什么是固态硬盘,固态硬盘(SSD)的工作原理是什么

所有计算机都需要一种方法来存储、检索和共享数字信息&#xff0c;这通常是通过硬盘驱动器完成的。硬盘驱动器使用一个或多个快速旋转的磁盘或涂有磁性材料的盘片磁性存储数据。最早的硬盘非常大而且非常昂贵。 目前&#xff0c;有两种主要类型的驱动器用于存储数据&#xff1…

机械硬盘的存储结构及原理

硬盘是电脑主要的存储媒介之一。根据硬盘的读写方式和存储方式不同&#xff0c;当前主流的硬盘可以分为固态硬盘&#xff08;SSD硬盘&#xff09;、机械硬盘&#xff08;HDD 硬盘&#xff09;两种。由于固态硬盘存在价格昂贵、容量较小和一旦损坏难以修复等特点&#xff0c;当前…

硬盘存储原理

一、序 上篇文章只是引子&#xff0c;本系列文章想深入的是硬盘的存储原理。 磁存储技术包含硬盘&#xff0c;软盘和磁带等。软盘基本上谈出人们的视野了&#xff0c;磁带只是在 服务器存储备份上有所作用&#xff0c;平常最为常见的便是硬盘。不过硬盘和软盘的原理倒是 比较相…

硬盘构造及其工作原理

一、硬盘原理之硬盘的组成 硬盘大家一定不会陌生&#xff0c;我们可以把它比喻成是我们电脑储存数据和信息 的大仓库。一般说来&#xff0c;无论哪种硬盘&#xff0c;都是由盘片、磁头、盘片主轴、 控制电机、磁头控制器、数据转换器、接口、缓存等几个部份组成。 …

硬件(磁盘):机械硬盘内部硬件结构和工作原理详解

从理解磁盘IO开始 主轴让磁盘盘片转动&#xff0c;然后传动手臂可伸展让读取头在盘片上进行读写操作。每个盘片有两面&#xff0c;都可记录信息&#xff0c;所以一张盘片对应着两个磁头。 磁盘物理结构如下图: 硬盘的外部物理结构 一般硬盘正面贴有产品标签&#xff0c;主要…

硬盘的种类及运行原理

硬盘的种类可分为&#xff1a; 1、固态硬盘&#xff08;SSD&#xff09;&#xff0c;采用闪存颗粒来储存&#xff1b; 2、机械硬盘&#xff08;HDD&#xff09;&#xff0c;采用磁性碟片来储存&#xff1b; 3、混合硬盘&#xff08;HHD&#xff09;&#xff0c;是把磁性硬盘和闪…

磁盘存储原理

最近学习linux内核源码&#xff0c;读到操作系统boot引导相关内容时&#xff0c;对于磁盘相关原理介绍引起我的兴趣。阅读相关资料后&#xff0c;对磁盘工作原理做一个总结&#xff0c;参考资料为深入理解计算机系统&#xff08;CSAPP)。 磁盘是广泛应用的数据存储设备&#x…