zoukankan      html  css  js  c++  java
  • JVM 自带线程

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

    代码

    Java代码  收藏代码
    1. package com.cases;  
    2.   
    3. import java.lang.management.GarbageCollectorMXBean;  
    4. import java.lang.management.ManagementFactory;  
    5. import java.lang.management.MemoryMXBean;  
    6. import java.util.List;  
    7. import java.util.Map;  
    8.   
    9. public class Gouzi {  
    10.   
    11.     public static void main(String[] args) {  
    12.         jvmExitHook();  
    13.   
    14.         System.out.println("aaaa");  
    15.         try {  
    16.             Thread.sleep(10000);  
    17.         } catch (InterruptedException e) {  
    18.             e.printStackTrace();  
    19.         }  
    20.   
    21.         System.exit(0);  
    22.     }  
    23.   
    24.     public static void jvmExitHook() {  
    25.         System.out.println("注册JVM Shutdown钩子方法---------");  
    26.         Runtime.getRuntime().addShutdownHook(new Thread() {  
    27.             @Override  
    28.             public void run() {  
    29.                 MemoryMXBean memorymbean = ManagementFactory.getMemoryMXBean();  
    30.                 System.out.println("堆内存信息: " + memorymbean.getHeapMemoryUsage());  
    31.                 System.out.println("非堆内存信息: " + memorymbean.getNonHeapMemoryUsage());  
    32.                 Map<Thread, StackTraceElement[]> map = Thread.getAllStackTraces();  
    33.   
    34.                 List<GarbageCollectorMXBean> list = ManagementFactory.getGarbageCollectorMXBeans();  
    35.                 if (list != null && list.size() > 0) {  
    36.                     for (GarbageCollectorMXBean gcBean : list) {  
    37.                         System.out.println("垃圾收集器:" + gcBean.getName());  
    38.                         System.out.println("gc count:" + gcBean.getCollectionCount());  
    39.                         System.out.println("gc time:" + gcBean.getCollectionTime());  
    40.                         gcBean.getCollectionCount();  
    41.                     }  
    42.                 }  
    43.   
    44.                 for (Thread t : map.keySet()) {  
    45.                     System.out.println("线程名称:" + t.getName() + ",线程堆栈:");  
    46.                     StackTraceElement[] ss = map.get(t);  
    47.                     if (ss != null) {  
    48.                         for (StackTraceElement s : ss) {  
    49.                             System.out.println(s);  
    50.                         }  
    51.                     }  
    52.                 }  
    53.             }  
    54.   
    55.         });  
    56.     }  
    57. }  

    输出结果

    注册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 

  • 相关阅读:
    Play 中如何使用 Ajax
    Play!中使用HTTP异步编程
    Asynchronous Jobs
    Play libs
    JPA persistence
    maven 打包和构建的Linux命令(mvn)
    Istio的流量管理入门-charlieroro编写
    Linux和Docker的Capabilities介绍及Setcap命令
    2020超实用提升英文阅读能力和必备3000单词表
    Cookie什么?Cookie和Session防御怎么做?
  • 原文地址:https://www.cnblogs.com/xm1-ybtk/p/5112199.html
Copyright © 2011-2022 走看看