Java プログラムの実行中に CPU 使用率が高くなります。jstack がスタックして CPU を消費している箇所をデバッグするのに役立つことがわかりました。jstack で出力を取得したところ、BLOCKED 状態のスレッドがほとんどないことがわかりました。
ここではJava 1.7を使用し、負荷の問題を確認するために、同じOS、つまりCentOS 6.3でJavaを古い1.6に置き換えましたが、Java 1.6(1.7も)とcentos 5.4の組み合わせでテストしたため、問題は残っています。うまく機能し、CPUの使用量が少なくなります。
centos 6.3 である OS だけが負荷の問題を抱えていることを除いて、何も変更されていません。
スレッドを jstack 出力に BLOCKED として指定した関連コードを見つけるにはどうすればよいですか。以下は私の調査結果からの出力です。
OS - CentOS 6.3 x86_64 (2.6.32-279.el6.x86_64)
CPU core - 8
Ram - 16GB
Java version - "1.7.0_17"
jstack 出力:
Deadlock Detection:
No deadlocks found.
none
null_check
null_assert
range_check
class_check
array_check
intrinsic
bimorphic
unloaded
uninitialized
unreached
unhandled
constraint
div0_check
age
predicate
loop_limit_check
Thread 4514: (state = BLOCKED)
Locked ownable synchronizers:
- None
Thread 4493: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=135 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove() @bci=2, line=151 (Interpreted frame)
- java.lang.ref.Finalizer$FinalizerThread.run() @bci=3, line=177 (Interpreted frame)
Locked ownable synchronizers:
- None
Thread 4491: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.Object.wait() @bci=2, line=503 (Interpreted frame)
- java.lang.ref.Reference$ReferenceHandler.run() @bci=46, line=133 (Interpreted frame)
Locked ownable synchronizers:
- None
Java 情報出力:
Java System Properties:
java.runtime.name = Java(TM) SE Runtime Environment
java.vm.version = 23.7-b01
sun.boot.library.path = /usr/java/jdk1.7.0_17/jre/lib/amd64
hadoop.root.logger = INFO,console
java.vendor.url = http://java.oracle.com/
java.vm.vendor = Oracle Corporation
path.separator = :
file.encoding.pkg = sun.io
java.vm.name = Java HotSpot(TM) 64-Bit Server VM
sun.os.patch.level = unknown
sun.java.launcher = SUN_STANDARD
user.country = US
user.dir = /home/ravi
java.vm.specification.name = Java Virtual Machine Specification
java.runtime.version = 1.7.0_17-b02
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
os.arch = amd64
java.endorsed.dirs = /usr/java/jdk1.7.0_17/jre/lib/endorsed
line.separator =
VM Flags:
-Xmx4000m -Djava.net.preferIPv4Stack=true -Dhadoop.log.dir=//opt/cloudera/parcels/CDH-4.2.1-1.cdh4.2.1.p0.5/lib/hadoop/logs -Dhadoop.log.file=hadoop.log -Dhadoop.home.dir=//opt/cloudera/parcels/CDH-4.2.1-1.cdh4.2.1.p0.5/lib/hadoop -Dhadoop.id.str= -Dhadoop.root.logger=INFO,console -Djava.library.path=//opt/cloudera/parcels/CDH-4.2.1-1.cdh4.2.1.p0.5/lib/hadoop/lib/native -Dhadoop.policy.file=hadoop-policy.xml -Djava.net.preferIPv4Stack=true -Xms256m -Dhadoop.security.logger=INFO,NullAppender