プロセスの1つのスレッドダンプを取得しました。これらのスレッドがたくさんあります。彼らはたくさんの記憶を保持していると思うので、私はOOMを取得しています。
"Thread-8264" prio=6 tid=0x4c94ac00 nid=0xf3c runnable [0x4fe7f000]
java.lang.Thread.State: RUNNABLE
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:223)
- locked <0x0c9bc640> (a java.util.zip.Inflater)
at org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.read(ZipArchiveInputStream.java:235)
at com.my.ZipExtractorCommonsCompress.extract(ZipExtractorCommonsCompress.java:48)
at com.my.CustomThreadedExtractorWrapper$ExtractionThread.run(CustomThreadedExtractorWrapper.java:151)
Locked ownable synchronizers:
- None
"Thread-8241" prio=6 tid=0x4c94a400 nid=0xb8c runnable [0x4faef000]
java.lang.Thread.State: RUNNABLE
at java.util.zip.Inflater.inflateBytes(Native Method)
at java.util.zip.Inflater.inflate(Inflater.java:223)
- locked <0x0c36b808> (a java.util.zip.Inflater)
at org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.read(ZipArchiveInputStream.java:235)
at com.my.ZipExtractorCommonsCompress.extract(ZipExtractorCommonsCompress.java:48)
at com.my.CustomThreadedExtractorWrapper$ExtractionThread.run(CustomThreadedExtractorWrapper.java:151)
Locked ownable synchronizers:
- None
私はそれがどのようにしてこの状況に到達したのかを調べようとしています。CustomThreadedExtractorWrapperは、スレッドを起動して何らかの作業を行うラッパークラスです(ExtractionThreadは、ZipExtractorCommonsCompressを使用して圧縮ストリームからzipコンテンツを抽出します)。タスクに時間がかかりすぎる場合は、ExtractionThread.interrupt()
を呼び出して操作をキャンセルします。
ログを見ると、キャンセルが25回発生したことがわかります。そして、これらのスレッドのうち21個がダンプに表示されます。私の質問:
- これらのスレッドのステータスはどうなっていますか?生きていて走っていますか?どういうわけかブロックされましたか?
- 彼らはどうやら.interrupt()で死ななかったのですか?本当にスレッドを殺す確実な方法はありますか?
- スタックトレースで「ロックされている」とはどういう意味ですか?
Inflater.javaの223行目は次のとおりです。
public synchronized int inflate(byte[] b, int off, int len) {
...
//return is line 223
return inflateBytes(b, off, len);
}