当我的 java 应用程序变得无响应时,我使用jstack -F
(如果我在jstack
没有-F
标志的情况下运行它不会给我任何东西)命令转储线程信息,并且转储文件中有一个特殊的线程。
线程 110175:(状态 = IN_VM) - sun.misc.Unsafe.freeMemory(long) @bci=0(编译帧;信息可能不准确) - java.nio.DirectByteBuffer$Deallocator.run() @bci=17, line=94 (编译帧) - sun.misc.Cleaner.clean() @bci=12, line=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(long) @bci=83, line=334 (编译帧) - io.netty.channel.socket.nio.NioSocketChannel.doWrite(io.netty.channel.ChannelOutboundBuffer) @bci=238, line=301 (编译帧) - io.netty.channel.AbstractChannel$AbstractUnsafe.flush0() @bci=89, line=716 (编译帧) - io.netty.channel.nio.AbstractNioChannel$AbstractNioUnsafe.flush0() @bci=9, line=303 (编译帧) - io.netty.channel.AbstractChannel$AbstractUnsafe.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(long) @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
搜索最后一个线程,它总是IN_NATIVE
。
这是我的问题。
- 这个线程可以使我的应用程序无响应吗?
- 这是什么线程?