当前位置: 首页 > 知识库问答 >
问题:

转储文件中的一个特殊java线程

徐涵亮
2023-03-14

当我的java应用程序没有响应时,我使用jstack-F(如果我运行jstack而没有-F标志,它不会给我任何东西)命令来转储线程信息,转储文件中有一个特殊的线程。

Thread 110175: (state = IN_VM)
 - sun.misc.Unsafe.freeMemory(long) @bci=0 (Compiled frame; information may be imprecise)
 - java.nio.DirectByteBuffer$Deallocator.run() @bci=17, line=94 (Compiled frame)
 - sun.misc.Cleaner.clean() @bci=12, line=143 (Compiled frame)
 - io.netty.util.internal.Cleaner0.freeDirectBuffer(java.nio.ByteBuffer) @bci=34, line=66 (Compiled frame)
 - io.netty.util.internal.PlatformDependent0.freeDirectBuffer(java.nio.ByteBuffer) @bci=1, line=147 (Compiled frame)
 - io.netty.util.internal.PlatformDependent.freeDirectBuffer(java.nio.ByteBuffer) @bci=13, line=281 (Compiled frame)
 - io.netty.buffer.UnpooledUnsafeDirectByteBuf.freeDirect(java.nio.ByteBuffer) @bci=1, line=115 (Compiled frame)
 - io.netty.buffer.UnpooledUnsafeDirectByteBuf.deallocate() @bci=24, line=508 (Compiled frame)
 - io.netty.buffer.AbstractReferenceCountedByteBuf.release() @bci=39, line=106 (Compiled frame)
 - io.netty.util.ReferenceCountUtil.release(java.lang.Object) @bci=11, line=59 (Compiled frame)
 - io.netty.util.ReferenceCountUtil.safeRelease(java.lang.Object) @bci=1, line=84 (Compiled frame)
 - io.netty.channel.ChannelOutboundBuffer.remove() @bci=40, line=258 (Compiled frame)
 - io.netty.channel.ChannelOutboundBuffer.removeBytes(long) @bci=83, line=334 (Compiled frame)
 - io.netty.channel.socket.nio.NioSocketChannel.doWrite(io.netty.channel.ChannelOutboundBuffer) @bci=238, line=301 (Compiled frame)
 - io.netty.channel.AbstractChannel$AbstractUnsafe.flush0() @bci=89, line=716 (Compiled frame)
 - io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0() @bci=9, line=303 (Compiled frame)
 - io.netty.channel.AbstractChannel$AbstractUnsafe.flush() @bci=15, line=685 (Compiled frame)
 - io.netty.channel.DefaultChannelPipeline$HeadContext.flush(io.netty.channel.ChannelHandlerContext) @bci=4, line=1118 (Compiled frame)
 - io.netty.channel.AbstractChannelHandlerContext.invokeFlush() @bci=8, line=663 (Compiled frame)
 - io.netty.channel.AbstractChannelHandlerContext.access$1500(io.netty.channel.AbstractChannelHandlerContext) @bci=1, line=32 (Compiled frame)
 - io.netty.channel.AbstractChannelHandlerContext$16.run() @bci=4, line=651 (Compiled frame)
 - io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(long) @bci=26, line=380 (Compiled frame)
 - io.netty.channel.nio.NioEventLoop.run() @bci=106, line=357 (Compiled frame)
 - io.netty.util.concurrent.SingleThreadEventExecutor$2.run() @bci=13, line=116 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=745 (Interpreted frame)

在我使用jstack-F之后,应用程序开始响应,并继续运行,好像什么都没发生过,直到它最终再次停止响应。

当应用程序正常时,我使用jstack-F搜索最后一个线程,它总是在_NATIVE中搜索

以下是我的问题。

  1. 这个线程会使我的应用程序没有响应吗?
  2. 这个线程是什么?

共有2个答案

韩良策
2023-03-14

此线程正在调用sun.misc.Cleaner来清理直接内存(堆外)。可能是直接内存用来多要花费很长时间来收集。您可以使用System.gc()定期收集直接mem。并设置-XX: ExplitGCInvokesConcurrent并使用CMS收集器来避免应用程序没有响应。

欧阳飞
2023-03-14

正如您在线程的堆栈跟踪中所看到的,大多数调用都在io中。内蒂包裹。

底层的两个类,SingleThreadEventExecutor和NioEventLoop,在它们的Javadoc中表示它们是通用事件调度程序线程。因此,代码在其中运行的代码可以是任何代码。大概它经常运行您的代码。

来回答你的问题

  1. 是的,但前提是它运行的代码需要太长/使用太多CPU来处理硬件配置的事件。那可能是netty框架中的其他代码,也可能是您的代码。
  2. 这是一个通用事件调度线程。这不是一个特殊的线程。
 类似资料:
  • 问题内容: 我试图编写一个文件名带有特殊字符的文件,例如“téééê.mp3”,但文件名始终保留“?” 我尝试了几种方法来代替字符“é”,但没有找到解决方法: 我也尝试过这种方式。 问题答案: 尝试: 现在,如果这是您的文件系统不支持此类文件名的问题,您将得到一个;。不同于,新的API拒绝创建可能最终无法读取的文件名。 如果确实无法创建路径,那么,您将必须找到某种逃避和撤消逃避的方法。也许写一个别

  • 当我阅读Eclipse的源代码时,我发现了一个名为“$classname$.java”的文件。其部分内容如下: 我试图提取if的AST,然后我出现了一个错误。“%if”和“%endif”在Java中是什么意思?我怎么才能得到它的AST呢?

  • 16.4 特殊文件与程序 我们在第六章曾经谈到特殊权限的 SUID/SGID/SBIT ,虽然第六章已经将这三种特殊权限作了详细的解释,不过,我们依旧要来探讨的是,那么到底这些权限对于你的“程序”是如何影响的? 此外,程序可能会使用到系统资源,举例来说,磁盘就是其中一项资源。哪天你在 umount 磁盘时,系统老是出现“ device is busy ”的字样~到底是怎么回事啊?我们下面就来谈一谈

  • 你也许会认为扩展中定义的函数应该直接通过return关键字来返回一个值,比如由你自己来生成一个zval并返回,就像下面这样: ZEND_FUNCTION(sample_long_wrong) { zval *retval; MAKE_STD_ZVAL(retval); ZVAL_LONG(retval, 42); return retval; } 但是,上面的

  • 问题内容: 我正在编写一个简单的文件下载servlet,但无法获取正确的文件名。尝试使用URLEncoding和MimeEncoding在现有答案中看到的文件名,但没有一个起作用。 以下代码段中的fileData对象包含mime类型,byte []内容和文件名,它们至少需要ISO-8859-2字符集,而ISO-8859-1不够。 如何使我的浏览器正确显示下载的文件名? 这是文件名的示例:árvíz