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

转储文件中的一个特殊java线程,java,jvm,dump,jstack,Java,Jvm,Dump,Jstack,当我的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() @

当我的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) 线程110175:(状态=IN_VM) -sun.misc.Unsafe.freemory(长)@bci=0(编译帧;信息可能不精确) -java.nio.DirectByteBuffer$Deallocator.run()@bci=17,line=94(编译帧) -sun.misc.Cleaner.clean()@bci=12,第143行(编译帧) -io.netty.util.internal.Cleaner0.freeDirectBuffer(java.nio.ByteBuffer)@bci=34,line=66(编译帧) -io.netty.util.internal.PlatformDependent0.freeDirectBuffer(java.nio.ByteBuffer)@bci=1,line=147(编译帧) -io.netty.util.internal.PlatformDependent.freeDirectBuffer(java.nio.ByteBuffer)@bci=13,line=281(编译帧) -io.netty.buffer.UnpooledUnsafeDirectByteBuf.freeDirect(java.nio.ByteBuffer)@bci=1,line=115(编译帧) -io.netty.buffer.UnpooledUnsafeDirectByteBuf.deallocate()@bci=24,line=508(编译帧) -io.netty.buffer.AbstractReferenceCountedByteBuf.release()@bci=39,line=106(编译帧) -io.netty.util.ReferenceCountUtil.release(java.lang.Object)@bci=11,line=59(编译帧) -io.netty.util.ReferenceCountUtil.safeRelease(java.lang.Object)@bci=1,line=84(编译帧) -io.netty.channel.ChannelOutboundBuffer.remove()@bci=40,line=258(编译帧) -io.netty.channel.ChannelOutboundBuffer.removeBytes(长)@bci=83,line=334(编译帧) -io.netty.channel.socket.nio.NioSocketChannel.doWrite(io.netty.channel.ChannelOutboundBuffer)@bci=238,line=301(编译帧) -io.netty.channel.AbstractChannel$AbstractSafe.flush0()@bci=89,line=716(编译帧) -io.netty.channel.nio.AbstractNioChannel$AbstractNiosafsafe.flush0()@bci=9,line=303(编译帧) -io.netty.channel.AbstractChannel$AbstractSafe.flush()@bci=15,line=685(编译帧) -io.netty.channel.DefaultChannelPipeline$HeadContext.flush(io.netty.channel.ChannelHandlerContext)@bci=4,line=1118(编译帧) -io.netty.channel.AbstractChannelHandlerContext.invokeFlush()@bci=8,line=663(编译帧) -io.netty.channel.AbstractChannelHandlerContext.access$1500(io.netty.channel.AbstractChannelHandlerContext)@bci=1,line=32(编译帧) -io.netty.channel.AbstractChannelHandlerContext$16.run()@bci=4,line=651(编译帧) -io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(长)@bci=26,line=380(编译帧) -io.netty.channel.nio.NioEventLoop.run()@bci=106,line=357(编译帧) -io.netty.util.concurrent.SingleThreadEventExecutor$2.run()@bci=13,line=116(解释帧) -java.lang.Thread.run()@bci=11,line=745(解释帧) 在我使用了
jstack-F
之后,应用程序开始响应并继续运行,就好像什么都没发生过一样,直到它最终再次停止响应

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

以下是我的问题

  • 这个线程能使我的应用程序无响应吗
  • 这是什么线

  • 正如您在线程堆栈跟踪中看到的,大多数调用都在
    io.netty
    包中

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

    来回答你的问题

  • 是的,但仅当它运行的代码太长/使用太多CPU来处理硬件配置的事件时。这可能是netty框架中的其他代码,也可能是您的代码
  • 这是一个通用事件调度程序线程。这不是一条特殊的线

  • 正如您在线程堆栈跟踪中看到的,大多数调用都在
    io.netty
    包中

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

    来回答你的问题

  • 是的,但仅当它运行的代码太长/使用太多CPU来处理硬件配置的事件时。这可能是netty框架中的其他代码,也可能是您的代码
  • 这是一个通用事件调度程序线程。这不是一条特殊的线

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

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

    第一个问题不是问题。这是一条语句。这个线程的状态是什么?@luming,我不确定该线程是否能使应用程序无响应。@harshavmb,当应用程序正常时,转储文件中的线程总是以_NATIVE的形式出现,但当应用程序出现错误时,状态是“in _VM”,第一个问题不是问题。这是一条语句。这个线程的状态是什么?@luming,我不确定该线程是否能使应用程序无响应。@harshavmb,当应用程序正常时,转储文件中的线程总是以_NATIVE的形式出现,但当应用程序出现错误时,状态是“in _VM”,这是我的配置,
    -Xms32g-Xmx100g-XX:+UseParNewGC-XX:+UseConcMarkSweepGC-XX:cmSinitiatingOccupencyFraction=75-XX:+UseC