在分析我的应用程序时,我遇到了一个奇怪的行为 - DestroyJavaVM线程始终在运行 - 100%的时间.
在对该主题进行了一些研究之后,在网上几乎没有任何有价值的信息,我所理解的是该线程应该在退出时卸载JVM.
如果是这种情况,为什么这个线程从我开始申请的第一个时刻起100%的时间处于RUNNING状态?它是否消耗了宝贵的资源,因此可能导致OutOfMemoryError(像我有时得到的)?
是否有任何关于此线程实际执行的内容以及触发其初始化的内容的官方参考?
谢谢
我正在查看java进程的线程转储,并注意信号调度程序阻塞的一些线程.
什么是信号调度员?它有什么作用?
我有一个关于我的应用程序在执行过程中产生的线程及其状态的问题.
我有一个Swing应用程序,我注意到在一些测试场景中使用Java VisualVM有几个奇怪的行为.运行我的程序30分钟不做任何事情(刚开始并让它继续运行)我注意到以下内容.
首先,在Threads选项卡中,我看到很多活动线程.

读取(除其他外)
默认线程,如DestroyJavaVM,Reference Handler,Signal Dispatcher以及Java应用程序开始执行时spwaned的这些线程是什么?我理解大多数这些主题都有很好的理由去那里.(我仍然试图弄清楚"RMI TCP")但
我对他们的状态有疑问.前六个人100%处于跑步状态是否正常?
此外,这些线程中的任何一个都能解释如下所示的堆消耗吗?

我注意到很多HashMap $ Entry和TreeMap $ Entry的实例都是由源自sun.rmi.*的库引用和创建的,我认为它可能与"RMI TCP"线程相关...
最后但并非最不重要的,如果我尝试dispose()我的主JFrame,框架本身将消失,但应用程序仍将运行....这些线程可能是原因(或其中的一部分)?
谢谢大家.
我创建了一个简单的Java应用程序,它有一个JFrame和几个JButton.当我尝试使用JVMTI检查java应用程序时,我发现虽然我没有创建任何显式线程但是它们中有很多产生.
我可以找到以下主题:
他们中的大多数都处于Runnable状态.有人能告诉我这些线程的功能吗?
我在Intellij Idea中运行一些CPU密集型Clojure代码(我认为这不重要 - 它似乎只是产生一个进程).根据htop和top,它在我的笔记本电脑上使用了所有4个内核(好吧,2 +超线程).尽管我在代码中没有任何明确的并行性.
更多细节:top显示单个进程,CPU使用率约为380%,而htop显示"父"进程,然后是4个"子",每个进程有1/4的时间和~100%的CPU.
这是正常的吗?或者这是否意味着我在某处遇到了一些非常错误的事情?代码涉及许多惰性序列,但其核心修改了可变数据结构(可变 - 不是Clojure数据结构 - 累积结果的哈希). 我没有使用任何明确的并行性.
在JCA/JCE(加密lib)中花费了大量时间(我没有说过) - 我在CTR模式下使用多个AES密码,每个密码都是一个安全的随机字节流(这里是代码),实现为懒惰seqs.也许这是并行化的?
更随意的想法:这可能与IO有关吗?我正在运行加密的SSD,这个程序正在处理来自磁盘的数据,因此需要进行大量的阅读.但是htop将系统时间显示为红色,这些是绿色的.
对不起这个模糊的问题.如果需要,我可以发布更多信息.这是64位Linux(JDK 1.7.0_05)上的Clojure 1.4.正在执行的代码在这里,但是它非常混乱(更多的道歉)并且分布在各种文件中(大多数CPU时间花费在nearest-in-dump那里的代码中).注意 - 请不要浪费时间尝试运行代码来重现,因为它期望预先存在的数据转储在磁盘上(不在git中).
debugger在调试器中运行(感谢,AM)显示四个线程(如果我正确理解调试器),但只有一个正在执行程序.它们被标记为终结器,主(程序),参考处理程序和信号调度程序.Finalizer + ref处理程序处于等待状态; 信号调度员没有可用的帧.我暂时认为这意味着并行性处于较低的水平,也许在加密实现中?
啊哈,我认为它是并行GC(Java现在有一个并发收集器).在开始时,CPU使用会在实际进程暂停时跳跃(它打印出常规的勾号).而且由于它通过大量数据进行搅拌,因此会生成大量短期对象(通过使用-XX:+ UseSerialGC确认可将CPU使用率降低至100%)
我是 Java 新手,我发现了一件有趣的事情。现在我正在学习套接字,当我调试程序时,我注意到有几个线程不是我创建的。然后我在程序的开头放置了一个断点,当我打开线程时,我可以看到属于 Socket 的所有线程。但我还没有创建它,因为它是第一行代码。我现在想知道这些线程来自哪里,以及为什么它们已经创建(如果套接字仍未创建)。