当前位置: 首页 > news >正文

用arthas轻松排查线上问题

你是否在项目中会碰到以下一些问题:

  1. 在代码中打印各种日志来排查,比如方法的入参,出参,及在方法体中打印日志判断走哪行代码
  2. 还有你觉得代码没问题,可是运行出现却是以前的bug,感觉代码没修改,或者别人把你修改好之前的代码部署上去了,你想要看线上部署的是不是你修改的最新代码,把包从服务器上下载下来然后再反编译查看
  3. 有些接口请求很慢,你想知道这个接口的方法调用链中耗时时间,你以前是不是通过切面去打印每个方法的耗时时间,修改代码,重新部署
  4. 当进程CPU飙高或者占用内存较大,你用top命令查看,然后top -H -p x,把十进制转成16进制,然后jstack  x | grep -A 10 y命令排查,会觉得有点麻烦
  5. 当本地程序运行正常,线上代码运行不正常,你可能需要优化一个class几行代码,在线上看是否会运行正常,重新打包部署,会觉得有点麻烦

其实阿里的线上排查工具arthas就可以解决上述问题

下载地址:https://alibaba.github.io/arthas/arthas-boot.jar

直接执行命令:

java -jar arthas-boot.jar

如果出现中文乱码,需要添加参数 -Dfile.encoding=UTF-8 

java  -Dfile.encoding=UTF-8   -jar arthas-boot.jar

 直接输入你要连接的进程号:如 4

进入arthas交互界面

现在根据以下代码来进行测试:

package com.htf.smm.controller;import com.htf.smm.service.SmmIndexSyncService;
import com.htf.smm.service.impl.TestServiceOne;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.repository.query.Param;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import java.util.Objects;@RestController
@RequestMapping("/smm")
public class SmmController {@Autowiredprivate TestServiceOne testServiceOne;@RequestMapping("/ycTest")public void ycTest(Long time) {System.out.println("执行开始,"+time);Other other = new Other();other.setInfo("其他");Coordinate coordinate = new Coordinate();coordinate.setX(1);coordinate.setY(2);coordinate.setOther(other);Address address = new Address();address.setAddr("昌北");address.setCoordinate(coordinate);School school = new School();school.setName("华东交大");school.setAddress(address);ParamEntiry paramEntiry = new ParamEntiry();paramEntiry.setName("yc");paramEntiry.setAge(32);paramEntiry.setSchool(school);test(paramEntiry);System.out.println("执行完毕");}public ReturnEntity test(ParamEntiry paramEntiry){ReturnEntity returnEntity = new ReturnEntity();Other other = new Other();other.setInfo("其他");Coordinate coordinate = new Coordinate();coordinate.setX(1);coordinate.setY(2);coordinate.setOther(other);Address address = new Address();address.setAddr("昌北");address.setCoordinate(coordinate);School school = new School();school.setName("华东交大");school.setAddress(address);returnEntity.setSchool(school);return returnEntity;}
}
package com.htf.smm.controller;import lombok.Data;@Data
public class ParamEntiry {private  String name;private Integer age;private School school;
}
@Data
class School{private String name;private Address address;
}
@Data
class Address{private String addr;private Coordinate coordinate;
}
@Data
class Coordinate{private int x;private int y;private Other other;
}
@Data
class Other{private String info;
}
@Data
public class ReturnEntity {private  String name;private Integer age;private School school;
}
package com.htf.smm.service.impl;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class TestServiceOne {private String serviceName = "one";@Autowiredprivate TestServiceTwo testServiceTwo;
}
package com.htf.smm.service.impl;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class TestServiceTwo {private String serviceName = "two";@Autowiredprivate TestServiceThree testServiceThree;
}
package com.htf.smm.service.impl;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class TestServiceThree {private String serviceName = "three";@Autowiredprivate TestServiceFour testServiceFour;
}
package com.htf.smm.service.impl;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class TestServiceFour {private String serviceName = "four";@Autowiredprivate TestServiceFive testServiceFive;
}

下面来介绍常用的几个命令,watch,trace,stack ,jad,redefine ,thrad 

watch命令

参数名称参数说明
class-pattern类名表达式匹配
method-pattern函数名表达式匹配
express观察表达式,默认值:{params, target, returnObj}
condition-express条件表达式
[b]函数调用之前观察
[e]函数异常之后观察
[s]函数返回之后观察
[f]函数结束之后(正常返回和异常返回)观察
[E]开启正则表达式匹配,默认为通配符匹配
[x:]指定输出结果的属性遍历深度,默认为 1,最大值是 4
[arthas@9388]$ watch com.htf.smm.controller.SmmController test
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 27 ms, listenerId: 5
method=com.htf.smm.controller.SmmController.test location=AtExit
ts=2023-03-01 15:11:33; [cost=0.0424ms] result=@ArrayList[@Object[][isEmpty=false;size=1],@SmmController[com.htf.smm.controller.SmmController@59fe5960],@ReturnEntity[ReturnEntity(name=null, age=null, school=School(name=华东交大, address=Address(addr=昌北, coordinate=Coordinate(x=1, y=2, other=Other(info=其他)))))],
]

默认返回params,target,returnObj({params, target, returnObj})深度为1(-x 1),且函数结束之后(正常返回和异常返回)-f观察,即等于下面这个命令

[arthas@9388]$ watch com.htf.smm.controller.SmmController test "{params, target, returnObj}" -x 1 -f
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 28 ms, listenerId: 7
method=com.htf.smm.controller.SmmController.test location=AtExit
ts=2023-03-01 15:44:01; [cost=0.0398ms] result=@ArrayList[@Object[][isEmpty=false;size=1],@SmmController[com.htf.smm.controller.SmmController@59fe5960],@ReturnEntity[ReturnEntity(name=null, age=null, school=School(name=华东交大, address=Address(addr=昌北, coordinate=Coordinate(x=1, y=2, other=Other(info=其他)))))],
]

@Object[][isEmpty=false;size=1] 为params,为什么是个数组呢?因为参数可能有多个

@SmmController[com.htf.smm.controller.SmmController@59fe5960] 为当前对象

 @ReturnEntity[ReturnEntity(name=null, age=null, school=School(name=华东交大, address=Address(addr=昌北, coordinate=Coordinate(x=1, y=2, other=Other(info=其他)))))] 为returnObj

location=AtExit 为在函数结束之后正常返回观察

重要参数-x,默认为1,但是当参数和当前对象的属性有对象引用的时候,我们就需要用到-x,如上命令执行 @SmmController[com.htf.smm.controller.SmmController@59fe5960] 我们无法查看到当前对象内部有什么属性,@Object[][isEmpty=false;size=1]当前参数的具体值

我们设置-x 2试试

[arthas@9388]$ watch com.htf.smm.controller.SmmController test "{params, target, returnObj}" -x 2 -f
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 29 ms, listenerId: 14
method=com.htf.smm.controller.SmmController.test location=AtExit
ts=2023-03-01 16:01:39; [cost=0.0249ms] result=@ArrayList[@Object[][@ParamEntiry[ParamEntiry(name=yc, age=32, school=School(name=华东交大, address=Address(addr=昌北, coordinate=Coordinate(x=1, y=2, other=Other(info=其他)))))],],@SmmController[testServiceOne=@TestServiceOne[com.htf.smm.service.impl.TestServiceOne@55111d28],],@ReturnEntity[name=null,age=null,school=@School[School(name=华东交大, address=Address(addr=昌北, coordinate=Coordinate(x=1, y=2, other=Other(info=其他))))],],
]

上述所示,就把参数1对应的对象展示出来了,把当前对象中的对象引用展示出来了,把返回对象的引用给展示出来了

注意:-x的最大值为4

重要参数-n,默认是无限次,当线上执行这个接口比较频繁,我们用运维工具可能会频繁去监听打印这个方法相关的信息,很耗服务器资源,而且影响接口响应耗时的时间,当我们为了排查问题,只要获取到一次监听的时候,就可以加-n参数,-n 1表示只执行两次,执行1次后,就会自动退出监听

[arthas@9388]$ watch com.htf.smm.controller.SmmController test "{params, target, returnObj}" -x 2 -f -n 1
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 30 ms, listenerId: 15
method=com.htf.smm.controller.SmmController.test location=AtExit
ts=2023-03-01 16:12:51; [cost=0.0357ms] result=@ArrayList[@Object[][@ParamEntiry[ParamEntiry(name=yc, age=32, school=School(name=华东交大, address=Address(addr=昌北, coordinate=Coordinate(x=1, y=2, other=Other(info=其他)))))],],@SmmController[testServiceOne=@TestServiceOne[com.htf.smm.service.impl.TestServiceOne@55111d28],],@ReturnEntity[name=null,age=null,school=@School[School(name=华东交大, address=Address(addr=昌北, coordinate=Coordinate(x=1, y=2, other=Other(info=其他))))],],
]
Command execution times exceed limit: 1, so command will exit. You can set it with -n option.

最后一行Command execution times exceed limit: 1, so command will exit. You can set it with -n option.表示执行次数限制为1次,可以通过-n来设置执行的次数

trace命令

参数名称参数说明
class-pattern类名表达式匹配
method-pattern方法名表达式匹配
condition-express条件表达式
[E]开启正则表达式匹配,默认为通配符匹配
[n:]命令执行次数
#cost方法执行耗时

根据耗时"#cost>0"大小匹配如下,耗时是以s为单位的 

[arthas@9388]$ trace com.htf.smm.controller.SmmController ycTest "#cost>0"
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 36 ms, listenerId: 27
`---ts=2023-03-02 09:54:37;thread_name=http-nio-8080-exec-2;id=4f;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1aa6e3c0`---[0.3154ms] com.htf.smm.controller.SmmController:ycTest()+---[3.01% 0.0095ms ] com.htf.smm.controller.Other:<init>() #31+---[1.49% 0.0047ms ] com.htf.smm.controller.Other:setInfo() #32+---[1.81% 0.0057ms ] com.htf.smm.controller.Coordinate:<init>() #33+---[1.55% 0.0049ms ] com.htf.smm.controller.Coordinate:setX() #34+---[1.20% 0.0038ms ] com.htf.smm.controller.Coordinate:setY() #35+---[1.30% 0.0041ms ] com.htf.smm.controller.Coordinate:setOther() #36+---[1.30% 0.0041ms ] com.htf.smm.controller.Address:<init>() #37+---[1.17% 0.0037ms ] com.htf.smm.controller.Address:setAddr() #38+---[1.24% 0.0039ms ] com.htf.smm.controller.Address:setCoordinate() #39+---[1.17% 0.0037ms ] com.htf.smm.controller.School:<init>() #40+---[1.33% 0.0042ms ] com.htf.smm.controller.School:setName() #41+---[1.33% 0.0042ms ] com.htf.smm.controller.School:setAddress() #42+---[1.24% 0.0039ms ] com.htf.smm.controller.ParamEntiry:<init>() #43+---[1.14% 0.0036ms ] com.htf.smm.controller.ParamEntiry:setName() #44+---[1.43% 0.0045ms ] com.htf.smm.controller.ParamEntiry:setAge() #45+---[1.24% 0.0039ms ] com.htf.smm.controller.ParamEntiry:setSchool() #46`---[3.01% 0.0095ms ] com.htf.smm.controller.SmmController:test() #47

stack命令

参数名称参数说明
class-pattern类名表达式匹配
method-pattern方法名表达式匹配
condition-express条件表达式
[E]开启正则表达式匹配,默认为通配符匹配
[n:]执行次数限制(stack,watch,trace命令用法一致)

根据参数值"params[0].name=='yc'"匹配,用法如下:

[arthas@9388]$ stack com.htf.smm.controller.SmmController test "params[0].name=='yc'"
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 28 ms, listenerId: 37
ts=2023-03-02 10:16:57;thread_name=http-nio-8080-exec-4;id=51;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1aa6e3c0@com.htf.smm.controller.SmmController.test()at com.htf.smm.controller.SmmController.ycTest(SmmController.java:47)at sun.reflect.GeneratedMethodAccessor55.invoke(null:-1)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:483)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)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:626)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:744)

注意:stack命令和trace命令参数值匹配和耗时大小匹配可以联合使用,如下:

[arthas@9388]$ stack com.htf.smm.controller.SmmController test "params[0].name=='yc'" "#cost>0"
Press Q or Ctrl+C to abort.
Affect(class count: 1 , method count: 1) cost in 38 ms, listenerId: 38
ts=2023-03-02 10:23:37;thread_name=http-nio-8080-exec-6;id=53;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1aa6e3c0@com.htf.smm.controller.SmmController.test()at com.htf.smm.controller.SmmController.ycTest(SmmController.java:47)at sun.reflect.GeneratedMethodAccessor55.invoke(null:-1)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:483)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)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:626)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:744)

jad命令

lass-pattern类名表达式匹配
[c:]类所属 ClassLoader 的 hashcode
[classLoaderClass:]指定执行表达式的 ClassLoader 的 class name
[E]开启正则表达式匹配,默认为通配符匹配

反编译类jad 类路径:

[arthas@9388]$ jad com.htf.smm.controller.SmmControllerClassLoader:
+-sun.misc.Launcher$AppClassLoader@58644d46+-sun.misc.Launcher$ExtClassLoader@71c7db30Location:
/E:/code/htf/htf-parent/htf-damp-parent/htf-damp-smm/target/classes//** Decompiled with CFR.** Could not load the following classes:*  com.htf.smm.controller.Address*  com.htf.smm.controller.Coordinate*  com.htf.smm.controller.Other*  com.htf.smm.controller.ParamEntiry*  com.htf.smm.controller.ReturnEntity*  com.htf.smm.controller.School*  com.htf.smm.service.impl.TestServiceOne*/package com.htf.smm.controller;import com.htf.smm.controller.Address;import com.htf.smm.controller.Coordinate;import com.htf.smm.controller.Other;import com.htf.smm.controller.ParamEntiry;import com.htf.smm.controller.ReturnEntity;import com.htf.smm.controller.School;import com.htf.smm.service.impl.TestServiceOne;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping(value={"/smm"})public class SmmController {@Autowiredprivate TestServiceOne testServiceOne;public ReturnEntity test(ParamEntiry paramEntiry) {ReturnEntity returnEntity = new ReturnEntity();Other other = new Other();
/*54*/         other.setInfo("其他");Coordinate coordinate = new Coordinate();
/*56*/         coordinate.setX(1);
/*57*/         coordinate.setY(2);
/*58*/         coordinate.setOther(other);Address address = new Address();
/*60*/         address.setAddr("昌北");
/*61*/         address.setCoordinate(coordinate);School school = new School();
/*63*/         school.setName("华东交大");
/*64*/         school.setAddress(address);
/*65*/         returnEntity.setSchool(school);
/*66*/         return returnEntity;}@RequestMapping(value={"/ycTest"})public void ycTest(Long time) throws InterruptedException {
/*30*/         System.out.println("执行开始," + time);Other other = new Other();
/*32*/         other.setInfo("其他");Coordinate coordinate = new Coordinate();
/*34*/         coordinate.setX(1);
/*35*/         coordinate.setY(2);
/*36*/         coordinate.setOther(other);Address address = new Address();
/*38*/         address.setAddr("昌北");
/*39*/         address.setCoordinate(coordinate);School school = new School();
/*41*/         school.setName("华东交大");
/*42*/         school.setAddress(address);ParamEntiry paramEntiry = new ParamEntiry();
/*44*/         paramEntiry.setName("yc");
/*45*/         paramEntiry.setAge(Integer.valueOf(32));
/*46*/         paramEntiry.setSchool(school);
/*47*/         this.test(paramEntiry);
/*48*/         System.out.println("执行完毕");}}Affect(row-cnt:1) cost in 357 ms.

其中有ClassLoader和Location信息,如果把他去掉,加 --source-only 参数,如下所示:

[arthas@9388]$ jad com.htf.smm.controller.SmmController  --source-only/** Decompiled with CFR.** Could not load the following classes:*  com.htf.smm.controller.Address*  com.htf.smm.controller.Coordinate*  com.htf.smm.controller.Other*  com.htf.smm.controller.ParamEntiry*  com.htf.smm.controller.ReturnEntity*  com.htf.smm.controller.School*  com.htf.smm.service.impl.TestServiceOne*/package com.htf.smm.controller;import com.htf.smm.controller.Address;import com.htf.smm.controller.Coordinate;import com.htf.smm.controller.Other;import com.htf.smm.controller.ParamEntiry;import com.htf.smm.controller.ReturnEntity;import com.htf.smm.controller.School;import com.htf.smm.service.impl.TestServiceOne;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping(value={"/smm"})public class SmmController {@Autowiredprivate TestServiceOne testServiceOne;public ReturnEntity test(ParamEntiry paramEntiry) {ReturnEntity returnEntity = new ReturnEntity();Other other = new Other();
/*54*/         other.setInfo("其他");Coordinate coordinate = new Coordinate();
/*56*/         coordinate.setX(1);
/*57*/         coordinate.setY(2);
/*58*/         coordinate.setOther(other);Address address = new Address();
/*60*/         address.setAddr("昌北");
/*61*/         address.setCoordinate(coordinate);School school = new School();
/*63*/         school.setName("华东交大");
/*64*/         school.setAddress(address);
/*65*/         returnEntity.setSchool(school);
/*66*/         return returnEntity;}@RequestMapping(value={"/ycTest"})public void ycTest(Long time) throws InterruptedException {
/*30*/         System.out.println("执行开始," + time);Other other = new Other();
/*32*/         other.setInfo("其他");Coordinate coordinate = new Coordinate();
/*34*/         coordinate.setX(1);
/*35*/         coordinate.setY(2);
/*36*/         coordinate.setOther(other);Address address = new Address();
/*38*/         address.setAddr("昌北");
/*39*/         address.setCoordinate(coordinate);School school = new School();
/*41*/         school.setName("华东交大");
/*42*/         school.setAddress(address);ParamEntiry paramEntiry = new ParamEntiry();
/*44*/         paramEntiry.setName("yc");
/*45*/         paramEntiry.setAge(Integer.valueOf(32));
/*46*/         paramEntiry.setSchool(school);
/*47*/         this.test(paramEntiry);
/*48*/         System.out.println("执行完毕");}}

如果不展示行号,加--lineNumber false 参数

[arthas@9388]$ jad com.htf.smm.controller.SmmController  --source-only  --lineNumber false
/** Decompiled with CFR.** Could not load the following classes:*  com.htf.smm.controller.Address*  com.htf.smm.controller.Coordinate*  com.htf.smm.controller.Other*  com.htf.smm.controller.ParamEntiry*  com.htf.smm.controller.ReturnEntity*  com.htf.smm.controller.School*  com.htf.smm.service.impl.TestServiceOne*/
package com.htf.smm.controller;import com.htf.smm.controller.Address;
import com.htf.smm.controller.Coordinate;
import com.htf.smm.controller.Other;
import com.htf.smm.controller.ParamEntiry;
import com.htf.smm.controller.ReturnEntity;
import com.htf.smm.controller.School;
import com.htf.smm.service.impl.TestServiceOne;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping(value={"/smm"})
public class SmmController {@Autowiredprivate TestServiceOne testServiceOne;public ReturnEntity test(ParamEntiry paramEntiry) {ReturnEntity returnEntity = new ReturnEntity();Other other = new Other();other.setInfo("其他");Coordinate coordinate = new Coordinate();coordinate.setX(1);coordinate.setY(2);coordinate.setOther(other);Address address = new Address();address.setAddr("昌北");address.setCoordinate(coordinate);School school = new School();school.setName("华东交大");school.setAddress(address);returnEntity.setSchool(school);return returnEntity;}@RequestMapping(value={"/ycTest"})public void ycTest(Long time) throws InterruptedException {System.out.println("执行开始," + time);Other other = new Other();other.setInfo("其他");Coordinate coordinate = new Coordinate();coordinate.setX(1);coordinate.setY(2);coordinate.setOther(other);Address address = new Address();address.setAddr("昌北");address.setCoordinate(coordinate);School school = new School();school.setName("华东交大");school.setAddress(address);ParamEntiry paramEntiry = new ParamEntiry();paramEntiry.setName("yc");paramEntiry.setAge(Integer.valueOf(32));paramEntiry.setSchool(school);this.test(paramEntiry);System.out.println("执行完毕");}
}

反编译类中的方法,如下:

[arthas@9388]$ jad com.htf.smm.controller.SmmController test  --source-only  --lineNumber false
public ReturnEntity test(ParamEntiry paramEntiry) {ReturnEntity returnEntity = new ReturnEntity();Other other = new Other();other.setInfo("其他");Coordinate coordinate = new Coordinate();coordinate.setX(1);coordinate.setY(2);coordinate.setOther(other);Address address = new Address();address.setAddr("昌北");address.setCoordinate(coordinate);School school = new School();school.setName("华东交大");school.setAddress(address);returnEntity.setSchool(school);return returnEntity;
}

retransform命令,结合 jad/mc 命令使用

1、jad 命令反编译,然后可以用其它编译器 

[arthas@9388]$ jad com.htf.smm.controller.SmmController   --source-only  --lineNumber false > D:\\\tmp\\\SmmController.java

 

2、修改源码 ,修改了日志输出

 

3、mc 命令来内存编译修改过的代码

[arthas@9388]$ mc  D:\\\tmp\\\SmmController.java -d D:\\\tmp
Memory compiler output:
D:\tmp\com\htf\smm\controller\SmmController.class
Affect(row-cnt:1) cost in 1792 ms.

  

4、用 retransform 命令加载新的字节码 

[arthas@9388]$ retransform D:\\\tmp\\\com\\\htf\\\smm\\\controller\\\SmmController.class
retransform success, size: 1, classes:
com.htf.smm.controller.SmmController

之后调用的时候,日志输出是修改了执行完毕,之前是执行完毕

thread命令

参数名称参数说明
id线程 id
[n:]指定最忙的前 N 个线程并打印堆栈
[b]找出当前阻塞其他线程的线程
[i <value>]指定 cpu 使用率统计的采样间隔,单位为毫秒,默认值为 200
[--all]显示所有匹配的线程

我们用它来排查cpu占比很高的问题 

得知占比cpu最高的线程的id是81,执行命令thread 81,如下:

[arthas@16256]$ thread 81
"http-nio-8080-exec-1" Id=81 RUNNABLEat java.io.FileOutputStream.writeBytes(Native Method)at java.io.FileOutputStream.write(FileOutputStream.java:307)at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)at java.io.PrintStream.write(PrintStream.java:482)at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)at java.io.PrintStream.newLine(PrintStream.java:546)at java.io.PrintStream.println(PrintStream.java:807)at com.htf.smm.controller.SmmController.test(SmmController.java:66)at com.htf.smm.controller.SmmController.ycTest(SmmController.java:46)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:483)at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190)at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138)at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:878)at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:792)at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943)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:626)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:744)

 得知在业务代码

    at com.htf.smm.controller.SmmController.test(SmmController.java:66)
    at com.htf.smm.controller.SmmController.ycTest(SmmController.java:46)中有问题

 参考:

  • monitor——方法执行监控

  • watch——方法执行数据观测,查看方法的入参,出参,和当前对象的属性

  • trace——方法内部调用路径,并输出方法路径上的每个节点上耗时

  • stack——输出当前方法之前到当前方法被调用的调用路径

  • tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

  • jad反编译

  • redefine   /xx/xx.class  更新class文件 服务重启就是失效了

  • dashboard看板,thread命令可以排查cpu和内存飙高问题

相关文章:

用arthas轻松排查线上问题

你是否在项目中会碰到以下一些问题&#xff1a; 在代码中打印各种日志来排查&#xff0c;比如方法的入参&#xff0c;出参&#xff0c;及在方法体中打印日志判断走哪行代码还有你觉得代码没问题&#xff0c;可是运行出现却是以前的bug&#xff0c;感觉代码没修改&#xff0c;或…...

mysql一explain结果分析

1. EXPLAIN简介 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 ➤ 通过EXPLAIN&#xff0c;我们可以分析出以下结果&#xff1a; 表的读取顺序数据读取操作的操作类型哪些索引可…...

原理底层计划--HashMap

HashMap 之前写了“Java集合TreeMap红黑树一生只爱一次”&#xff0c;说到底还是太年轻了&#xff0c;Map其实在排序中应用比较少&#xff0c;一般追求的是速度&#xff0c;通过HashMap来获取速度。hashmap 调用object hashcode方法用于返回对象的哈希码&#xff0c;主要使用在…...

win10 设备管理器中的黄色感叹号(华硕)

目录一、前言二、原因三、方案四、操作一、前言 打开设备管理器&#xff0c;我们可以看到自己设备的信息&#xff0c;但是在重装系统后&#xff0c;你总会在不经意间发现。咦&#xff0c;怎么多了几个感叹号&#xff1f;&#xff1f;&#xff1f; 由于我已经解决该问题&#…...

新产品上市推广不是“铺货”上架

只有不断推出新产品的企业才能走得长远&#xff0c;但现实中往往有很多企业投入了大量人力、物力、财力研发的新产品却在推广的过程中屡屡受挫。那么&#xff0c;为什么适合市场的新产品会在市场营销推广的过程中夭折呢&#xff1f;小马识途营销顾问分析有如下几点&#xff1a;…...

MATLAB训练神经网络小结

MATLAB训练神经网络小结1、一个典型例子1.1 可视化神经网络1.2 指定某一层的激活函数1.3 训练神经网络时使用L1正则化1.4返回训练过程中的参数1.5 查看训练好的权重系数1.6 如何使用早停法来防止过拟合1、一个典型例子 例如输入特征为10维&#xff0c;想训练一个10x20x10x1的三…...

实战:一天开发一款内置游戏直播的国产版Discord应用【附源码】

游戏直播是Discord产品的核心功能之一&#xff0c;本教程教大家如何1天内开发一款内置游戏直播的国产版Discord应用&#xff0c;用户不仅可以通过IM聊天&#xff0c;也可以进行语聊&#xff0c;看游戏直播&#xff0c;甚至自己进行游戏直播&#xff0c;无任何实时音视频底层技术…...

嵌入式学习笔记——基于Cortex-M的单片机介绍

基于Cortex-M的单片机介绍前言生产厂商及其产品线ARM单片机的产品线命名规则留个作业习单片机的资料准备STM32开发所需手册1.芯片的数据手册作业2前言 本文继续接着上一篇中关于Cortex-M的介绍&#xff0c;来记录一些关于ARM系单片机的知识。 生产厂商及其产品线 芯片厂商在…...

Python 虚拟环境的使用

PyCharm 创建的虚拟环境与使用 workon 命令创建的虚拟环境在本质上没有区别&#xff0c;它们都是 Python 的虚拟环境。 使用 PyCharm 创建工程时&#xff0c;使用可以使用曾经工程的虚拟环境&#xff0c;或者新建一个虚拟环境来安装 Python 的库&#xff0c;又或者使用 workon…...

招生咨询|浙江大学MPA项目2023年招生问答与通知

问&#xff1a;报考浙江大学MPA的基本流程是怎么样的&#xff1f; 答&#xff1a;第一阶段为网上报名与确认。MPA考生须参加全国管理类联考&#xff0c;网上报名时间一般为10月初开始、10月下旬截止&#xff0c;错过网上报名时间后不能补报。确认时间一般为11月上旬&#xff0c…...

Qt std :: bad_alloc

文章目录摘要问题出现原因第一种 请求内存多余系统可提供内存第二种 地址空间过于分散&#xff0c;无法满足大块连续内存的请求第三种 堆管理数据结构损坏稍微总结下没想到还能更新参考关键字&#xff1a; std、 bad、 alloc、 OOM、 异常退出摘要 今天又是被BUG统治的一天&a…...

《设计模式》装饰者模式

《设计模式》装饰者模式 装饰者模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许在不改变现有对象结构的情况下&#xff0c;动态地添加行为或责任到对象上。在装饰者模式中&#xff0c;有一个抽象组件&#xff08;Component&#xff09;…...

一文说清Kubernetes的本质

文章目录Kubernetes解决了什么问题&#xff1f;Kubernetes的全局架构Kubernetes的设计思想Kubernetes的核心功能Kubernetes如何启动一个容器化任务&#xff1f;Kubernetes解决了什么问题&#xff1f; 编排&#xff1f;调度&#xff1f;容器云&#xff1f;还是集群管理&#xf…...

信息发布小程序【源码好优多】

简介 信息发布小程序&#xff0c;实现数据与小程序数据同步共享&#xff0c;通过简单的配置就能搭建自己的小程序。&#xff0c;基于微信小程序开发的小程序。 这个框架比较简单就是用微信原生开发技术进行实现的&#xff0c;可以用于信息展示等相关信息。其中目前APP比较多&am…...

创新型中小企业申报流程

据工业和信息化部《优质中小企业梯度培育管理暂行办法》&#xff08;工信部企业〔2022〕63号&#xff09;和省《优质中小企业梯度培育管理实施细则》&#xff08;鲁工信发〔2022〕8号&#xff0c;以下简称《细则》&#xff09;&#xff0c;现就做好2022年山东省创新型中小企业评…...

【UE4 Cesium】加载离线地图

主体思路&#xff1a;先使用水经注软件下载瓦片数据&#xff0c;再使用Python转换瓦片数据格式&#xff08;TMS&#xff09;&#xff0c;使用Nginx发布网络服务&#xff0c;最后将网络服务加载到UE中。步骤&#xff1a;使用水经注下载瓦片数据&#xff0c;这里下载的是全球七级…...

Spring面试题

目录 Spring、Springmvc、Springboot的区别是什么 SpringMVC工作流程是什么 SpringMVC的九大组件有哪些 Spring的核心是什么 spring的事务传播机制是什么 Spring框架中的单例Bean是线程安全的么 spring框架中使用了哪些设计模式及应用场景 spring事务的隔离级别有哪些?…...

动态网站开发讲课笔记03:HTTP协议

文章目录零、本节学习目标一、HTTP概述&#xff08;一&#xff09;HTTP的概念1、HTTP的概念2、HTTP协议的特点&#xff08;1&#xff09;C/S模式&#xff08;2&#xff09;简单快速&#xff08;3&#xff09;灵活&#xff08;4&#xff09;无状态&#xff08;二&#xff09;HTT…...

2023年天津财经大学珠江学院专升本专业课考试题型

天津财经大学珠江学院关于2023年高职升本科专业课考试时间及题型一、专业课考试 &#xff08;一&#xff09;时间安排 2023年天津财经大学珠江学院高职升本科专业课考试定于2023年3月25日14&#xff1a;00-17:00进行&#xff0c;凡报考工商管理、旅游管理、税收学专业的考生&am…...

五方面提高销售流程管理的CRM系统

销售充满了不确定性&#xff0c;面对不同的客户&#xff0c;销售人员需要采用不同的销售策略。也正因为这种不确定性&#xff0c;规范的销售流程对企业尤为重要&#xff0c;它会让销售工作更加有效&#xff0c;快速地实现成交。下面小编给您推荐个不错的CRM销售流程管理系统。 …...

AutoCAD通过handle id选择实体

获得实体的handle id。注意是handle id 不是id&#xff0c;方法有2种&#xff1a;方法&#xff08;a&#xff09;&#xff1a;通过ArxDeg插件&#xff08;ObjectARX附带的源码编译得到&#xff1a;\samples\database\ARXDBG&#xff09;查找&#xff1a;此handle id本来就是16进…...

页面状态码的含义

使用互联网产品或服务的过程中&#xff0c;会遇到网页报错的情况&#xff0c; 比如404、505等&#xff0c;具体这些数字有什么含义呢&#xff1f;本文基本涵盖了99%的报错情况&#xff0c;可供大家查询使用。 状态码的定义 状态码一般是由3位数字和原因短语组成的&#xff08…...

Redis 越来越慢?常见延迟问题定位与分析

Redis作为内存数据库&#xff0c;拥有非常高的性能&#xff0c;单个实例的QPS能够达到10W左右。但我们在使用Redis时&#xff0c;经常时不时会出现访问延迟很大的情况&#xff0c;如果你不知道Redis的内部实现原理&#xff0c;在排查问题时就会一头雾水。很多时候&#xff0c;R…...

【python】python-socketio+firecamp使用踩坑指南

server.py: import eventlet import asyncioeventlet.monkey_patch()import socketio import eventlet.wsgisio socketio.Server(async_modeeventlet, cors_allowed_origins*) # 指明在evenlet模式下sio.event def connect(sid, environ):print(f"connect, sid{sid}, e…...

【OJ比赛日历】快周末了,不来一场比赛吗? #03.04-03.10 #12场

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01;更多比赛信息见 CompHub主页 或 点击文末阅读原文以下信息仅供参考&#xff0c;以比赛官网为准目录2023-03-04&…...

C++11:继承

目录 继承的基本概念 继承方式 基类和派生类对象赋值转换/切片 继承中的作用域 派生类的四个成员函数&#xff1a; 构造函数 拷贝构造函数 赋值重载 析构函数 静态成员 继承与友元 多继承 菱形继承 多继承的指针偏移问题 组合 继承的基本概念 继承出现的契机是某一…...

【蓝桥杯试题】递归实现排列型枚举

&#x1f483;&#x1f3fc; 本人简介&#xff1a;男 &#x1f476;&#x1f3fc; 年龄&#xff1a;18 &#x1f91e; 作者&#xff1a;那就叫我亮亮叭 &#x1f4d5; 专栏&#xff1a;蓝桥杯试题 文章目录1. 题目描述2. 代码展示法一&#xff1a;dfs法二&#xff1a;next_perm…...

入职字节测试岗外包一个月,我离职了...

有一种打工人的羡慕&#xff0c;叫做“大厂”。真是年少不知大厂香&#xff0c;错把青春插稻秧。但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂的“…...

weak学习入门-01

作用:集中在特征提取、算法选择和参数调优上 本篇几乎是汇总了大佬的参考 官网https://www.cs.waikato.ac.nz/ml/weka 大佬的入门教程:初试weka数据挖掘 - 加拿大小哥哥 - 博客园 (cnblogs.com) 参考书:数据挖掘实用机器学习技术(原书第2版)...

线程池中shutdown()和shutdownNow()方法的区别

线程池中shutdown()和shutdownNow()方法的区别 一般情况下&#xff0c;当我们频繁的使用线程的时候&#xff0c;为了节约资源快速响应需求&#xff0c;我们都会考虑使用线程池&#xff0c;线程池使用完毕都会想着关闭&#xff0c;关闭的时候一般情况下会用到shutdown和shutdow…...

代理 网站前置审批/b站推广网站2024

Android 瀑布流照片墙实现&#xff0c;体验不规则的美感。 这是一个大牛写的瀑布流的一个Demo&#xff0c;我研究了一下&#xff0c;给大家分享出来&#xff0c;有需要的可以直接用。。。 实现效果图&#xff1a; 源代码示例&#xff1a; 布局文件&#xff1a;activity_main:…...

新密做网站推广/我想做百度推广

lazy running(最短路) 题意: 一个环上有四个点&#xff0c;从点2出发回到起点&#xff0c;走过的距离不小于K的最短距离是多少 \(K < 10^{18} 1 < d < 30000\) 看完这道题&#xff0c;觉得这是个智力题&#xff0c;想了一想&#xff0c;无从下手啊 每次总是看完题解&a…...

做网站需要懂什么/河南seo技术教程

1.按照份数划分list /*** 1> 按照份数---划分list* param source* param num 想要划分成多少份* return*/public static <T> List<List<T>> splitListForNum(List<T> source,int num){List<List<T>> resultnew ArrayList<List<…...

永州网站建设/搜索引擎内部优化

将word文档转换成ppt教程 三个步骤 Word设置 Word转换为PPT PPT美化 Word设置 将Word转换成PPT时&#xff0c;第一步要对Word的文字内容进行分级。只有做好这项准备工作&#xff0c;才能省时省力。 法一&#xff1a;样式分级法 "样式分级法”是指直接利用页面上的…...

商丘电子商务网站建设/飓风seo刷排名软件

创建协程的方式主要有:launch()、async()、coroutineScope()、runBlocking() 。 launch() 创建一个异步协程(非阻塞),返回一个不带返回值的 job。 fun main(){GlobalScope.launch{// 默认 CorutineDispatcher 为 Dispatchers.Defaultdelay(1000) // 仅可用于协程,而非线…...

哪里有做直销网站的/福州seo优化排名推广

A、MySQL 备份工具xtrabackup 的安装1. percona 官方xtrabackup 的二进制版本&#xff1b;二进制版本解压就能用了。2. 解压xtrabackup &创建连接tar -xzvf percona-xtrabackup-2.3.4-Linux-x86_64.tar.gz -C /usr/local/ln -s /usr/local/percona-xtrabackup-2.3.4 /usr/l…...