Java虚拟机 - 实战篇

一、内存调优

1. 什么是内存泄漏

(1)内存溢出和内存泄漏

2. 监控Java内存的常用工具

(1)Top命令

(2)VisualVM

(3)Arthas

(4)Prometheus + Grafana

(5)堆内存状况的对比

3. 内存泄漏的常见场景

(1)equals()和hashCode()导致的内存泄漏

package com.itheima.jvmoptimize.leakdemo.demo2;import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;import java.util.Objects;public class Student {private String name;private Integer id;private byte[] bytes = new byte[1024 * 1024];public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}@Overridepublic boolean equals(Object o) {if (this == o) {return true;}if (o == null || getClass() != o.getClass()) {return false;}Student student = (Student) o;return new EqualsBuilder().append(id, student.id).isEquals();}@Overridepublic int hashCode() {return new HashCodeBuilder(17, 37).append(id).toHashCode();}
}

(2)内部类引用外部类

package com.itheima.jvmoptimize.leakdemo.demo3;import java.io.IOException;
import java.util.ArrayList;public class Outer{private byte[] bytes = new byte[1024 * 1024]; //外部类持有数据private static String name  = "测试";class Inner{private String name;public Inner() {this.name = Outer.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 Outer().new Inner());}}
}
package com.itheima.jvmoptimize.leakdemo.demo4;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class Outer {private byte[] bytes = new byte[1024 * 1024 * 10];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(new Outer().newList());}}
}

package com.itheima.jvmoptimize.leakdemo.demo3;import java.io.IOException;
import java.util.ArrayList;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 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());}}
}
package com.itheima.jvmoptimize.leakdemo.demo4;import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class Outer {private byte[] bytes = new byte[1024 * 1024 * 10];public static 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());}}
}

(3)ThreadLocal的使用

package com.itheima.jvmoptimize.leakdemo.demo5;import java.util.concurrent.*;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);}}
}

(4)String的intern方法

package com.itheima.jvmoptimize.leakdemo.demo6;import org.apache.commons.lang3.RandomStringUtils;import java.util.ArrayList;
import java.util.List;public class Demo6 {public static void main(String[] args) {while (true){List<String> list = new ArrayList<String>();int i = 0;while (true) {//String.valueOf(i++).intern(); //JDK1.6 perm gen 不会溢出list.add(String.valueOf(i++).intern()); //溢出}}}
}

(5)通过静态字段保存对象

单例模式 -> 懒加载

package com.itheima.jvmoptimize.leakdemo.demo7;import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;@Lazy //懒加载
@Component
public class TestLazy {private byte[] bytes = new byte[1024 * 1024 * 1024];
}

Spring的Bean中不要长期存放大对象,如果是缓存用于提升性能,尽量设置过期时间

package com.itheima.jvmoptimize.leakdemo.demo7;import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;import java.time.Duration;public class CaffineDemo {public static void main(String[] args) throws InterruptedException {Cache<Object, Object> build = Caffeine.newBuilder()//设置100ms之后就过期.expireAfterWrite(Duration.ofMillis(100)).build();int count = 0;while (true){build.put(count++,new byte[1024 * 1024 * 10]);Thread.sleep(100L);}}
}

(6)资源没有正常关闭

package com.itheima.jvmoptimize.leakdemo.demo1;import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.sql.*;//-Xmx50m -Xms50m
public class Demo1 {// JDBC driver name and database URLstatic final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";static final String DB_URL = "jdbc:mysql:///bank1";//  Database credentialsstatic final String USER = "root";static final String PASS = "123456";public static void leak() throws SQLException {//Connection conn = null;Statement stmt = null;Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);// executes a valid querystmt = conn.createStatement();String sql;sql = "SELECT id, account_name FROM account_info";ResultSet rs = stmt.executeQuery(sql);//STEP 4: Extract data from result setwhile (rs.next()) {//Retrieve by column nameint id = rs.getInt("id");String name = rs.getString("account_name");//Display valuesSystem.out.print("ID: " + id);System.out.print(", Name: " + name + "\n");}}public static void main(String[] args) throws InterruptedException, SQLException {while (true) {leak();}}
}

4. 内存泄漏的解决方案

(1)内存快照

package com.itheima.jvmoptimize.matdemo;import org.openjdk.jol.info.ClassLayout;import java.util.ArrayList;
import java.util.List;//-XX:+HeapDumpBeforeFullGC -XX:HeapDumpPath=D:/jvm/dump/mattest.hprof
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);
}

(2)修复问题

总结:

二、GC调优

1. GC调优的核心指标

(1)垃圾回收吞吐量

(2)延迟

(3)内存使用量

2. GC调优的方法

(1)发现问题

(2)常见的GC模式

(3)解决GC问题的手段

(3-1)优化基础JVM参数

(3-2)减少对象产生

(3-3)更换垃圾回收器

(3-4)优化垃圾回收器参数

三、性能调优

1. 性能调优解决的问题

2. 性能调优的方法

(1)线程转储的查看方式


 

(2)请求单个服务处理时间特别长

(3)程序启动之后运行正常,但是在运行一段时间之后无法处理任何的请求(内存和GC正常)

3. JMH基准测试框架

测试代码:

package org.sample;import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.concurrent.TimeUnit;//执行5轮预热,每次持续1秒
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
//执行一次测试
@Fork(value = 1, jvmArgsAppend = {"-Xms1g", "-Xmx1g"})
//显示平均时间,单位纳秒
@BenchmarkMode(Mode.AverageTime)
// 指定显示结果单位
@OutputTimeUnit(TimeUnit.NANOSECONDS)
// 变量共享范围
@State(Scope.Benchmark)
public class HelloWorldBench {@Benchmarkpublic int test1() {int i = 0;i++;return i;}public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(HelloWorldBench.class.getSimpleName()).resultFormat(ResultFormatType.JSON).forks(1).build();new Runner(opt).run();}
}

如果不将i返回,JIT会直接将这段代码去掉,因为它认为你不会使用i那么我们对i进行的任何处理都是没有意义的,这种代码无法执行的现象称之为死代码

我们可以将i返回,或者添加黑洞来消费这些变量,让JIT无法消除这些代码:

package org.sample;import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.concurrent.TimeUnit;//执行5轮预热,每次持续1秒
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
//执行一次测试
@Fork(value = 1, jvmArgsAppend = {"-Xms1g", "-Xmx1g"})
//显示平均时间,单位纳秒
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@State(Scope.Thread)
public class DateBench {private static String sDateFormatString = "yyyy-MM-dd HH:mm:ss";private Date date = new Date();private LocalDateTime localDateTime = LocalDateTime.now();private static ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal();private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");@Setuppublic void setUp() {SimpleDateFormat sdf = new SimpleDateFormat(sDateFormatString);simpleDateFormatThreadLocal.set(sdf);}@Benchmarkpublic String date() {SimpleDateFormat simpleDateFormat = new SimpleDateFormat(sDateFormatString);return simpleDateFormat.format(date);}@Benchmarkpublic String localDateTime() {return localDateTime.format(formatter);}@Benchmarkpublic String localDateTimeNotSave() {return localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));}@Benchmarkpublic String dateThreadLocal() {return simpleDateFormatThreadLocal.get().format(date);}public static void main(String[] args) throws RunnerException {Options opt = new OptionsBuilder().include(DateBench.class.getSimpleName()).resultFormat(ResultFormatType.JSON).forks(1).build();new Runner(opt).run();}
}

package com.itheima.jvmoptimize.performance.practice.controller;import com.itheima.jvmoptimize.performance.practice.entity.User;
import com.itheima.jvmoptimize.performance.practice.entity.UserDetails;
import com.itheima.jvmoptimize.performance.practice.service.UserService;
import com.itheima.jvmoptimize.performance.practice.vo.UserVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.text.SimpleDateFormat;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;@RestController
@RequestMapping("/puser")
public class UserController {@Autowiredprivate UserService userService;private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");//初始代码public List<UserVO> user1(){//1.从数据库获取前端需要的详情数据List<UserDetails> userDetails = userService.getUserDetails();//2.获取缓存中的用户数据List<User> users = userService.getUsers();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//3.遍历详情集合,从缓存中获取用户名,生成VO进行填充ArrayList<UserVO> userVOS = new ArrayList<>();for (UserDetails userDetail : userDetails) {UserVO userVO = new UserVO();//可以使用BeanUtils对象拷贝userVO.setId(userDetail.getId());userVO.setRegister(simpleDateFormat.format(userDetail.getRegister2()));//填充namefor (User user : users) {if(user.getId().equals(userDetail.getId())){userVO.setName(user.getName());}}//加入集合userVOS.add(userVO);}return userVOS;}//使用HasmMap存放用户名字public List<UserVO> user2(){//1.从数据库获取前端需要的详情数据List<UserDetails> userDetails = userService.getUserDetails();//2.获取缓存中的用户数据List<User> users = userService.getUsers();//将list转换成hashmapHashMap<Long, User> map = new HashMap<>();for (User user : users) {map.put(user.getId(),user);}SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//3.遍历详情集合,从缓存中获取用户名,生成VO进行填充ArrayList<UserVO> userVOS = new ArrayList<>();for (UserDetails userDetail : userDetails) {UserVO userVO = new UserVO();//可以使用BeanUtils对象拷贝userVO.setId(userDetail.getId());userVO.setRegister(simpleDateFormat.format(userDetail.getRegister2()));//填充nameuserVO.setName(map.get(userDetail.getId()).getName());//加入集合userVOS.add(userVO);}return userVOS;}//优化日期格式化public List<UserVO> user3(){//1.从数据库获取前端需要的详情数据List<UserDetails> userDetails = userService.getUserDetails();//2.获取缓存中的用户数据List<User> users = userService.getUsers();//将list转换成hashmapHashMap<Long, User> map = new HashMap<>();for (User user : users) {map.put(user.getId(),user);}//3.遍历详情集合,从缓存中获取用户名,生成VO进行填充ArrayList<UserVO> userVOS = new ArrayList<>();for (UserDetails userDetail : userDetails) {UserVO userVO = new UserVO();//可以使用BeanUtils对象拷贝userVO.setId(userDetail.getId());userVO.setRegister(userDetail.getRegister().format(formatter));//填充nameuserVO.setName(map.get(userDetail.getId()).getName());//加入集合userVOS.add(userVO);}return userVOS;}@GetMapping//使用stream流改写for循环public List<UserVO> user4(){//1.从数据库获取前端需要的详情数据List<UserDetails> userDetails = userService.getUserDetails();//2.获取缓存中的用户数据List<User> users = userService.getUsers();//将list转换成hashmapMap<Long, User> map = users.stream().collect(Collectors.toMap(User::getId, o -> o));//3.遍历详情集合,从缓存中获取用户名,生成VO进行填充return userDetails.stream().map(userDetail -> {UserVO userVO = new UserVO();//可以使用BeanUtils对象拷贝userVO.setId(userDetail.getId());userVO.setRegister(userDetail.getRegister().format(formatter));//填充nameuserVO.setName(map.get(userDetail.getId()).getName());return userVO;}).collect(Collectors.toList());}//使用并行流优化性能public List<UserVO> user5(){//1.从数据库获取前端需要的详情数据List<UserDetails> userDetails = userService.getUserDetails();//2.获取缓存中的用户数据List<User> users = userService.getUsers();//将list转换成hashmapMap<Long, User> map = users.parallelStream().collect(Collectors.toMap(User::getId, o -> o));//3.遍历详情集合,从缓存中获取用户名,生成VO进行填充return userDetails.parallelStream().map(userDetail -> {UserVO userVO = new UserVO();//可以使用BeanUtils对象拷贝userVO.setId(userDetail.getId());userVO.setRegister(userDetail.getRegister().format(formatter));//填充nameuserVO.setName(map.get(userDetail.getId()).getName());return userVO;}).collect(Collectors.toList());}
}

在SpringBoot项目中整合JMH:

1、pom文件中添加依赖:

<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>${jmh.version}</version><scope>test</scope>
</dependency>
<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>${jmh.version}</version><scope>test</scope>
</dependency>
<properties><java.version>8</java.version><jmh.version>1.37</jmh.version>
</properties>

2、测试类中编写:

package com.itheima.jvmoptimize;import com.itheima.jvmoptimize.performance.practice.controller.UserController;
import org.junit.jupiter.api.Test;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.results.format.ResultFormatType;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import org.springframework.boot.SpringApplication;
import org.springframework.context.ApplicationContext;import java.io.IOException;
import java.util.concurrent.TimeUnit;//执行5轮预热,每次持续1秒
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
//执行一次测试
@Fork(value = 1, jvmArgsAppend = {"-Xms1g", "-Xmx1g"})
//显示平均时间,单位纳秒
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Benchmark)
public class PracticeBenchmarkTest {private UserController userController;private ApplicationContext context;//初始化将springboot容器启动 端口号随机@Setuppublic void setup() {this.context = new SpringApplication(JvmOptimizeApplication.class).run();userController = this.context.getBean(UserController.class);}//启动这个测试用例进行测试@Testpublic void executeJmhRunner() throws RunnerException, IOException {new Runner(new OptionsBuilder().shouldDoGC(true).forks(0).resultFormat(ResultFormatType.JSON).shouldFailOnError(true).build()).run();}//用黑洞消费数据,避免JIT消除代码@Benchmarkpublic void test1(final Blackhole bh) {bh.consume(userController.user1());}@Benchmarkpublic void test2(final Blackhole bh) {bh.consume(userController.user2());}@Benchmarkpublic void test3(final Blackhole bh) {bh.consume(userController.user3());}@Benchmarkpublic void test4(final Blackhole bh) {bh.consume(userController.user4());}@Benchmarkpublic void test5(final Blackhole bh) {bh.consume(userController.user5());}
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C++STL简介】——我与C++的不解之缘(八)

前言 学过了C的模版&#xff0c;接下来学习C中的STL&#xff08;标准模版库&#xff09;&#xff0c;先来了解一下STL是啥 一、什么是STL STL&#xff08;standard template libaray 标准模版库&#xff09;&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的…

cmake的下载与安装

介绍&#xff1a; CMake是一个跨平台的安装&#xff08;编译&#xff09;工具&#xff0c;可以用简单的语句来描述所有平台的安装(编译过程)。 能够输出各种各样的makefile或者project文件&#xff0c;能测试编译器所支持的C特性,类似UNIX下的automake。 CMake 的组态档取名为…

[Java]SpringBoot能力进阶

配置优先级 SpringBoot中支持三种格式的配置文件 优先级: application.properties文件 > application.yml文件 > application.yaml文件 SpringBoot除了通过配置文件配置属性, 还支持Java系统属性和命令行参数的方式 进行属性配置 1.在IDEA中配置java系统属性和命令行参…

网络安全-shire写任务计划、反弹shell、写私钥

目录 一、环境 二、 介绍 三、开始做题 四、写公钥 一、环境 网上自己找 二、 介绍 我们经过前面文章很清楚知道&#xff0c;shiro是将数据存储在内存当中&#xff0c;内存落盘实现一个数据存储&#xff0c;而当其结合python&#xff0c;python将登录的session存储到shiro里…

python绘制月亮

import matplotlib import matplotlib.pyplot as plt import moviepy.editor as mpymatplotlib.rcParams[font.family] SimHei# 坐标列表 positions [(0, 0), (1 / 4, 1 / 4), (1 / 3, 1 / 4), (1 / 2, 1 / 4), (2 / 3, 1 / 4),(3 / 4, 1 / 4), (1, 1 / 4), (5 / 4, 1 / 4), …

桌面上的文件突然不见了怎么找回?快速恢复技巧分享

在日常使用电脑的过程中&#xff0c;我们习惯于将经常使用的文件或者快捷方式放置在桌面上&#xff0c;以便于快速访问。然而&#xff0c;有时我们会发现桌面上的某些文件突然不见了&#xff0c;这可能会让人感到惊慌和困惑。面对这种情况&#xff0c;我们应该如何找回这些突然…

路由器全局配置DHCP实验简述

一、路由器配置 reset saved-configuration Warning: The action will delete the saved configuration in the device. The configuration will be erased to reconfigure. Continue? [Y/N]:y Warning: Now clearing the configuration in the device. Info: Succeeded in c…

02 基于STM32的按键控制继电器驱动电机

本专栏所有源资料都免费获取&#xff0c;没有任何隐形消费。 注意事项&#xff1a;STM32仿真会存在各种各样BUG&#xff0c;且尽量按照同样仿真版本使用。本专栏所有的仿真都采用PROTEUS8.15。 本文已经配置好STM32F103C8T6系列&#xff0c;在PROTUES仿真里&#xff0c;32单片…

教程 | ArcGIS Pro如何自动保存数据编辑内容

目录 1、工程自动保存 2、数据编辑自动保存 世界上最痛苦的事情就是&#xff1a; 软件崩溃&#xff0c;我没保存&#xff01;&#xff01;&#xff01; 电脑死机&#xff0c;我没保存&#xff01;&#xff01;&#xff01; 突然断电&#xff0c;我没保存&#xff01;&…

开源项目的悲哀

开源下载器 Aria 的开发者因为其项目被诈骗人员使用&#xff0c;导致开发者遭受跨省追捕&#xff0c;作者于 2024 年 8 月 16 日在 GitHub 上宣布删除了项目的全部源码。 Aria 是一个高性能、轻量级、易于使用的文件下载框架&#xff0c;主要应用于Android 平台&#xff0c;拥有…

10个A/B测试指标以分析结果和衡量成功

为什么A/B测试分析很重要&#xff1f; 到现在&#xff0c;您可能已经熟悉了A/B测试的基本概念及其用途。 简而言之&#xff0c;A/B测试是将两个或多个着陆页、营销资产或单个元素&#xff08;如标题&#xff09;进行对比&#xff0c;以帮助您找出哪个表现最好。 这些测试帮助…

Varjo在芬兰开设新工厂,以满足国防部门在XR模拟训练中的需求

在军事国防领域&#xff0c;全新技术的投入使用最看重的就是保密与安全。作为全球领先的XR头戴式显示器提供商Varjo&#xff0c;近日正式宣布将在位于芬兰的赫尔辛基开设一家新的安全制造工厂。 此次工厂扩建将使Varjo能够满足国防训练和模拟领域对其高分辨率XR解决方案日益增…

Qwen2-VL环境搭建推理测试

引子 2024年8月30号&#xff0c;阿里推出Qwen2-VL&#xff0c;开源了2B/7B模型&#xff0c;处理任意分辨率图像无需分割成块。之前写了一篇Qwen-VL的博客&#xff0c;感兴趣的童鞋请移步&#xff08;Qwen-VL环境搭建&推理测试-CSDN博客&#xff09;&#xff0c;这么小的模…

揭秘!当业务方需求模糊,产品经理如何施展‘化雾为金’的神奇策略!

引言 在产品管理的实践中&#xff0c;产品经理经常会遇到业务方无法清晰表达需求的情况。这可能是由于业务方对问题的理解不够深入&#xff0c;或者缺乏将业务需求转化为产品需求的经验。作为资深产品经理&#xff0c;我们需要采取一系列策略来应对这一挑战&#xff0c;确保产…

​‌Macbook如何玩《黑神话:悟空》‌2024最新详细方法

‌Mac用户可以通过几种方法玩《黑神话&#xff1a;悟空》‌。 ‌使用虚拟机‌&#xff1a;通过Parallels Desktop等虚拟机软件&#xff0c;在Mac上运行Windows系统&#xff0c;并在其中安装和运行《黑神话悟空》。这种方法需要Mac电脑满足游戏的基础配置要求。 不过如果电脑有虚…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于模型-数据混合驱动的区域能源互联网韧性在线评估》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

带你深入了解C语言指针(五)

目录 前言一、数组和指针笔试题解析1.整型数组2.字符数组2.1 sizeof2.2strlen()2.2.1字符数组2.2.2字符串2.2.3字符串指针2.2.4二维数组 总结 前言 前面我们已经讲指针的主要知识学完了&#xff0c;这期我们主要进行一些题目的分析&#xff1b;话不多说&#xff0c;正文开始。…

JAVA操作Itext向pdf模板中填充数据,图片,复选框!

第一步模板制作&#xff1a; 在word中先把模板画好&#xff0c;另存为pdf&#xff0c;具体步骤为&#xff1a;wps—》工具------》开发工具。如图所示 图片也是设置为文本域&#xff0c;千万不要设置为图片域&#xff0c;否则图片会被覆盖&#xff01; 图片也是设置为文本域&a…

攻防世界---->流浪者

做题笔记。 下载 查壳。 32ida打开。 程序运行状态&#xff1a; 一开始以为&#xff0c;&#xff0c;&#xff0c;base62 去解密 不对。。哈哈哈。 跟进看看。 动调一下发现&#xff0c;input不在这个函数里面。 对函数进行跟踪。 逆推就好。 先通过密文&#xff0c;逆推密文…

动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct

动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG&#xff1a;rerank模型微调实践 bge-reranker-v2-m3动手学习RAG&#xff1a;迟交互模型colbert微调实践 bge-m3动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct动手学…