- 博客(84)
- 收藏
- 关注
原创 【Python】拯救你Markdown文件中绝对路径的图片!
在用Md记笔记时,可能由于萌新阶段,会把图片保存到本地的某个绝对路径下,如下图。当我们要移动md文件时,发现图片带不走了,手动改非常繁琐。本博客给你提供一个转换工具。
2025-02-28 17:28:26
191
原创 【java API】leetcode常用刷题API及ACM模式
如果要输入 int 或 float 类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用 hasNextXxx() 方法进行验证,再使用 nextXxx() 来读取。掌握这些API和技巧后,可以高效解决栈和链表相关的算法题,注意边界条件和指针操作的细节!输入的数据为:runoob com。可以看到 com 字符串并未输出。输入的数据为:runoob。
2025-02-10 19:50:56
1446
原创 【分布式认证】Token OAuth2 JWT
(1)资源拥有者打开客户端,客户端要求资源拥有者给予授权,它将浏览器被重定向到授权服务器,重定向时会附加客户端的身份信息。参数列表如下:client_id:客户端接入标识。response_type:授权码模式固定为code。scope:客户端权限。redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码)。(2)浏览器出现向授权服务器授权页面,之后将用户同意授权。
2025-01-30 17:05:03
288
原创 【JVM】总结篇之GC性能优化案例
这种系统我们一般至少要三四台机器去支撑,假设我们部署了三台机器,也就是每台每秒钟大概处理完成100单左右,也就是每秒大概有100个订单对象在堆空间的新生代内生成,一个订单对象的大小跟里面的字段多少及类型有关,比如int类型的订单id和用户id等字段,double类型的订单金额等,int类型占用4字节,double类型占用8字节,初略估计下一个订单对象大概1KB左右,也就是说每秒会有100KB的订单对象分配在新生代内。可以看到,Point这个聚合量经过逃逸分析后,发现他并没有逃逸,就被替换成两个标量了。
2025-01-16 22:12:42
1310
原创 【JVM】总结篇之GC日志分析 和 案例
OutOfMemoryError: GC overhead limit exceeded 是 Java 虚拟机(JVM)抛出的一个错误,表明虽然堆内存没有完全被耗尽,但是垃圾收集器(GC)花费了太多时间来回收很少量的内存空间,效率低下。通过查看GC日志可以发现,系统在频繁性的做FULL GC,但是却没有回收掉多少空间,那么引起的原因可能是因为内存不足,也可能是存在内存泄漏的情况,接下来我们要根据堆dump文件来具体分析。第1步:定位问题代码块 (jvisualvm分析 MAT分析)(拼多多、字节跳动)
2025-01-06 21:38:21
1046
原创 【JVM】总结篇之各垃圾回收器适用场景
Shenandoah GC Red Hat研发Shenandoah团队对外宣称,Shenandoah垃圾回收器的暂停时间与堆大小无关,这意味着无论将堆设置为200 MB还是200GB,99.9%的目标都可以把垃圾收集的停顿时间限制在十毫秒以内。不过实际使用性能将取决于实际工作堆的大小和工作负载。Epsilon GC (http://openjdk.java.net/jeps/318),只做内存分配,不做垃圾回收的GC,对于运行完就退出的程序非常适合。称为无操作的垃圾收集器。
2025-01-05 21:19:08
384
原创 【JVM】总结篇之垃圾回收★
内存溢出OOM内存泄漏(Memory Leak)严格来说,只有对象不会再被程序用到了,但是GC又不能回收他们的情况,才叫内存泄漏。但实际情况很多时候一些不太好的实践(或疏忽)会导致对象的生命周期变得很长甚至导致OOM,也可以叫做宽泛意义上的“内存泄漏”。内存泄露的情况:1.静态集合2.单例模式3.非静态内部类持有外部类4.各种连接,如数据库连接、网络连接和IO连接等5.变量不合理的作用域一般而言,一个变量的定义的作用范围大于其使用范围,很有可能会造成内存泄漏。
2025-01-05 20:16:47
1170
原创 【JVM】总结篇之对象内存布局 执行引擎
TLAB 把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存,称为本地线程分配缓冲区,(TLAB ,Thread Local Allocation Buffer)虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定。将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。对象创建方法,对象的内存分配。
2025-01-05 13:52:14
732
原创 【JVM】总结篇-运行时内存篇
而很多对象都是朝生夕死的,如果分代的话,把新创建的对象放到某一地方,当GC 的时候先把这块存储“朝生夕死”对象的区域进行回收,这样就会腾出很大的空间出来。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的作用就是为了将这些符号引用转换为调用方法的直接引用。如果Java虚拟机栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的虚拟机栈,那Java虚拟机将会抛出—个。不会随着程序的运行需要更大的空间。
2025-01-04 21:47:23
869
原创 【JVM】总结篇-类的加载篇之 类的加载器 和ClassLoader分析
*** 编写findClass方法的逻辑*/@Override// 获取类的class文件字节数组} else {//直接生成class对象/*** 编写获取class文件并转换为字节码流的逻辑 * @param className * @return*/// 读取类文件的字节try {// 读取类文件的字节码= -1) {/*** 类文件的完全路径*/try {//创建自定义的类的加载器1//创建自定义的类的加载器2。
2025-01-04 14:59:39
1207
原创 【JVM】总结篇-字节码篇
自动拆箱的过程是通过 Integer 的 intValue() 方法完成的,因此 x.intValue() 会将 Integer 对象 x 中的值提取为 int 类型,然后与 y 进行比较。在 x == y 的比较中,x 是一个对象,y 是一个基本类型(int)。Java 会进行 自动拆箱,将 Integer 对象 x 拆箱成 int 类型,然后进行基本类型的比较。x 是一个 Integer 类型对象,而 y 是一个原始的 int 类型。假设这段代码已经被编译成字节码,我们可以查看相应的字节码操作。
2025-01-01 10:46:16
1244
原创 【JDBC】ResultSet.TYPE_FORWARD_ONLY TYPE_SCROLL_INSENSITIVE 和TYPE_SCROLL_SENSIT
与 ResultSet.TYPE_SCROLL_INSENSITIVE。和 ResultSet.TYPE_SCROLL_SENSITIVE。
2024-12-26 17:31:56
154
原创 【JDBC】ResultSet能得到记录的数量
ResultSet 本身并没有提供直接获取记录数的方法。你可以通过遍历结果集、使用 last() 和 getRow() 方法,或执行一个额外的 COUNT(*) 查询来获取记录数。
2024-12-26 17:23:01
415
原创 【JDBC】使用原生JDBC,数据量很大且内存空间较小的情况下,JavaHeap溢出
你的问题主要是数据库查询返回结果集过大导致内存不足。优化数据库查询,通过分页和字段选择减少结果集大小;分批次处理数据,避免一次性加载所有数据;适当调整 JVM 堆内存配置,缓解现有内存压力;优化线程池配置,控制并发任务数。
2024-12-26 17:14:41
965
原创 【MyBatis BUG记录】设置参数映射(ParameterMapping)jdbcType是null
这样,MyBatis就能够正确地处理从数据库检索到的数据,并将其转换为Java对象中的Long值,或者在执行更新操作时,将Java对象中的Long值转换为数据库中的BIGINT值。这是因为BIGINT在MySQL中是一个64位的整数类型,能够存储非常大的整数,而Java中的Long类型也是一个64位的整数类型,因此它们之间有着自然的对应关系。Java代码:查看你的Java代码,特别是与这个错误相关的部分,确保你在调用MyBatis的API时传递了正确的参数类型和值。
2024-12-26 16:39:28
841
原创 【微服务】不同微服务之间用户信息的获取和传递方案
要在每个微服务中获取用户信息,可以采用以下几种方法:1.通过认证和授权:在用户登录时,进行身份认证并生成访问令牌(token)。将该令牌与用户相关的信息存储在安全的方式下,比如使用JWT(JSON Web Token)等。在每个微服务中,对请求进行校验,验证令牌的有效性,并解析出用户信息。2.使用网关或API管理工具:通过引入网关或API管理工具,所有请求都经过该组件进行路由和处理。在网关中,可以将用户信息添加到请求头部或者设置上下文变量,在微服务中可以方便地从请求中提取用户信息。至于在微服务之间。
2024-11-08 16:03:02
1947
原创 多数据源切换方案
根据基础数据库表中配置的其他数据源,在代码中动态切换数据源,springboot如何实现?我刚启动项目时,读取的是base数据源,在代码中,我希望从base库的db表中得到其他数据源的信息,然后选取这条信息进行切换数据源,读取该连接中某张表的数据可以使用Spring Boot的AbstractRoutingDataSource来实现动态数据源切换。首先,创建一个自定义的RoutingDataSource,它会根据某种条件选择合适的数据源。
2024-09-10 20:44:40
420
原创 【MYSQL】5 性能优化
•Com_insert:插入操作的次数。•Innodb_rows_inserted:执行INSERT操作插入的行数。• Innodb_rows_updated:执行UPDATE操作更新的行数。• Innodb_rows_deleted:执行DELETE操作删除的行数。• Innodb_rows_read:Select查询返回的行数。• Slow_queries:慢查询的次数。• Com_select:查询操作的次数。• Com_update:更新操作的次数。• Com_delete:删除操作的次数。
2024-08-31 15:47:43
1029
原创 【MYSQL索引】2 索引创建原则
① 冗余索引举例:建表语句如下我们知道,通过 idx_name_birthday_phone_number 索引就可以对 name 列进行快速搜索,再创建一个专门针对 name 列的索引就算是一个 冗余索引 ,维护这个索引只会增加维护的成本,并不会对搜索有什么好处。② 重复索引col2 INT,我们看到,col1 既是主键、又给它定义为一个唯一索引,还给它定义了一个普通索引,可是主键本身就会生成聚簇索引,所以定义的唯一索引和普通索引是重复的,这种情况要避免。
2024-08-31 14:48:03
905
原创 【MySQL索引】4索引优化
COUNT(*):最常用且效率最高的方法,大多数现代数据库系统对此做了专门的优化。COUNT(1):在性能上与 COUNT(*) 基本相同,大多数数据库系统会将它们处理得一样快。COUNT(具体字段):可能会更慢,特别是在字段上没有索引时。它只计算非 NULL 的字段值,因此可能需要扫描整个表来完成计数。
2024-08-31 14:44:45
1578
原创 【线程工具类】优雅关停 和 捕获异常信息
开始有序关闭线程池,与此同时,已提交的任务将继续执行,但不再接收新的任务,如果线程池已关闭,此方法调用不会产生额外影响。(不会等任务执行完毕的意思是这个方法不会阻塞,也就是说任务队列的任务会继续执行,但是其他的线程可能会抢在这些任务之前执行,而awaitTermination()方法可以实现阻塞并等待任务执行完毕)execute在任务执行时,如果出现异常,默认在执行线程中会抛出异常并打印堆栈信息,且会删除执行的线程,本次execute要执行的任务就视为结束了,异常的抛出不会中断调用者线程;
2024-08-19 10:32:15
368
原创 【K8S】搭建K8S集群教程
修改daemon配置文件/etc/docker/daemon.json来使用加速器。新加入node报错:(应该是复制虚拟机没完全克隆导致的)2.zcytwo kubelet 状态错误。1.zcythree没启动docker。2.5 部署CNI网络插件。从节点notReady。
2024-07-31 22:15:55
807
1
原创 【缓存】SpringCache
是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码。Spring Cache只是提供了一层抽象,底层可以切换不同的cache实现。具体就是通过接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。描述使用EhCache作为缓存技术使用Google的GuavaCache作为缓存技术使用Redis作为缓存技术。
2024-07-29 20:55:36
713
原创 【Redis】 缓存双写一致性
给缓存设置过期时间,定期清理缓存并回写,是保证最终一致性的解决方案。我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力即可。也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存,达到一致性,切记,要以mysql的数据库写入库为准。上述方案和后续落地案例是调研后的主流+成熟的做法,但是考虑到各个公司业务系统的差距,不是100%绝对正确,不保证绝对适配全部情况,请同学们自行酌情选择打法,合适自己的最好。
2024-03-11 16:11:03
652
原创 @Valid和@NotNull字段校验使用
为了捕获@Valid和@NotNull校验后抛出的异常/*** 异常通用处理*/@Slf4j//处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常//处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。Result.failed换成你自己的统一处理类。
2024-01-23 21:57:37
594
1
原创 ubuntu 20.04文件系统根目录空间不足
sort -hr 将输出按照文件大小进行排序,-h 表示使用人类可读的格式,-r 表示逆序排序(从大到小)。要查看特定目录下各个文件的大小,您可以使用 du 命令。du 命令用于显示文件或目录的磁盘使用情况。如果以上方法仍无法解决问题,您可能需要进一步调查哪些文件或目录占用了大量空间,并相应地采取措施。这些命令将显示目录中每个文件和子目录的大小,以及总大小。-h 选项用于以人类可读的格式显示文件大小(如 KB、MB、GB 等)。-a 选项显示所有文件和目录的大小。如何查看文件下各文件的大小。
2024-01-06 21:46:52
1554
原创 【微服务合集】
但是,容器的网络IP其实是一个虚拟的IP,其值并不固定与某一个容器绑定,如果我们在开发时写死某个IP,而在部署时很可能MySQL容器的IP会发生变化,连接会失败。MybatisPlus的批处理是基于PrepareStatement的预编译模式,然后批量提交,最终在数据库执行时还是会有多条insert语句,逐条插入数据。MySQL的客户端连接参数rewriteBatchedStatements。MyBatisPlus也支持手写SQL的。发现可以互联,没有问题。
2024-01-06 21:41:40
736
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人