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)

分析上述结果有无异常。