Arthas 基本使用
安装
在线安装
curl -O https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar --repo-mirror aliyun --use-http
启动
java -jar arthas-boot.jar
docker 或 k8s 部署时建议交互式进入容器,在容器里操作
# docker 进入容器
docker exec -it 容器id bash
# docker-compose 进入容器
docker-compose exec 容器名 bash
# k8s 进入容器
kubectl exec -it [-n 命名空间] pod名 -c 容器名 bash
例:
[root@master1 micro]# kubectl exec -it -n micro user-7dc67c7856-4rd2c -c user bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
bash-4.4#
bash-4.4#
bash-4.4# pwd
/app
bash-4.4# java -jar arthas-boot.jar
Picked up JAVA_TOOL_OPTIONS: -XX:MaxRAMPercentage=75.0
[INFO] JAVA_HOME: /usr/java/openjdk-17
[INFO] arthas-boot version: 3.6.7
[INFO] JAVA_TOOL_OPTIONS: -XX:MaxRAMPercentage=75.0
[INFO] Found existing java process, please choose one and input the serial number of the process, eg : 1. Then hit ENTER.
* [1]: 8 user.jar
1
[INFO] arthas home: /root/.arthas/lib/3.6.7/arthas
[INFO] Try to attach process 8
Picked up JAVA_TOOL_OPTIONS:
[INFO] Attach process 8 success.
[INFO] arthas-client connect 127.0.0.1 3658
,---. ,------. ,--------.,--. ,--. ,---. ,---.
/ O \ | .--. ''--. .--'| '--' | / O \ ' .-'
| .-. || '--'.' | | | .--. || .-. |`. `-.
| | | || |\ \ | | | | | || | | |.-' |
`--' `--'`--' '--' `--' `--' `--'`--' `--'`-----'
wiki https://arthas.aliyun.com/doc
tutorials https://arthas.aliyun.com/doc/arthas-tutorials.html
version 3.6.7
main_class
pid 8
time 2023-01-06 13:35:09
[arthas@8]$
arthas 命令
help查看arthas所有命令,命令文档 https://arthas.aliyun.com/doc/commands.html
[arthas@8]$ help
NAME DESCRIPTION
help Display Arthas Help
auth Authenticates the current session
keymap Display all the available keymap for the specified connection.
sc Search all the classes loaded by JVM
sm Search the method of classes loaded by JVM
classloader Show classloader info
jad Decompile class
getstatic Show the static field of a class
monitor Monitor method execution statistics, e.g. total/success/failure count, average rt, fail rate, etc.
stack Display the stack trace for the specified class and method
thread Display thread info, thread stack
trace Trace the execution time of specified method invocation.
watch Display the input/output parameter, return object, and thrown exception of specified method invocation
tt Time Tunnel
jvm Display the target JVM information
memory Display jvm memory info.
perfcounter Display the perf counter information.
ognl Execute ognl expression.
mc Memory compiler, compiles java files into bytecode and class files in memory.
redefine Redefine classes. @see Instrumentation#redefineClasses(ClassDefinition...)
retransform Retransform classes. @see Instrumentation#retransformClasses(Class...)
dashboard Overview of target jvm's thread, memory, gc, vm, tomcat info.
dump Dump class byte array from JVM
heapdump Heap dump
options View and change various Arthas options
cls Clear the screen
reset Reset all the enhanced classes
version Display Arthas version
session Display current session information
sysprop Display and change the system properties.
sysenv Display the system env.
vmoption Display, and update the vm diagnostic options.
logger Print logger info, and update the logger level
history Display command history
cat Concatenate and print files
base64 Encode and decode using Base64 representation
echo write arguments to the standard output
pwd Return working directory name
mbean Display the mbean information
grep grep command for pipes.
tee tee command for pipes.
profiler Async Profiler. https://github.com/jvm-profiling-tools/async-profiler
vmtool jvm tool
stop Stop/Shutdown Arthas server and exit the console.
jfr Java Flight Recorder Command
[arthas@8]$
idea 插件
安装插件
在idea里可以生成对应命令
常用命令
-
查看源码
[arthas@8]$ jad --source-only com.wunding.learn.user.service.service.impl.UserServiceImpl getUserByLoginNameAndPassword public User getUserByLoginNameAndPassword(String loginName, String password) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); /*198*/ wrapper.eq(User::getLoginName, (Object)loginName); /*199*/ wrapper.eq(User::getPassword, (Object)password); /*200*/ wrapper.eq(User::getIsDel, (Object)DelEnum.NOT_DELETE.getValue()); /*201*/ return (User)((UserMapper)this.baseMapper).selectOne((Wrapper)wrapper); } [arthas@8]$ session (b944e73a-0ca7-4532-9d4f-974318c76a19) is closed because session is inactive for 30 min(s). bash-4.4#
-
查看调用耗时分布
[arthas@8]$ trace com.wunding.learn.user.service.service.impl.UserServiceImpl getUserByLoginNameAndPassword -n 5 --skipJDKMethod false Press Q or Ctrl+C to abort. Affect(class count: 2 , method count: 2) cost in 341 ms, listenerId: 1 `---ts=2023-01-06 17:59:37;thread_name=http-nio-8080-exec-8;id=162;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@3caafa67 `---[27.183135ms] com.wunding.learn.user.service.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$d033173a:getUserByLoginNameAndPassword() `---[98.32% 26.727494ms ] org.springframework.cglib.proxy.MethodInterceptor:intercept() `---[20.54% 5.488777ms ] com.wunding.learn.user.service.service.impl.UserServiceImpl:getUserByLoginNameAndPassword() +---[0.81% 0.044699ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:<init>() #197 +---[0.83% 0.045517ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #198 +---[0.44% 0.024034ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #199 +---[0.39% 0.021651ms ] com.wunding.learn.common.base.constant.DelEnum:getValue() #200 +---[0.33% 0.018046ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #200 `---[63.83% 3.503642ms ] com.wunding.learn.user.service.mapper.UserMapper:selectOne() #201 `---ts=2023-01-06 17:59:49;thread_name=http-nio-8080-exec-13;id=2a5;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@3caafa67 `---[4.668849ms] com.wunding.learn.user.service.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$d033173a:getUserByLoginNameAndPassword() `---[98.66% 4.606316ms ] org.springframework.cglib.proxy.MethodInterceptor:intercept() `---[74.27% 3.420964ms ] com.wunding.learn.user.service.service.impl.UserServiceImpl:getUserByLoginNameAndPassword() +---[2.45% 0.083727ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:<init>() #197 +---[0.47% 0.016086ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #198 +---[0.33% 0.011285ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #199 +---[0.30% 0.010234ms ] com.wunding.learn.common.base.constant.DelEnum:getValue() #200 +---[0.33% 0.011153ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #200 `---[91.65% 3.135338ms ] com.wunding.learn.user.service.mapper.UserMapper:selectOne() #201 `---ts=2023-01-06 18:00:12;thread_name=http-nio-8080-exec-5;id=15f;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@3caafa67 `---[5.964689ms] com.wunding.learn.user.service.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$d033173a:getUserByLoginNameAndPassword() `---[98.33% 5.864863ms ] org.springframework.cglib.proxy.MethodInterceptor:intercept() `---[76.34% 4.477307ms ] com.wunding.learn.user.service.service.impl.UserServiceImpl:getUserByLoginNameAndPassword() +---[0.40% 0.017783ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:<init>() #197 +---[0.39% 0.017306ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #198 +---[0.38% 0.017194ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #199 +---[0.25% 0.011403ms ] com.wunding.learn.common.base.constant.DelEnum:getValue() #200 +---[0.29% 0.013166ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #200 `---[73.42% 3.287341ms ] com.wunding.learn.user.service.mapper.UserMapper:selectOne() #201 `---ts=2023-01-06 18:00:31;thread_name=http-nio-8080-exec-4;id=15e;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@3caafa67 `---[3.456161ms] com.wunding.learn.user.service.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$d033173a:getUserByLoginNameAndPassword() `---[97.91% 3.383819ms ] org.springframework.cglib.proxy.MethodInterceptor:intercept() `---[70.26% 2.377376ms ] com.wunding.learn.user.service.service.impl.UserServiceImpl:getUserByLoginNameAndPassword() +---[0.54% 0.012773ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:<init>() #197 +---[0.63% 0.014931ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #198 +---[0.48% 0.011487ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #199 +---[0.33% 0.007945ms ] com.wunding.learn.common.base.constant.DelEnum:getValue() #200 +---[0.50% 0.011856ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #200 `---[92.80% 2.206257ms ] com.wunding.learn.user.service.mapper.UserMapper:selectOne() #201 `---ts=2023-01-06 18:00:33;thread_name=http-nio-8080-exec-12;id=1b2;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@3caafa67 `---[4.069687ms] com.wunding.learn.user.service.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$d033173a:getUserByLoginNameAndPassword() `---[95.82% 3.899633ms ] org.springframework.cglib.proxy.MethodInterceptor:intercept() `---[69.13% 2.695713ms ] com.wunding.learn.user.service.service.impl.UserServiceImpl:getUserByLoginNameAndPassword() +---[0.77% 0.020648ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:<init>() #197 +---[0.57% 0.015428ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #198 +---[0.42% 0.011455ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #199 +---[0.38% 0.010299ms ] com.wunding.learn.common.base.constant.DelEnum:getValue() #200 +---[0.45% 0.012229ms ] com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper:eq() #200 `---[91.05% 2.45443ms ] com.wunding.learn.user.service.mapper.UserMapper:selectOne() #201 Command execution times exceed limit: 5, so command will exit. You can set it with -n option. [arthas@8]$
-
查看方法入参,出参,异常
[arthas@8]$ [arthas@8]$ watch com.wunding.learn.user.service.service.impl.UserServiceImpl getUserByLoginNameAndPassword '{params,returnObj,throwExp}' -n 5 -x 3 Press Q or Ctrl+C to abort. Affect(class count: 2 , method count: 2) cost in 244 ms, listenerId: 2 method=com.wunding.learn.user.service.service.impl.UserServiceImpl.getUserByLoginNameAndPassword location=AtExit ts=2023-01-06 18:02:18; [cost=6.587646ms] result=@ArrayList[ @Object[][ @String[admin], @String[10ADC3949BA59ABBE56E057F20F883], ], @User[ serialVersionUID=@Long[1], id=@String[admin], employeeNo=@String[], loginName=@String[admin], fullName=@String[管理员], nikeName=@String[管理员], password=@String[10ADC3949BA59ABBE56E057F20F883], orgId=@String[0], workingArea=@String[深圳市华东43], firstName=@String[], lastName=@String[], pinyin=@String[admin], sex=@Integer[1], workPhone=@String[], telephone=@String[13511331221], shortMobile=@String[], email=@String[21212111@qq.com], isLock=@Integer[0], isAvailable=@Integer[1], isDel=@Integer[0], createBy=@String[admin], createTime=@Date[2022-11-29 15:49:22,000], updateBy=@String[20221129195832f864e3b9643ccd0c9bc9f8], updateTime=@Date[2022-12-01 14:45:38,000], isSuper=@Integer[1], userLevelId=@String[], isExpert=@Integer[0], liveUserId=@BigDecimal[ lsDepartAdmin=@Integer[0], birthday=@Date[2022-05-02 01:07:57,000], joinDate=@Date[2022-05-02 01:07:57,000], ], null, ] method=com.wunding.learn.user.service.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$d033173a.getUserByLoginNameAndPassword location=AtExit ts=2023-01-06 18:02:18; [cost=85.490147ms] result=@ArrayList[ @Object[][ @String[admin], @String[10ADC3949BA59ABBE56E057F20F883], ], @User[ serialVersionUID=@Long[1], id=@String[admin], employeeNo=@String[], loginName=@String[admin], fullName=@String[管理员], nikeName=@String[管理员], password=@String[10ADC3949BA59ABBE56E057F20F883], orgId=@String[0], workingArea=@String[深圳市华东43], firstName=@String[], lastName=@String[], pinyin=@String[admin], sex=@Integer[1], workPhone=@String[], telephone=@String[13511331221], shortMobile=@String[], email=@String[21212111@qq.com], isLock=@Integer[0], isAvailable=@Integer[1], isDel=@Integer[0], createBy=@String[admin], createTime=@Date[2022-11-29 15:49:22,000], updateBy=@String[20221129195832f864e3b9643ccd0c9bc9f8], updateTime=@Date[2022-12-01 14:45:38,000], isSuper=@Integer[1], userLevelId=@String[], isExpert=@Integer[0], liveUserId=@BigDecimal[ lsDepartAdmin=@Integer[0], birthday=@Date[2022-05-02 01:07:57,000], joinDate=@Date[2022-05-02 01:07:57,000], ], null, ] method=com.wunding.learn.user.service.service.impl.UserServiceImpl.getUserByLoginNameAndPassword location=AtExit ts=2023-01-06 18:02:34; [cost=2.542827ms] result=@ArrayList[ @Object[][ @String[admin], @String[27CCB0EEA8A706C4C34A16891F84E7], ], null, null, ] method=com.wunding.learn.user.service.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$d033173a.getUserByLoginNameAndPassword location=AtExit ts=2023-01-06 18:02:34; [cost=5.046508ms] result=@ArrayList[ @Object[][ @String[admin], @String[27CCB0EEA8A706C4C34A16891F84E7], ], null, null, ] method=com.wunding.learn.user.service.service.impl.UserServiceImpl.getUserByLoginNameAndPassword location=AtExit ts=2023-01-06 18:02:37; [cost=2.758137ms] result=@ArrayList[ @Object[][ @String[admin], @String[10ADC3949BA59ABBE56E057F20F883], ], @User[ serialVersionUID=@Long[1], id=@String[admin], employeeNo=@String[], loginName=@String[admin], fullName=@String[管理员], nikeName=@String[管理员], password=@String[10ADC3949BA59ABBE56E057F20F883], orgId=@String[0], workingArea=@String[深圳市华东43], firstName=@String[], lastName=@String[], pinyin=@String[admin], sex=@Integer[1], workPhone=@String[], telephone=@String[13511331221], shortMobile=@String[], email=@String[21212111@qq.com], isLock=@Integer[0], isAvailable=@Integer[1], isDel=@Integer[0], createBy=@String[admin], createTime=@Date[2022-11-29 15:49:22,000], updateBy=@String[20221129195832f864e3b9643ccd0c9bc9f8], updateTime=@Date[2022-12-01 14:45:38,000], isSuper=@Integer[1], userLevelId=@String[], isExpert=@Integer[0], liveUserId=@BigDecimal[ lsDepartAdmin=@Integer[0], birthday=@Date[2022-05-02 01:07:57,000], joinDate=@Date[2022-05-02 01:07:57,000], ], null, ] Command execution times exceed limit: 5, so command will exit. You can set it with -n option. [arthas@8]$
-
查看方法调用栈
[arthas@8]$ [arthas@8]$ stack com.wunding.learn.user.service.service.impl.UserServiceImpl getUserByLoginNameAndPassword -n 1 Press Q or Ctrl+C to abort. Affect(class count: 2 , method count: 2) cost in 197 ms, listenerId: 4 ts=2023-01-06 18:26:33;thread_name=http-nio-8080-exec-5;id=15f;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@3caafa67 @com.wunding.learn.user.service.service.impl.UserServiceImpl.getUserByLoginNameAndPassword() at com.wunding.learn.user.service.service.impl.UserServiceImpl$$FastClassBySpringCGLIB$$4b87ebfa.invoke(<generated>:-1) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:698) at com.wunding.learn.user.service.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$d033173a.getUserByLoginNameAndPassword(<generated>:-1) at com.wunding.learn.user.service.feign.UserFeignImpl.getUserByLoginNameAndPassword(UserFeignImpl.java:93) at jdk.internal.reflect.GeneratedMethodAccessor1632.invoke(null:-1) at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) at javax.servlet.http.HttpServlet.service(HttpServlet.java:497) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:584) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:91) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:67) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.cloud.sleuth.instrument.web.servlet.TracingFilter.doFilter(TracingFilter.java:68) at org.springframework.cloud.sleuth.autoconfig.instrument.web.TraceWebServletConfiguration$LazyTracingFilter.doFilter(TraceWebServletConfiguration.java:129) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:96) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) at org.springframework.cloud.sleuth.instrument.web.tomcat.TraceValve.invoke(TraceValve.java:74) at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:769) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:889) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) 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.run(Thread.java:833) Command execution times exceed limit: 1, so command will exit. You can set it with -n option. [arthas@8]$
-
查看占用CPU最高的N个线程信息
[arthas@8]$ [arthas@8]$ thread -n 2 "arthas-command-execute" Id=650 cpuUsage=0.75% deltaTime=1ms time=1895ms RUNNABLE at java.management@17.0.1/sun.management.ThreadImpl.dumpThreads0(Native Method) at java.management@17.0.1/sun.management.ThreadImpl.getThreadInfo(ThreadImpl.java:485) at com.taobao.arthas.core.command.monitor200.ThreadCommand.processTopBusyThreads(ThreadCommand.java:206) at com.taobao.arthas.core.command.monitor200.ThreadCommand.process(ThreadCommand.java:122) at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.process(AnnotatedCommandImpl.java:82) at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl.access$100(AnnotatedCommandImpl.java:18) at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:111) at com.taobao.arthas.core.shell.command.impl.AnnotatedCommandImpl$ProcessHandler.handle(AnnotatedCommandImpl.java:108) at com.taobao.arthas.core.shell.system.impl.ProcessImpl$CommandProcessTask.run(ProcessImpl.java:385) at java.base@17.0.1/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) at java.base@17.0.1/java.util.concurrent.FutureTask.run(FutureTask.java:264) at java.base@17.0.1/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) at java.base@17.0.1/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) at java.base@17.0.1/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) at java.base@17.0.1/java.lang.Thread.run(Thread.java:833) "JFR Periodic Tasks" Id=22 cpuUsage=0.19% deltaTime=0ms time=191266ms TIMED_WAITING on java.lang.Object@737f076c at java.base@17.0.1/java.lang.Object.wait(Native Method) - waiting on java.lang.Object@737f076c at jdk.jfr@17.0.1/jdk.jfr.internal.PlatformRecorder.takeNap(PlatformRecorder.java:527) at jdk.jfr@17.0.1/jdk.jfr.internal.PlatformRecorder.periodicTask(PlatformRecorder.java:508) at jdk.jfr@17.0.1/jdk.jfr.internal.PlatformRecorder.lambda$startDiskMonitor$1(PlatformRecorder.java:448) at jdk.jfr@17.0.1/jdk.jfr.internal.PlatformRecorder$$Lambda$62/0x0000000800c42938.run(Unknown Source) at java.base@17.0.1/java.lang.Thread.run(Thread.java:833) [arthas@8]$
-
查看和修改日志级别
[arthas@8]$ [arthas@8]$ logger name ROOT class ch.qos.logback.classic.Logger classLoader org.springframework.boot.loader.LaunchedURLClassLoader@4386f16 classLoaderHash 4386f16 level INFO effectiveLevel INFO additivity true codeSource jar:file:/app/user.jar!/BOOT-INF/lib/logback-classic-1.2.11.jar!/ appenders name console class ch.qos.logback.core.ConsoleAppender classLoader org.springframework.boot.loader.LaunchedURLClassLoader@4386f16 classLoaderHash 4386f16 target System.out name file class ch.qos.logback.core.rolling.RollingFileAppender classLoader org.springframework.boot.loader.LaunchedURLClassLoader@4386f16 classLoaderHash 4386f16 file /data/logs/user/user.log [arthas@8]$ logger --name com.wunding.learn.user.service.mapper name com.wunding.learn.user.service.mapper class ch.qos.logback.classic.Logger classLoader org.springframework.boot.loader.LaunchedURLClassLoader@4386f16 classLoaderHash 4386f16 level DEBUG effectiveLevel DEBUG additivity true codeSource jar:file:/app/user.jar!/BOOT-INF/lib/logback-classic-1.2.11.jar!/ [arthas@8]$ [arthas@8]$ [arthas@8]$ logger --name com.wunding.learn.user.service.mapper --level INFO -c 4386f16 Update logger level success. [arthas@8]$ logger --name com.wunding.learn.user.service.mapper name com.wunding.learn.user.service.mapper class ch.qos.logback.classic.Logger classLoader org.springframework.boot.loader.LaunchedURLClassLoader@4386f16 classLoaderHash 4386f16 level INFO effectiveLevel INFO additivity true codeSource jar:file:/app/user.jar!/BOOT-INF/lib/logback-classic-1.2.11.jar!/ [arthas@8]$
-
查看环境变量
[arthas@8]$ [arthas@8]$ sysenv learn.service.learn-file-service KEY VALUE -------------------------------------------------------------------------------------------------------------------------------- learn.service.learn-file-service http://file:8080 [arthas@8]$ [arthas@8]$ sysenv spring.datasource.url KEY VALUE -------------------------------------------------------------------------------------------------------------------------------- spring.datasource.url jdbc:mysql://${USER_DB_HOST}:${USER_DB_PORT}/${USER_DB_NAME}?allowMultiQueries=true&serverTimezone=Asia/Shanghai [arthas@8]$ sysenv USER_DB_HOST KEY VALUE -------------------------------------------------------------------------------------------------------------------------------- USER_DB_HOST mysql [arthas@8]$ sysenv USER_DB_PORT KEY VALUE -------------------------------------------------------------------------------------------------------------------------------- USER_DB_PORT 3306 [arthas@8]$ sysenv USER_DB_NAME KEY VALUE -------------------------------------------------------------------------------------------------------------------------------- USER_DB_NAME user [arthas@8]$ sysenv KEY VALUE -------------------------------------------------------------------------------------------------------------------------------- PATH /usr/java/openjdk-17/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin FILE_PORT tcp://10.233.29.70:80 COMMENT_PORT_8080_TCP tcp://10.233.60.221:8080 EXCITATION_PORT_8080_TCP_PORT 8080 EXAM_PORT_80_TCP_ADDR 10.233.16.178 JAVA_WEB_BWT_SERVICE_PORT 8080 EXAMPLE_SERVICE_PORT 80 READING_SERVICE_PORT 80 FILE_PORT_8080_TCP tcp://10.233.29.70:8080 LIVE_PORT tcp://10.233.61.203:80 USER_SERVICE_PORT 80 SURVEY_PORT_8080_TCP_ADDR 10.233.52.105 ...