Java序列化
new ObjectOutputStream(new FileOutputStream("resp")).writeObject(resp);
支持AspectJ切面编程
配置JVM参数javaagent以支持切面编程:
java -javaagent:${HOME}/.m2/repository/org/aspectj/aspectjweaver/1.9.4/aspectjweaver-1.9.4.jar app.jar
启用远程调试
java -jar \
-Dserver.port=8080 \
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8081 \
parent-0.0.1-SNAPSHOT.jar
jasypt加密解密
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=123456 password=1234-1234-1234-1234 algorithm=PBEWithMD5AndDES
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringDecryptionCLI input="jvp0W0qUkv0WmG/JzwyUTA==" password=1234-1234-1234-1234 algorithm=PBEWithMD5AndDES
诊断CPU或内存占用过高的问题
(1)基于jps查看进程号
jps -l
参考输出结果(以实际为准):
70791 jdk.jcmd/sun.tools.jps.Jps
70744 daily-api-0.1.0-SNAPSHOT.jar
需要处理的应用对应的进程号是70744:
PID=70744
(2)基于top查看进程信息
top -p $PID
参考输出结果(以实际为准):
PID 用户 优 NI 虚拟 驻留 共享 S %CPU %MEM 时间+ 命令
70744 luanrz 20 0 6346796 522696 28840 S 20.6 3.2 0:56.22 java
重点关注进程的%CPU和%MEM是否异常。如果有异常,继续往下执行。
(3)基于top查看线程信息
top -H -p $PID
参考输出结果(以实际为准):
PID 用户 优 NI 虚拟 驻留 共享 S %CPU %MEM 时间+ 命令
70852 luanrz 20 0 6346796 523116 28840 S 30.0 9.2 0:01.97 http-nio-8080-e
70854 luanrz 20 0 6346796 523116 28840 S 2.0 3.2 0:01.53 http-nio-8080-e
70860 luanrz 20 0 6346796 523116 28840 S 2.0 3.2 0:01.53 http-nio-8080-e
70857 luanrz 20 0 6346796 523116 28840 S 1.7 3.2 0:01.51 http-nio-8080-e
...(其它线程)
重点关注%CPU和%MEM位于前列的线程,当前需要处理的线程号是70852:
TID=70852
TID16=$(printf "%x" $TID) #16进制的TID
(4)基于jstack查看线程堆栈信息
# 适用于JDK8
jstack $PID | grep -A 30 "nid=0x$TID16"
# 适用于最新的JDK(JDK18及之后,详见:https://bugs.openjdk.org/browse/JDK-8268425)
jstack $PID | grep -A 30 "nid=$TID"
参考输出结果(以实际为准):
"http-nio-8080-exec-2" #45 [70852] daemon prio=5 os_prio=0 cpu=2222.14ms elapsed=3035.18s tid=0x00007f0ec90323b0 nid=70852 waiting on condition [0x00007f0e9c998000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@25.0.4/Native Method)
- parking to wait for <0x000000070ae61458> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@25.0.4/LockSupport.java:369)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@25.0.4/AbstractQueuedSynchronizer.java:520)
at java.util.concurrent.ForkJoinPool.unmanagedBlock(java.base@25.0.4/ForkJoinPool.java:4364)
at java.util.concurrent.ForkJoinPool.managedBlock(java.base@25.0.4/ForkJoinPool.java:4310)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@25.0.4/AbstractQueuedSynchronizer.java:1752)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@25.0.4/LinkedBlockingQueue.java:435)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:141)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1114)
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1176)
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.runWith(java.base@25.0.4/Thread.java:1487)
at java.lang.Thread.run(java.base@25.0.4/Thread.java:1474)
"http-nio-8080-exec-3" #46 [70853] daemon prio=5 os_prio=0 cpu=2023.19ms elapsed=3035.18s tid=0x00007f0ec9033a20 nid=70853 waiting on condition [0x00007f0e9c897000]
java.lang.Thread.State: WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@25.0.4/Native Method)
- parking to wait for <0x000000070ae61458> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(java.base@25.0.4/LockSupport.java:369)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionNode.block(java.base@25.0.4/AbstractQueuedSynchronizer.java:520)
at java.util.concurrent.ForkJoinPool.unmanagedBlock(java.base@25.0.4/ForkJoinPool.java:4364)
at java.util.concurrent.ForkJoinPool.managedBlock(java.base@25.0.4/ForkJoinPool.java:4310)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@25.0.4/AbstractQueuedSynchronizer.java:1752)
at java.util.concurrent.LinkedBlockingQueue.take(java.base@25.0.4/LinkedBlockingQueue.java:435)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:141)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:33)
分析上述结果有无异常。