Java自学之路—JVM中的守护线程

137 阅读2分钟

「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战

Hope is a good thing, maybe the best of things. And no good thing ever dies—— 《The Shawshank Redemption》

前言

Java 本身的概念还是比较多的,所以学习的开始还是要先打好基础,从一些基本的概念入手,这些都是Java的一些常识。在Java的面试中都是很重要的东西。

上一篇文章,我们学到了 daemon (守护线程),今天我们就来说一说 JVM中的守护线程。

JVM中的守护线程

Java程序在每一次启动主线程的时候,都会启动一些守护线程,Java本身也就是多线程的。

  • 线程的静态方法 getAllStackTraces()
/**
 * Returns a map of stack traces for all live threads.
 * The map keys are threads and each map value is an array of
 * <tt>StackTraceElement</tt> that represents the stack dump
 * of the corresponding <tt>Thread</tt>.
 * The returned stack traces are in the format specified for
 * the {@link #getStackTrace getStackTrace} method.
 *
 * <p>The threads may be executing while this method is called.
 * The stack trace of each thread only represents a snapshot and
 * each stack trace may be obtained at different time.  A zero-length
 * array will be returned in the map value if the virtual machine has
 * no stack trace information about a thread.
 *
 * <p>If there is a security manager, then the security manager's
 * <tt>checkPermission</tt> method is called with a
 * <tt>RuntimePermission("getStackTrace")</tt> permission as well as
 * <tt>RuntimePermission("modifyThreadGroup")</tt> permission
 * to see if it is ok to get the stack trace of all threads.
 *
 * @return a <tt>Map</tt> from <tt>Thread</tt> to an array of
 * <tt>StackTraceElement</tt> that represents the stack trace of
 * the corresponding thread.
 *
 * @throws SecurityException
 *        if a security manager exists and its
 *        <tt>checkPermission</tt> method doesn't allow
 *        getting the stack trace of thread.
 * @see #getStackTrace
 * @see SecurityManager#checkPermission
 * @see RuntimePermission
 * @see Throwable#getStackTrace
 *
 * @since 1.5
 */
public static Map<Thread, StackTraceElement[]> getAllStackTraces() {
    // check for getStackTrace permission
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkPermission(
            SecurityConstants.GET_STACK_TRACE_PERMISSION);
        security.checkPermission(
            SecurityConstants.MODIFY_THREADGROUP_PERMISSION);
    }

    // Get a snapshot of the list of all threads
    Thread[] threads = getThreads();
    StackTraceElement[][] traces = dumpThreads(threads);
    Map<Thread, StackTraceElement[]> m = new HashMap<>(threads.length);
    for (int i = 0; i < threads.length; i++) {
        StackTraceElement[] stackTrace = traces[i];
        if (stackTrace != null) {
            m.put(threads[i], stackTrace);
        }
        // else terminated so we don't put it in the map
    }
    return m;
}

我们可以看一段简单的代码去看一下主线程中还有哪些守护线程会被启动。

package start;

import java.util.Set;

public class DaemonThreadsInJVN  {
    public static void main(String[] args) {
        // 获取当前虚拟机中所有线程的相关信息
        Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
        for (Thread thread : threadSet) {
            System.out.println(thread.getName() + ": "+ thread.getPriority() + "-" + thread.isDaemon());
        }
    }
}

线程的守护线程:

  • Attach Listener : 5-true 获取当前运行程序的信息,线程栈、内存映象、系统属性
  • Common-Cleaner : 8-true
    JDK9的新特性-整理对象
  • Finalizer : 8-true
    在垃圾回收之前,调用对象的 finalizer() 方法进行清理
  • Reference Handler : 10-true 引用控制器,用于清除引用
  • Monitor Ctrl-Break : 5-true Ctrl + C 功能
  • Signal Dispatcher : 9-true 信号分发器,给虚拟机发送信号

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏

欢迎关注我的微信公众号,一起交流技术,微信搜索 🔍 :「 五十年以后