`
supben
  • 浏览: 330890 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JVM 自带线程

    博客分类:
  • JVM
 
阅读更多

一个JVM 启动之后,自己会启动一些线程。我们在jstack的时候可以排除掉这些。只关注我们自己业务产生的线程

代码

package com.cases;

import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.util.List;
import java.util.Map;

public class Gouzi {

	public static void main(String[] args) {
		jvmExitHook();

		System.out.println("aaaa");
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		System.exit(0);
	}

	public static void jvmExitHook() {
		System.out.println("注册JVM Shutdown钩子方法---------");
		Runtime.getRuntime().addShutdownHook(new Thread() {
			@Override
			public void run() {
				MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();
				System.out.println("堆内存信息: " + memorymbean.getHeapMemoryUsage());
				System.out.println("非堆内存信息: " + memorymbean.getNonHeapMemoryUsage());
				Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();

				List<GarbageCollectorMXBean> list = ManagementFactory.getGarbageCollectorMXBeans();
				if (list != null && list.size() > 0) {
					for (GarbageCollectorMXBean gcBean : list) {
						System.out.println("垃圾收集器:" + gcBean.getName());
						System.out.println("gc count:" + gcBean.getCollectionCount());
						System.out.println("gc time:" + gcBean.getCollectionTime());
						gcBean.getCollectionCount();
					}
				}

				for (Thread t : map.keySet()) {
					System.out.println("线程名称:" + t.getName() + ",线程堆栈:");
					StackTraceElement[] ss = map.get(t);
					if (ss != null) {
						for (StackTraceElement s : ss) {
							System.out.println(s);
						}
					}
				}
			}

		});
	}
}

 

 

输出结果

 

注册JVM Shutdown钩子方法---------

aaaa

内存信息: init = 16777216(16384K) used = 560368(547K) committed = 16252928(15872K) max = 259522560(253440K)

未使用内存信息: init = 35815424(34976K) used = 13675040(13354K) committed = 36110336(35264K) max = 123731968(120832K)

垃圾收集器:Copy

gc count:0

gc time:0

垃圾收集器:MarkSweepCompact

gc count:0

gc time:0

线程名称:Attach Listener,线程堆栈:

线程名称:Finalizer,线程堆栈:

java.lang.Object.wait(Native Method)

java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)

java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)

java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)

线程名称:Signal Dispatcher,线程堆栈:

线程名称:Reference Handler,线程堆栈:

java.lang.Object.wait(Native Method)

java.lang.Object.wait(Object.java:485)

java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)

线程名称:Thread-0,线程堆栈:

java.lang.Thread.dumpThreads(Native Method)

java.lang.Thread.getAllStackTraces(Thread.java:1530)

com.cases.Gouzi$1.run(Gouzi.java:32)

线程名称:main,线程堆栈:

java.lang.Object.wait(Native Method)

java.lang.Thread.join(Thread.java:1186)

java.lang.Thread.join(Thread.java:1239)

java.lang.ApplicationShutdownHooks.runHooks(ApplicationShutdownHooks.java:79)

java.lang.ApplicationShutdownHooks$1.run(ApplicationShutdownHooks.java:24)

java.lang.Shutdown.runHooks(Shutdown.java:79)

java.lang.Shutdown.sequence(Shutdown.java:123)

java.lang.Shutdown.exit(Shutdown.java:168)

java.lang.Runtime.exit(Runtime.java:90)

java.lang.System.exit(System.java:904)

com.cases.Gouzi.main(Gouzi.java:21)

 

上边main线程和Thread-0是我启动的

 

Attach Listener

Finalizer

Signal Dispatcher

Reference Handler

是JVM 启动的

 

下边做一个解释:

 

Attach Listener :线程是负责接收到外部的命令,而对该命令进行执行的并且吧结果返回给发送者。通常我们会用一些命令去要求jvm给我们一些反馈信息,如:java -version、jmap、jstack等等。如果该线程在jvm启动的时候没有初始化,那么,则会在用户第一次执行jvm命令时,得到启动。

 

signal dispather: 前面我们提到第一个Attach Listener线程的职责是接收外部jvm命令,当命令接收成功后,会交给signal dispather线程去进行分发到各个不同的模块处理命令,并且返回处理结果。signal dispather线程也是在第一次接收外部jvm命令时,进行初始化工作。

 

Finalizer:  用来执行所有用户Finalizer 方法的线程

 

Reference Handler :它主要用于处理引用对象本身(软引用、弱引用、虚引用)的垃圾回收问题。

 

 

在一些其他场景Jvm会启动更多的线程,可以参考:http://club.alibabatech.org/article_detail.htm?articleId=4 

0
2
分享到:
评论

相关推荐

    vmmap 观察jvm内存 监控jvm jvm线程

    - `jcmd`是JDK自带的命令行工具,可以获取各种JVM信息,包括内存和线程快照。 通过熟练使用`vmmap`以及结合其他JVM监控工具,开发者可以有效地进行问题定位,优化应用性能,确保JVM健康运行。记住,理解JVM内存...

    深入JVM内核—原理、诊断与优化视频教程-3.常用JVM配置参数

    此外,JDK自带的JMX(Java Management Extensions)和JVM命令行工具(如jstat、jmap、jhat)也是进行性能诊断的重要手段。 在优化方面,JVM配置参数起着决定性作用。例如,“-Xms”和“-Xmx”用于设置堆内存的初始...

    监测JVM各项性能指标

    JVM自带了一些工具,可以帮助我们监控内存使用、网络状况以及其它关键性能数据。下面将详细讨论这些知识点。 1. **JVM监控工具** - **jconsole**:Java可视化监控工具,可以显示JVM的内存、线程、类装载、Garbage ...

    【JAVA WEB实用技巧与优化方案】如何排查JVM线程和内存相关问题

    在Java Web开发中,性能优化和问题排查是关键任务,特别是涉及到JVM(Java Virtual Machine)线程和内存的问题。本文将深入探讨如何利用“javacore”分析工具以及IBM Thread and Monitor Dump Analyzer来有效诊断和...

    idea插件JVM内存工具JProfiler11

    5. **JVM配置调整**:JProfiler11还可以提供JVM参数建议,帮助开发者正确设置JVM初始堆大小、最大堆大小、内存池等关键参数,确保应用程序稳定运行。 在实际使用中,JProfiler11的详细报告和可视化界面使得问题定位...

    JVM调优工具命令详解.pdf

    利用JPS获取进程ID后,便可以通过JVM自带的jmap命令来进一步分析进程内存使用情况。jmap命令能够帮助开发者查看内存信息、实例个数以及占用内存的大小。具体使用方法如下: 1. jmap -histo &lt;pid&gt;:此命令可以查看...

    多线程、JVM复习&面试&强化训练100题

    多线程和JVM是Java编程中非常重要的概念,特别是对于进行面试准备的开发者来说,掌握这些知识至关重要。本篇内容将对多线程和JVM的相关知识点进行详细阐述,帮助开发者在面试中更有信心。 首先,多线程是Java中实现...

    JVM监控工具使用入门

    本文将详细介绍JDK自带的一些强大的JVM监控工具,包括jconsole、jvisualvm以及Oracle JRockit Mission Control (JRMc),并指导如何利用这些工具进行本地和远程JVM监控。 #### 监控工具介绍 ##### jconsole ...

    JVM 监控 调优 工具

    1. **JConsole**:这是Java SDK自带的一个图形化监控工具,可以查看JVM的内存使用情况、线程状态、类加载情况等。 2. **VisualVM**:功能更为强大的多合一JVM分析工具,提供CPU和内存分析、线程快照、方法Profiling...

    深入jvm 内核-原理,诊断于优化视频教程

    JConsole也是JDK自带的一款监控工具,它可以显示运行时的各种统计数据,如类装载信息、内存使用情况、线程信息等,并且支持远程连接进行监控。 **4.3 jstat** jstat是一个命令行工具,用于收集JVM的实时性能数据,...

    JVM crash 错误日志分析

    1. **JDK自带的`jstack`工具**:用于查看JVM的线程堆栈信息,帮助定位死锁或阻塞线程。 2. **`jmap`工具**:可以输出堆内存的详细信息,包括对象分布、内存区域大小等,辅助分析内存泄漏。 3. **`jhat`或`VisualVM`*...

    java基础之JVM

    1. **启动类加载器**(Bootstrap ClassLoader):负责加载JDK自带的类库,如`rt.jar`,位于`JAVA_HOME/jre/lib`目录下。 2. **扩展类加载器**(Extension ClassLoader):负责加载扩展目录下的类库,如`JAVA_HOME/...

    JVM调优工具分享

    它基于JMX(Java Management Extensions),提供了图形用户界面来监控JVM中的内存、线程和类等状态。要启动JConsole,只需在JDK的bin目录下运行jconsole.exe。通过JConsole,你可以连接到本地或远程的Java服务进行...

    jvm瓶颈定位 java jvm 学习

    - JConsole:Java自带的图形化监控工具,可以查看JVM的内存、线程、类加载等信息。 - VisualVM:强大的多合一工具,提供了更详细的性能分析和故障排查功能。 - JProfiler:商业性能分析工具,提供CPU、内存、线程...

    jvisualvm来JVM监控

    jvisualvm,作为Oracle JDK自带的一款强大的性能分析工具,提供了丰富的功能,帮助开发者深入了解JVM内部运行状态,进行性能瓶颈的定位和优化。本文将深入探讨如何使用jvisualvm进行JVM监控,并结合实例解析优化策略...

    JVM 高级特性 (kindle版本)

    5. **线程与并发**:JVM中的线程创建、同步、锁机制和并发工具(如CountDownLatch、CyclicBarrier、Semaphore)都是开发者需要掌握的重点。理解线程池的工作原理和最佳实践,能有效控制系统资源的使用。 6. **性能...

    jvm内存参数调优

    **Bootstrap**:JVM自带的jar或zip文件。 2. **Extension**:位于`JRE_HOME/lib/ext`目录下的jar文件。 3. **User**:当前路径`.`、CLASSPATH、-classpath。 - **示例**:`-classpath .;C:\mylib\lib1.jar;C:\...

    JVM性能调优经典教程

    6. **监控与诊断工具**:JDK自带的JConsole、VisualVM、JProfiler等工具可以帮助我们实时监控JVM状态,分析CPU、内存、线程等问题,找出性能瓶颈。 7. **JVM内存泄漏检测**:学习如何识别和处理内存泄漏问题,了解...

Global site tag (gtag.js) - Google Analytics