>  기사  >  Java  >  자바 스레드 덤프

자바 스레드 덤프

WBOY
WBOY원래의
2024-08-30 16:03:051100검색

Java 스레드 덤프는 스택 메모리에 있는 모든 실시간 처리 스레드의 덤프로 정의됩니다. 이는 스파이크, 교착 상태, 메모리 문제, 일부 기본 오류 코드가 있는 응답하지 않는 애플리케이션, 요청 및 응답 시간이 부족한 응답하지 않는 애플리케이션, 그리고 일부 다른 시스템 관련 문제도 계산되어 스레드와 관련된 경우와 같은 CPU 사용량을 진단하는 아티팩트에서 중요한 역할이 될 수 있습니다. 애플리케이션 서버를 기반으로 하는 덤프 메시지는 server-config 파일로 구성되며 주로 1개 이상의 스레드 덤프와 JVM에서 정기적으로 사용되는 최소 10개의 덤프 스레드에 권장됩니다.

무료 소프트웨어 개발 과정 시작

웹 개발, 프로그래밍 언어, 소프트웨어 테스팅 등

구문

Java 프로그래밍 언어를 사용하면 보다 정교한 웹 애플리케이션을 만드는 데 사용되는 기본 클래스와 메서드를 가질 수 있습니다. 여기에서는 여기에 있는 도구를 사용하여 스레드 덤프를 분석합니다. Java 스레드 덤프의 기본 구문은 다음과 같습니다.

class className
{
public static void main(String[] args) throws Exception
{
Object o = new Object();
Object o1= new Object();
Thread t=new Thread(new DeadLockRunnable(o,o1));
t.sleep();
--some java code logics---
}
}

위 코드는 교착 상태 등의 개념을 사용하여 스택 메모리에 스레드 덤프를 생성하기 위한 기본 구문입니다. 또한 DeadLockRunnable, ManagementFactory.getThreadMXBean()과 같은 일부 기본 메서드를 사용할 수 있습니다. 프로그래밍 스택에서 스레드 덤프를 달성하는 몇 가지 방법은 다음과 같습니다.

Java에서 스레드 덤프는 어떻게 작동하나요?

Java 애플리케이션에서는 브라우저와 데스크탑 모두에서 애플리케이션을 실행하기 위해 웹 서버와 애플리케이션 서버를 사용했습니다(독립형 애플리케이션인 경우). 웹 서버로 인해 우리는 수많은 동시 사용자를 처리하기 위해 수십에서 수백 개의 스레드에 액세스하는 데 사용했습니다. 두 명 이상의 사용자가 애플리케이션에 액세스한다고 가정하면, 즉 두 명 이상의 사용자가 동일한 리소스에 동시에 액세스하면 두 스레드 간의 경합은 불가피하며 때로는 교착 상태가 발생하기도 합니다. 웹서버를 기반으로 스레드 덤프는 다음과 같이 구성됩니다. Apache Tomcat은 구성 파일을 열면 /logs/Catalina.out 파일과 같은 옵션을 사용하여 스레드 덤프를 구성합니다. 애플리케이션 서버는 스택 추적에서 오류와 예외를 발생시킵니다.

스레드 덤프에는 애플리케이션 사용자가 살아 있는지 여부를 표시하는 다양한 상태가 있으며, Keep-Alive-Timer도 스레드 이름입니다. 이는 살아있는 http 스레드를 위한 KeepAliveCache 스레드를 생성하는 데 사용되어야 합니다. 스레드 유사 데몬 이후에 시작된 이후 JVM을 사용하여 생성된 모든 스레드는 마지막 실행 스레드의 JVM이 머신과 애플리케이션 모두에서 종료되는 것을 방지할 수 없음을 의미합니다.

Runnable, Waiting/Timed_waiting 및 Blocked와 같은 가장 중요한 스레드 상태는 애플리케이션이나 프로세스가 멀티스레딩에 있으므로 스레드가 생성될 때마다 스레드를 차단하고 기다리는 데 사용되는 일부 상태입니다. 스레드를 실행하는 스레드가 실행 가능 모드인 경우 os 스레드 우선 순위를 포함하여 스레드 우선 순위와 관련된 여러 메타데이터가 자동으로 Runnable 인터페이스로 이동합니다. 완료 후 앱이 멀티 스레딩에 있는 경우 스레드를 차단하는 데 차단 상태가 사용됩니다. 한 스레드는 다른 스레드가 잠긴 상태가 될 때까지 수행되므로 동기화된 스레드 블록 등과 같은 개념의 도움으로 이러한 개념과 해당 인스턴스를 사용하여 달성되었습니다. 대기 상태는 스레드 대기 시간이 계산되어 이 상태에서 작업하기를 기다리고 있던 스레드 풀이라는 스레드 메모리에 저장되어 있는 것입니다.

Java 스레드 덤프의 예

아래에는 다양한 예가 나와 있습니다.

예시 #1

코드:

package com.first;
import java.net.ServerSocket;
import java.net.Socket;
public class Example {
public void run()
{
System.out.println("Multithreads names are : " + Thread.currentThread().getName());
}
public static void main(String[] args) throws Exception {
long waitingtimethread = 2000 * 30 * 2;
long startingthread = System.currentTimeMillis();
Thread t = new Thread();
t.start();
Thread.sleep(300);
t.run();
try (
ServerSocket s = new ServerSocket(3000);
Socket s1 = s.accept()
) {
Thread t1 = new Thread();
t1.start();
while (t1.isAlive()) {
if (demo(startingthread, waitingtimethread, t1)) {
t1.interrupt();
t1.join();
}
}
} catch (Exception e) {
System.err.println("The Excetion will be captured here."+e);
}
System.out.println("Multithreads names are : " + Thread.currentThread().getName());
System.out.println("We can check the daemon thread is used or not: "
+ Thread.currentThread().isDaemon());
}
static boolean demo(long startingthread, long waitingtimethread, Thread t1) {
return ((System.currentTimeMillis() - startingthread) > waitingtimethread) && t1.isAlive();
}
}

출력:

자바 스레드 덤프

예시 #2

코드:

package com.first;
import java.net.ServerSocket;
import java.net.Socket;
public class Example {
static boolean demo(long startingthread, long waitingtimethread, Thread t1) {
return ((System.currentTimeMillis() - startingthread) > waitingtimethread) && t1.isAlive();
}
public static void main(String[] args) throws Exception {
long waitingtimethread = 2000 * 30 * 2;
long startingthread = System.currentTimeMillis();
Thread t = new Thread();
Thread t2 = new Thread();
t.start();
Thread.sleep(300);
t.run();
try (
ServerSocket s = new ServerSocket(3000);
Socket s1 = s.accept()
) {
Thread t1 = new Thread();
t1.start();
while (t1.isAlive()) {
if (demo(startingthread, waitingtimethread, t1)) {
t1.interrupt();
t1.join();
t1.notifyAll();
t2.notify();
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Multithreads names are : " + Thread.currentThread().getName());
}
}

출력:

자바 스레드 덤프

예시 #3

코드:

package com.first;
public class Example extends Thread {
public void run()
{
System.out.println("Multithreads names are : " + Thread.currentThread().getName());
System.out.println("We can check the daemon thread is used or not: "
+ Thread.currentThread().isDaemon());
}
public static void main(String[] args)
{
Example e1 = new Example();
Example e2 = new Example();
e1.start();
e1.setDaemon(true);
e2.start();
}
}

출력:

자바 스레드 덤프

위의 세 가지 예에서는 스레드 덤프 개념에 대해 서로 다른 시나리오를 사용했습니다. 또한 우리는 inform(), Timed_Waiting(), sleep()과 같은 다양한 유형의 내장 스레드 메소드를 사용했습니다. 이러한 동시 정적 메소드는 java.

에서 여러 스레드의 덤프를 달성합니다.

결론

일반적으로 스레드 덤프는 자세한 분석 보고서를 얻기 위한 Java 기반 웹 애플리케이션의 유용한 메커니즘입니다. 여기에는 직접 또는 간접적으로 애플리케이션에 액세스하는 여러 사용자가 포함됩니다. 이러한 프로세스는 중단을 해결하고 애플리케이션 성능을 높이는 데 도움이 될 것입니다.

위 내용은 자바 스레드 덤프의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.