【实战JVM】-实战篇-05-内存泄漏及分析

【实战JVM】-实战篇-05-内存泄漏及分析

  • 1 内存溢出和内存泄漏
    • 1.1 常见场景
    • 1.2 解决内存溢出的方法
      • 1.2.1 发现问题
        • 1.2.1.1 top
        • 1.2.1.2 ViusalVM
        • 1.2.1.3 arthas
        • 1.2.1.4 Prometheus+Grafana
      • 1.2.2 堆内存状况对比
      • 1.2.3 内存泄漏原因-代码中
        • 1.2.3.1 equals()-hashCode()
        • 1.2.3.2 内部类引用外部类
        • 1.2.3.3 ThreadLocal的使用
        • 1.2.3.4 String的intern方法
        • 1.2.3.5 通过静态字段保存对象
        • 1.2.3.6 资源没有正常关闭
      • 1.2.4 内存泄漏原因-并发请求
        • 1.2.4.1 内存溢出
        • 1.2.4.2 内存泄漏
  • 2 诊断内存
    • 2.1 使用MAT诊断内存
    • 2.2 MAT检测内存泄漏原理
      • 2.2.1 生成内存快照观察深堆浅堆
    • 2.3 导出运行中内存的快照并分析
      • 2.3.1 jmap导出
      • 2.3.2 arthas导出
    • 2.4 分析超大堆内存快照
  • 3 实战
    • 3.1 分页查询文章接口的内存溢出
      • 3.1.1 设置参数重启jar包
      • 3.1.2 准备数据
      • 3.1.3 jmeter中导入测试脚本
      • 3.1.4 定位问题
      • 3.1.5 解决思路
    • 3.2 Mybatis导致的内存溢出
      • 3.2.1 定位问题
      • 3.2.2 解决思路
    • 3.3 导出大文件内存溢出
      • 3.3.1 k8s部署
      • 3.3.2 解决思路
    • 3.4 ThreadLocal使用时占用大量内存
      • 3.4.1 定位问题
      • 3.4.2 解决思路
    • 3.5 文章内容审核接口的内存问题
      • 3.5.1 定位问题
        • 3.5.1.1 线程池
        • 3.5.1.2 生产者-消费者使用队列
        • 3.5.1.3 消息中间件
  • 4 诊断和解决问题
    • 4.1 离线分析
    • 4.2 在线分析-arthas
    • 4.3 在线分析-btrace追踪
      • 4.3.1 添加依赖
      • 4.3.2 编写btrace脚本
      • 4.3.3 上传btrace工具及其脚本


1 内存溢出和内存泄漏

在这里插入图片描述

在这里插入图片描述

1.1 常见场景

  • 内存泄露导致溢出的常见场景是大型的Java后端应用中,在处理用户请求之后,没有及时将用户数据删除。随着用户请求的数量越来越多,内存泄漏的对象占满了堆内存,最终导致内存溢出。
  • 在这里插入图片描述

1.2 解决内存溢出的方法

在这里插入图片描述

1.2.1 发现问题

1.2.1.1 top

在这里插入图片描述

top

按M选择内存从大到小排序

1.2.1.2 ViusalVM

在这里插入图片描述

启动微服务com.itheima.jvmoptimize.JvmOptimizeApplication

在这里插入图片描述

远程连接查看visualvm

java -jar -Djava.rmi.server.hostname=182.92.117.86 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9122 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false SpringBoot-demo-1.0-SNAPSHOT.jar

访问不成功的话记得添加阿里云的安全组

在这里插入图片描述

生产环境禁止通过visualVM连接!只能在测试环境中查看。

1.2.1.3 arthas

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

启动arthas tutorial

nohup java -jar -Darthas.enable-detail-pages=true arthas-tunnel-server-3.7.1-fatjar.jar &

默认端口号8080,默认访问地址

http://182.92.117.86:8080/apps.html

微服务引入依赖并打包

<dependency><groupId>com.taobao.arthas</groupId><artifactId>arthas-spring-boot-starter</artifactId><version>3.7.1</version>
</dependency>

先启动一个

nohup java -jar -Dserver.port=9527 -Darthas.http-port=9528 -Darthas.telnet-port=9529 jvm-optimize-0.0.1-SNAPSHOT.jar &

再启动一个

nohup java -jar -Dserver.port=9530 -Darthas.http-port=9531 -Darthas.telnet-port=9532 jvm-optimize-0.0.1-SNAPSHOT.jar &

在这里插入图片描述

一个tunnel,两个微服务

查看http://182.92.117.86:8080/apps.html

在这里插入图片描述

一点名字就进入arthas的页面

在这里插入图片描述

1.2.1.4 Prometheus+Grafana

在这里插入图片描述

添加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><exclusions><!-- 去掉springboot默认配置 --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency>

暴露所有端口

management:endpoint:metrics:enabled: true #支持metricsprometheus:enabled: true #支持Prometheusmetrics:export:prometheus:enabled: truetags:application: jvm-test #实例名采集endpoints:web:exposure:include: '*' #开放所有端口

查询localhost:8881/actuator

在这里插入图片描述

查看所有bean属性

在这里插入图片描述

现在是通过监控springboot中的属性,也可以将jvm中其他的指标暴露出来。

引入依赖

<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId><scope>runtime</scope>
</dependency>
management:endpoint:metrics:enabled: true #支持metricsprometheus:enabled: true #支持Prometheusmetrics:export:prometheus:enabled: truetags:application: jvm-test #实例名采集

打开http://localhost:8881/actuator/prometheus

在这里插入图片描述

查看堆信息

在这里插入图片描述

为我们的主机在阿里云中配置Prometheus监控

访问http://182.92.117.86:9527/actuator/prometheus

在这里插入图片描述

添加microMeter,监控jvm

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Micrometer大盘监控成功:

在这里插入图片描述

堆内存使用情况

在这里插入图片描述

堆中具体使用情况

在这里插入图片描述

Prometheus负责将服务器上的信息通过接口的方式收集到,并且把信息传输给Grafana,最后通过Grafana的仪表盘可视化出来

1.2.2 堆内存状况对比

在这里插入图片描述

1.2.3 内存泄漏原因-代码中

在这里插入图片描述

1.2.3.1 equals()-hashCode()

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

解决方法:

  • 在定义新实体类时始终重写equals()和hashCode()方法。
  • 重写时一定要确定使用了唯一的标识去区分不同的对象,比如用户的ID等。
  • hashmap使用时尽量使用编号ID等数据作为key,不要将整个实体类对象作为key存放。
  • 采用@Data来注释实体类避免出现此类情况
1.2.3.2 内部类引用外部类

在这里插入图片描述

问题一:

非静态的内部类默认会持有外部类,尽管代码上不使用外部类,所以如果有地方引用了这个非静态内部类,会导致外部类也会被引用,垃圾回收时无法回收这个外部类。

public class Outer{private byte[] bytes = new byte[1024 * 1024]; //外部类持有数据private String name  = "测试";class Inner{private String name;public Inner() {this.name = Outer.this.name;}}public static void main(String[] args) throws IOException, InterruptedException {
//        System.in.read();int count = 0;ArrayList<Inner> inners = new ArrayList<>();while (true){if(count++ % 100 == 0){Thread.sleep(10);}inners.add(new Inner());}}
}

如果要用就要改为静态的内部类,并且引用外部类的静态属性

public class Outer{private byte[] bytes = new byte[1024 * 1024]; //外部类持有数据private static String name  = "测试";static class Inner{private String name;public Inner() {this.name = Outer.name;}}

可以理解为:非静态的内部类会保存自己是由哪个外部类对象所创建的,所以会持有该外部类对象的引用,而静态内部类属于类而不属于对象,所以可以直接创建。

问题二:

匿名内部类对象如果在非静态方法中被创建,则会持有调用者对象,垃圾回收时无法回收调用者。

public class Outer {private byte[] bytes = new byte[1024];public List<String> newList() {List<String> list = new ArrayList<String>() {{add("1");add("2");}};return list;}public static void main(String[] args) throws IOException {System.in.read();int count = 0;ArrayList<Object> objects = new ArrayList<>();while (true){System.out.println(++count);objects.add(newList());}}
}

使用内部类或匿名类,尽量改为静态类或静态方法

public class Outer {private byte[] bytes = new byte[1024];public static List<String> newList() {List<String> list = new ArrayList<String>() {{add("1");add("2");}};return list;}
1.2.3.3 ThreadLocal的使用

在这里插入图片描述

public class Demo5_1 {public static ThreadLocal<Object> threadLocal = new ThreadLocal<>();public static void main(String[] args) throws InterruptedException {while (true) {new Thread(() -> {threadLocal.set(new byte[1024 * 1024 * 10]);}).start();Thread.sleep(10);}}
}

单纯使用 new Thread(() -> {创建线程即使不会回收也不会内存泄漏,但是使用线程池就不一样了。

public class Demo5 {public static ThreadLocal<Object> threadLocal = new ThreadLocal<>();public static void main(String[] args) throws InterruptedException {ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(Integer.MAX_VALUE, Integer.MAX_VALUE,0, TimeUnit.DAYS, new SynchronousQueue<>());int count = 0;while (true) {System.out.println(++count);threadPoolExecutor.execute(() -> {threadLocal.set(new byte[1024 * 1024]);//threadLocal.remove();});Thread.sleep(10);}}
}

使用完线程池的ThreadLocal之后记得remove移除

1.2.3.4 String的intern方法

在这里插入图片描述

1.2.3.5 通过静态字段保存对象

在这里插入图片描述

public class CaffineDemo {public static void main(String[] args) throws InterruptedException {Cache<Object, Object> build = Caffeine.newBuilder().build();int count = 0;while (true){build.put(count++,new byte[1024 * 1024 * 10]);Thread.sleep(100L);}}
}

为缓存设置一个时间 .expireAfterWrite(Duration.ofMillis(100))

1.2.3.6 资源没有正常关闭

在这里插入图片描述

1.2.4 内存泄漏原因-并发请求

在这里插入图片描述

在这里插入图片描述

1.2.4.1 内存溢出

在Jmeter中添加线程组,每秒触发100次http请求

在这里插入图片描述

增加http请求

在这里插入图片描述

@GetMapping("/test")
public void test1() throws InterruptedException {byte[] bytes = new byte[1024 * 1024 * 100];//100mThread.sleep(10 * 1000L);
}

在这里插入图片描述

修改启动参数

在这里插入图片描述

启动后大量报错

在这里插入图片描述

1.2.4.2 内存泄漏

在这里插入图片描述

在这里插入图片描述

粘贴到id的值那一行。

name同理,选择随机字符串RandomString,长度1000,哪些字符用于生成:26个字母

在这里插入图片描述

启动测试,每秒能处理8000个

在这里插入图片描述

2 诊断内存

2.1 使用MAT诊断内存

先把环境变量的jdk设为17再启动memoryanalyzer

在这里插入图片描述

在这里插入图片描述

添加虚拟机参数

-Xmx256m -Xms256m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\File\StudyJavaFile\JavaStudy\JVM\shizhan\day05\resource\dump\test1.hprof

然后启动时用jmeter测试,控制台输出

在这里插入图片描述

用mat打开这个内存快照

在这里插入图片描述

在这里插入图片描述

点击detail查看详情

在这里插入图片描述

在这里插入图片描述

综合报告中同样能看到此类信息

在这里插入图片描述

2.2 MAT检测内存泄漏原理

在这里插入图片描述

在这里插入图片描述

2.2.1 生成内存快照观察深堆浅堆

在这里插入图片描述

public class HeapDemo {public static void main(String[] args) {TestClass a1 = new TestClass();TestClass a2 = new TestClass();TestClass a3 = new TestClass();String s1 = "itheima1";String s2 = "itheima2";String s3 = "itheima3";a1.list.add(s1);a2.list.add(s1);a2.list.add(s2);a3.list.add(s3);//System.out.print(ClassLayout.parseClass(TestClass.class).toPrintable());s1 = null;s2 = null;s3 = null;System.gc();}
}class TestClass {public List<String> list = new ArrayList<>(10);
}

在这里插入图片描述

转换为支配树

在这里插入图片描述

添加虚拟机参数

-XX:+HeapDumpBeforeFullGC -XX:HeapDumpPath=D:/File/StudyJavaFile/JavaStudy/JVM/shizhan/day05/resource/dump/mattest.hprof

启动,控制台输出

Dumping heap to D:/File/StudyJavaFile/JavaStudy/JVM/shizhan/day05/resource/dump/mattest.hprof ...
Heap dump file created [2507919 bytes in 0.010 secs]

用mat打开,并且打开支配树

在这里插入图片描述

打印类的信息

引入

<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.9</version>
</dependency>
public class StringSize {public static void main(String[] args) {//使用JOL打印String对象System.out.print(ClassLayout.parseClass(String.class).toPrintable());}
}

输出

java.lang.String object internals:OFFSET  SIZE     TYPE DESCRIPTION                               VALUE0    12          (object header)                           N/A12     4   char[] String.value                              N/A16     4      int String.hash                               N/A20     4          (loss due to the next object alignment)
Instance size: 24 bytes
Space losses: 0 bytes internal + 4 bytes external = 4 bytes total

0-11 是类头,12-15是char[] String.value,16-19是int String.hash,因为用的是64位系统,所以需要和8字节对齐,所以20-23是补齐8字节。

在这里插入图片描述

在这里插入图片描述

2.3 导出运行中内存的快照并分析

2.3.1 jmap导出

在这里插入图片描述

服务器中有3个,一个是arthas,两个是jvm-optimize

在这里插入图片描述

运行jmap命令输出9527的内存快照

jmap -dump:live,format=b,file=/home/jvm/dump/jvm-optimize-jmap.hprof 29317

在这里插入图片描述

2.3.2 arthas导出

访问182.92.117.86:8080/apps.html

随便进入一个

在这里插入图片描述

输入

heapdump --live /home/jvm/dump/jvm-optimize-arthas.hprof

在这里插入图片描述

在这里插入图片描述

得到俩,下载到本地后用mat打开

在这里插入图片描述

再看柱状图

在这里插入图片描述

要是一个对象的深堆过于的大的时候就可能发生内存泄漏。现在都在一个数量级。还算正常

2.4 分析超大堆内存快照

在这里插入图片描述

3 实战

在这里插入图片描述

3.1 分页查询文章接口的内存溢出

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.1.1 设置参数重启jar包

重新添加参数启动9527

nohup java -jar -Dserver.port=9527 -Darthas.http-port=9528 -Darthas.telnet-port=9529 -Xmx512m -Xms512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/jvm/dump/jvm9527.hprof jvm-optimize-0.0.1-SNAPSHOT.jar & 

打开Prometheus查看运行情况,现在只有100M还算ok

在这里插入图片描述

3.1.2 准备数据

在docker的mysql中生成了11w数据,方便后面查询

在这里插入图片描述

在这里插入图片描述

3.1.3 jmeter中导入测试脚本

在这里插入图片描述

在这里插入图片描述

这样等于150个线程×10000条数据保存到内存中

先查询一个

在这里插入图片描述

没什么问题,启动jmeter测试脚本

在这里插入图片描述

运行了五分钟都没溢出。

在这里插入图片描述

3.1.4 定位问题

直接看老师的视频吧,用mat分析内存结构,打开直方图和支配树,占用大的一个是rowData,一个是tomcat的线程。

先从线程入手,选择线程

在这里插入图片描述

在这里插入图片描述

发现是DemoQueryController在执行queryByPage这个方法

@GetMapping
public ResponseEntity<Page<TbArticle>> queryByPage(TbArticle tbArticle, int page,int size) {//size = Math.min(100,size);return ResponseEntity.ok(this.articleService.queryByPage(tbArticle, PageRequest.of(page,size)));
}

很多TbArticle对象只是被创建了,但是还没有返回,大量存在于内存中,在开发环境重新复现这个问题。

3.1.5 解决思路

在这里插入图片描述

选用一进行解决。

size = Math.min(100,size);

限制查询个数

3.2 Mybatis导致的内存溢出

在这里插入图片描述

3.2.1 定位问题

用3.1一样的分析方法,HandlerMethod->List->with outgoing references,定位到这里

在这里插入图片描述

@GetMapping
public ResponseEntity countIfAbsent(int size) {//随机生成批量idList<Integer> ids = new Random().ints(0, 1000000).limit(size).boxed().collect(Collectors.toList());return ResponseEntity.ok(this.articleService.countIfAbsent(ids));
}

会生成一个供mybatis去foreach的hashmap数组,占据大量空间

3.2.2 解决思路

在这里插入图片描述

3.3 导出大文件内存溢出

在这里插入图片描述

3.3.1 k8s部署

k8s搞不定,光听算了

3.3.2 解决思路

在这里插入图片描述

3.4 ThreadLocal使用时占用大量内存

在这里插入图片描述

3.4.1 定位问题

在这里插入图片描述

每次拦截用户信息都存在threadlocal中

public class UserInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {UserDataContextHolder.userData.set(new UserDataContextHolder.UserData());return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {UserDataContextHolder.userData.remove();}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

但是如果出现异常,postHandle中remove方法无法执行,用户信息就永远留在threadlocal中,所以需要吧remove移到afterCompletion中。

并且和tomcat的配置也有关系,最低保留100个线程进行处理,即使没有请求也有很多线程并不能被回收。

server:port: 8881tomcat:threads:min-spare: 100max: 500

修改为min-spare: 10,最小值为10,不能为0。

3.4.2 解决思路

在这里插入图片描述

3.5 文章内容审核接口的内存问题

在这里插入图片描述

3.5.1 定位问题

3.5.1.1 线程池

如果使用线程池处理异步请求

在这里插入图片描述
在这里插入图片描述

3.5.1.2 生产者-消费者使用队列

在这里插入图片描述
在这里插入图片描述

3.5.1.3 消息中间件

在这里插入图片描述

在这里插入图片描述

4 诊断和解决问题

在这里插入图片描述

4.1 离线分析

为jmeter添加插件
在这里插入图片描述

添加插件后,查看响应时间

在这里插入图片描述

大概30s就能响应

在这里插入图片描述

通过

jmap -dump:live,format=b,file=/home/jvm/dump/offline-jamp.hprof 28865

会导致较高的响应时间

4.2 在线分析-arthas

在这里插入图片描述

jmap -histo:live 28865 > /home/jvm/dump/online-jamp-histo.txt

在这里插入图片描述

监控一下UserEntity,在arthas中输入

stack com.itheima.jvmoptimize.entity.UserEntity -n 1

4.3 在线分析-btrace追踪

在这里插入图片描述

4.3.1 添加依赖

<dependencies><dependency><groupId>org.openjdk.btrace</groupId><artifactId>btrace-agent</artifactId><version>${btrace.version}</version><scope>system</scope><systemPath>D:\Software\software_with_code\btrace-v2.2.4-bin\libs\btrace-agent.jar</systemPath></dependency><dependency><groupId>org.openjdk.btrace</groupId><artifactId>btrace-boot</artifactId><version>${btrace.version}</version><scope>system</scope><systemPath>D:\Software\software_with_code\btrace-v2.2.4-bin\libs\btrace-boot.jar</systemPath></dependency><dependency><groupId>org.openjdk.btrace</groupId><artifactId>btrace-client</artifactId><version>${btrace.version}</version><scope>system</scope><systemPath>D:\Software\software_with_code\btrace-v2.2.4-bin\libs\btrace-client.jar</systemPath></dependency>
</dependencies>

4.3.2 编写btrace脚本

@BTrace
public class TracingUserEntity {@OnMethod(clazz="com.itheima.jvmoptimize.entity.UserEntity",method="/.*/")public static void traceExecute(){jstack();}
}
  • method="/.*/"/表示开始和结束,.*表示监控clazz的所有方法
  • jstack();当调用当前类时,会打印当前所有栈信息

4.3.3 上传btrace工具及其脚本

上传btrace工具及其脚本,并且把他的bin目录放到环境变量中。

在这里插入图片描述

btrace 3785 TracingUserEntity.java 

在这里插入图片描述

已经挂载到当前进程中,我们用jmeter发送请求。

在这里插入图片描述

但是加了btrace后,响应时间不是一般的长,平均都在300ms以上

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序-富文本编辑框的注意事项

富文本编辑框官网位置 表单组件 / editor (qq.com)https://developers.weixin.qq.com/miniprogram/dev/component/editor.html &#xff08;一&#xff09;富文本编辑框的作用 1.适用于一些表单的提交 2.这些表单内容需要自定义图片大小&#xff0c;编辑文字样式 主要用到的是…

【C++】10.list

list这个迭代器是双向迭代器&#xff0c;与vector的迭代器具有很大的区别&#xff0c;主要在于双向迭代器不支持&#xff0b;- 操作 正由于list的双向迭代器&#xff0c;因此<algorithm>中的sort()函数无法使用&#xff0c;list单独实现了一个sort()函数&#xff0c;但效…

统计信号处理基础 习题解答10-5

题目 通过令 并进行计算来重新推导MMSE估计量。提示&#xff1a;利用结果 解答 首先需要明确的是&#xff1a; 上式是关于观测值x 的函数 其次需要说明一下这个结果 和教材一样&#xff0c;我们用求期望&#xff0c;需要注意的是&#xff0c;在贝叶斯情况下&#xff0c;是个…

创刊即王炸?首个IF近7分,稳坐中科院1区!同领域全球第一!

【欧亚科睿学术】 01 期刊基本概况 【期刊类型】经济类SSCI 【出版社】SPRINGER出版社 【期刊概况】IF&#xff1a;8.0-9.0&#xff0c;JCR1区&#xff0c;中科院1区 【版面类型】正刊&#xff0c;仅少量版面 【预警情况】2020-2024年无预警记录 【收录年份】2016年被WO…

Facebook开户|Facebook做落地页的标准和建议

哈喽呀家人们下午好~今天Zoey来跟大家带来Facebook做落地页的标准和建议&#xff01;需要的家人建议点赞收藏啦&#xff01;&#xff01;用户通过点击你的推广链接、搜索引擎搜索结果页面的快照链接、社交媒体中的网页链接、电子邮件中的链接等进入你网站的特定页面&#xff0c…

tcp链接中的三次挥手是什么原因

一、tcp链接中的正常四次挥手过程&#xff1f; 刚开始双方都处于 ESTABLISHED 状态&#xff0c;假如是客户端先发起关闭请求。四次挥手的过程如下&#xff1a; 1、客户端打算关闭连接&#xff0c;此时会发送一个 TCP 首部 FIN 标志位被置为 1 的报文&#xff0c;也即 FIN 报文…

pytorch项目实战-分类模型李宏毅 21 机器学习第三次作业代码详解 CNN图片分类任务

CNN 卷积神经网络食物分类任务 前言一、数据集介绍二、CNN模型整体框架三、卷积神经网络代码详解3.1 导入需要使用的包3.2 数据集&#xff0c;数据加载器&#xff0c;数据增强操作3.2.1 数据增强3.2.2 数据集构建3.2.3 加载器构建 3.3 卷积神经网络构建3.4 训练代码3.4.1 半监督…

jmeter多用户登录并退出教程

有时候为了模拟更真实的场景&#xff0c;在项目中需要多用户登录并退出操作&#xff0c;大致参考如下 多用户登录前面已经实现&#xff1a;参考博文 多用户登录并退出jmx文件&#xff1a;百度网盘 提取码&#xff1a;0000 一、多用户退出操作 添加一个setUp线程组&#xff0…

Perplexity 搜索引擎刚刚推出了新的页面功能——维基百科可以扔了

Perplexity 允许用户根据搜索结果创建自定义页面 人工智能搜索引擎初创公司 Perplexity 推出了一项新功能&#xff0c;使其结果更具粘性&#xff0c;允许用户将研究转变为易于共享的页面。页面建立在 Perplexity 中现有的人工智能驱动的搜索功能之上&#xff0c;该功能使用与 …

云服务(ECS)Docker安装vulhub安装详解

本文以xshell进行远程控制 1.以ssh连接云服务器 ssh 服务器名公网ip [D:\~]$ ssh root47.99.138.9 在弹框中输入密码 2.安装docker curl -s http://get.docker.com/ | sh rootiZbp1fm14idjlfp53akni8Z:~# curl -s https://get.docker.com/ | sh # Executing docker insta…

万字长文,小白新手怎么开始做YOLO实验,从零开始教!整体思路在这里,科研指南针!

最近专栏来了很多的新手小白&#xff0c;对科研实验的过程感到困惑和无从下手&#xff0c;这篇文章就来讲解一下整体的科研流程&#xff0c;从选择数据集到发表论文的各个步骤&#xff0c;并针对大家在实验中常犯的错误进行解答。并且为大家提供通向我其他相关博客的指引&#…

激光焊接机作为一种高效、精密的焊接设备

激光焊接机是一种用于材料加工时激光焊接的机器&#xff0c;以下是对其的详细介绍&#xff1a; 1. 定义与别称&#xff1a; 激光焊接机&#xff0c;又常称为激光焊机、镭射焊机&#xff0c;是材料加工激光焊接时用的机器。 2. 工作原理&#xff1a; 激光焊接是利用高能量…

【计算机毕业设计】345大学生心理健康测评管理系统小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【数据结构与算法 | 二叉树篇】二叉树的前中后序遍历(递归版本)

1. 二叉树的概念 (1). 二叉树的结构 借用了一下力扣的模板 public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.val val;this.left left;this.righ…

Linux下的Git应用

1、卸载 2、安装 3、创建并初始化 4、配置 &#xff08;附加删除语句&#xff09; 5、查看&#xff08;tree .git/&#xff09; 6、增加和提交 7、打印日志 8、验证已操作工作

公告:公众号铁粉粉丝介绍以及说明

大家好&#xff0c;我是公众号博主--夏目 机械电气电机杂谈是我个人建立&#xff0c;为分享机械&#xff0c;电气&#xff0c;电机知识为主&#xff0c;闲谈杂聊社会时事&#xff0c;职场见闻&#xff0c;生活琐事&#xff0c;成长趣事&#xff0c;学习心得&#xff0c;读书观影…

C#WPF数字大屏项目实战06--报警信息

1、ItemsControl 简介 ItemsControl 是用来表示一些条目集合的控件&#xff0c;所以它叫条目控件&#xff0c;它的成员是一些其它控件的集合&#xff0c;其继承关系如下&#xff1a; 其常用的派生控件为&#xff1a;ListBox、ListView、ComboBox&#xff0c;为ItemsCo…

充电宝怎么选?充电宝目前什么牌子质量好耐用?盘点好用充电宝

充电宝怎么选&#xff1f;是不是很多朋友在选充电宝上非常的纠结&#xff1f;在买充电宝上面还是非常有讲究的&#xff01;市面上的充电宝虽然多&#xff0c;但是不排除很多存在安全隐患的&#xff0c;如果稍微没有挑选好充电宝的话&#xff0c;买来的充电宝极大可能是存在非常…

在 Kubesphere 中开启新一代云原生数仓 Databend

上周六&#xff0c;由 KubeSphere 社区联合 Databend 社区以及纵目科技共同组织的云原生 Meetup 北京站在北京圆满落幕。本次 Meetup 活动邀请到了 SkyWalking PMC 成员、青云科技架构及可观测性团队负责人、江苏纵目科技 APM 研发总监、青云科技容器产品经理、数元灵科技 CTO …

[线程与网络] 网络编程与通信原理(四):深入理解传输层UDP与TCP协议

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;Java …