3年前 (2022-01-24)  Java系列 |   抢沙发  267 
文章评分 0 次,平均分 0.0

 

Java Dumps

Java Dumps是在虚拟机由于网络问题、内存错误或用户启动任何类型的按键组合而意外停止时错误创建的一些Java内核。通过调用合并到应用程序源代码中的Java转储API或通过命令行直接提供-Xdump:Java选项,可以轻松创建Java Dumps。Java Dumps通过提供一些有用的信息来帮助最终用户排除故障,并诊断当应用程序意外停止运行时发生的停止的根本原因。

语法

Java Dumps没有特定的语法,因为JavaDumps的需要取决于问题的根本原因,如前所述,问题的根本原因是多种多样的。因此,当用户需要诊断根本原因并希望通过向JVM发送所需的请求来使用jcmd工具执行分析时,就需要使用此语法流,并且必须在运行时使用用于向机器和Java程序发送此请求的同一系统。因此,语法定义如下:

jcmd <process_ id> GC.heap_dump <pathname_for_file>

其中传递的参数为:

  • <process_id>:用于为java程序正在执行的进程提供id。
  • <pathname_for_file>:文件将传递到的路径的名称,如前所述。

Dumps在Java中是如何工作的?

Java Dumps工作流非常有趣,因为它在机器崩溃或由于各种原因(如网络中断、内存错误等)导致系统意外停止时为最终用户或程序员提供了巨大的帮助。此外,通过使用Java Dumps进行故障排除和根本原因诊断,可以避免妨碍Java程序执行的任何形式的错误。Java中Dumps工作的一些场景如下:

  • Java应用程序可能由于一般保护故障而崩溃并自动生成Java Dumps文件的场景。要克服并理解根本原因,非常需要了解线程类型或正确了解当前执行的线程,以便轻松识别问题。
  • 另一种情况可能是由于Java堆内存不足,这也会自动生成Java Dumps。
  • 这种情况可能是因为死锁情况,即所有线程都以同时获取同一线程作为资源为目标。
  • 也可能出现突然挂起的情况,用户可能已经运行了击键组合。
  • 有几种方法可以解决上述情况,这意味着找到根本原因并捕获异常,其中包括许多Java转储工具,这些工具为最终用户提供了在发生即时崩溃或任何其他不太受欢迎的情况(如暂停或OutOfMemory事件)时进行调试和故障排除的方便性和灵活性。

通过使用Java Dumps工具和技术,有不同的方法来捕获所有场景及其根本原因。它们在解决与内存泄漏相关的问题和内存优化问题时非常有用。它们大多以二进制格式Dumps在hprof文件中,可使用以下工具和技术进行可视化和分析,如:

  • 通过向工具提供适当的进程Id和文件路径合并,使用jmap等JDK工具。
  • 当JVM中的同一台机器用于头转储以读取根本原因和确认时,负责发出请求和响应的jcmd将为JVM提供服务。
  • JVisualVM也是JDK的一部分,它用于增强java转储,并为轻松检查java转储提供帮助。
  • 也可以通过编程自动捕获转储,然后相应地获得输出。

Java Dumps示例

这个例子演示了线程在资源上执行死锁,现在他们已经获得了资源上的锁,有可能使用命令行中的命令分析带有Java Dumps的资源上的死锁。

public class Java_lock_Dump_Demo {
public static void main(String[] args) throws InterruptedException {
Object ob_a = new Object();
Object ob_b = new Object();
Object ob_c = new Object();
Thread Java_lock_Dump_DemoThread1 = new Thread (new       Java_lock_Dump_Demo_Sync_Thread(ob_a, ob_b ), "Java_lock_Dump_DemoThread1");
Thread Java_lock_Dump_DemoThread2 = new Thread (new Java_lock_Dump_Demo_Sync_Thread(ob_b, ob_c ), "Java_lock_Dump_DemoThread2");
Thread Java_lock_Dump_DemoThread3 = new Thread (new Java_lock_Dump_Demo_Sync_Thread(ob_c, ob_a ), "Java_lock_Dump_DemoThread3");
Java_lock_Dump_DemoThread1.start();
Thread.sleep(3000);
Java_lock_Dump_DemoThread2.start();
Thread.sleep(3000);
Java_lock_Dump_DemoThread3.start();
}
}
class Java_lock_Dump_Demo_Sync_Thread implements Runnable {
private Object ob_a;
private Object ob_b;
public Java_lock_Dump_Demo_Sync_Thread(Object ob_a, Object ob_b) {
this.ob_a = ob_a;
this.ob_b = ob_b;
}
@Override
public void run() {
String nm = Thread.currentThread().getName();
synchronized (ob_a) {
System.out.println(nm + " acquire_the_lock_on_first_resource " + ob_a);
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (ob_b) {
System.out.println(nm + " acquire_the_lock_on_second_resource " + ob_b);
}
System.out.println(nm + " Release_the_lock_for_second_object " + ob_b);
}
System.out.println(nm + " Release_the_lock_for_first_object " + ob_a);
System.out.println(nm + " Completed with the deadlock_test for acquiring the resource.");
}
}

输出:

Java Dumps

如何获取上述编译代码的转储可以使用以下命令完成:

  • 首先,在命令行中使用以下命令检索进程id:jsp
  • 然后,在获取进程id后,在命令行中运行以下命令:
Jcmd<Process_id> GC.heap_dump <file-path>
jcmd 20528 GC.heap_dump C:\Users\adutta\eclipse-workspace\Matcher_Example\src

结论

Java Dumps在Java中被认为是一个非常有趣的特性,因为它为程序员和用户提供了在运行程序停止时以及机器内存不足时摆脱不需要的和意外情况的能力。它还为用户提供了有关根本原因或故障排除问题的详细和适当的内容。

 

除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/2563.html

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册