- 博客(96)
- 资源 (1)
- 收藏
- 关注
原创 定位哪一行代码导致CPU飙高
2、通过top命令,按shift+P 按CPU占用排序,找到飙高的进程ID,即pid;公式:jstack 进程id | grep 16进制线程id -A 20。3、ps H -eo pid,tid,%cpu | grep 进程id。1、死循环飙高CPU,while true打印UUID即可;解读:根据进程id找到导致CPU飙升的线程id,即tid;4、线程都是16进制,将线程id转换为16进制。公式:printf ‘0x%x\n’ 线程id。得到3762的16进制:0xeb2。6、寻找公司包名的问题行。
2025-01-06 12:13:55
129
原创 前端切换页面时,保存滚动位置
在A页面时滚动到某位置,切到B页面,再切回A页面时保留滚动的位置。原理:切出A页面时记录下高度,切回A页面时恢复高度。
2024-11-04 11:52:07
261
原创 Spring Boot读取resources目录下文件(打成jar可用),并放入Guava缓存
Guava的缓存类似于redis。比起Redis,Guava的缓存优势在于更轻更快,而Redis的优势在于支持分布式。
2024-10-08 17:51:39
630
原创 Java把文件链接转成流,返回给前端下载
背景:已知Java拿到了一个PDF链接(http://xxx.xxx.pdf),直接把链接返给前端的话,前端是不能点击直接下载的,需要后端先。这样前端一点击,就能。
2024-08-26 16:17:52
1165
原创 干货!完全体设计模式!工作中最常用
用于挪去臃肿的业务代码,还可以进一步升级加上模板模式,以及抽取成Starter。首先,抽象的处理业务的Handler,也就是 “模板”用于干掉大量的if-else。其次,模板的一种具体实现。然后,工厂的注册和生产。
2024-05-14 20:08:53
308
原创 批处理任务的通用工具类
1、只要是批处理任务(比如下发几万张优惠券,发京豆),就必定用到线程池、不丢包。2、业务场景:下发五万张优惠券,要求一张都不能少。
2024-05-04 11:08:29
302
原创 扫码登录到底是怎么实现的?
2、接着,APP 扫描这个二维码,把 APP 的 token 信息、二维码 ID 发送给 Server 端,4、于是,用户确认登录后,携带临时 token 给到 server,server 端修改二维码状态。3、此时,网页端展示的二维码状态会提示已扫码,待确认。不难发现,整个实现过程并不难,核心的设计就是一个特定的二维码,去连接了 APP。1、首先,在网页端打开登录页面,展示一个二维码,这个二维码有一个唯一编号是服。5、最后,网页端轮询到状态变化并获取到 token,从而完成扫码授权。提示确认授权的操作。
2024-03-27 11:20:51
591
原创 Mysql相关
B树相对于AVL(平衡二叉树)来说,AVL树每个节点只能有2个子树,而B树允许有多个子树,这样可以大大降低树的高度,树的层数越多,磁盘IO次数就越多,B树的高度低,层数少,所以磁盘IO次数少,适合作为硬盘存储的数据结构;B+树是B树的进一步拓展,B+树只有叶子节点才存储行数据,而每一层存储的数据量有限,这么设计可以进一步降低树的高度,减少磁盘IO次数,加快查找速度。索引的数据结构是B+树,为什么要用这个数据结构?
2024-03-25 16:35:23
237
原创 开发运维小技巧记录
1、查看服务器的内存大小命令是 free -m。2、查看服务器的任务管理器命令是 top,再按shift+M 按内存占用排序。按shift+P 按CPU占用排序。按shift+T 按耗时排序。
2024-03-22 16:47:57
157
原创 TopK问题
堆在Java中的实现是优先级队列:PriorityQueue。(找最大数用小顶堆,找最小数用大顶堆)比如从100万个整数中找出最大的100个整数,如果进行排序,时间复杂度是O(nlogn),代价高昂。可以看到,性能相差了三倍,并且数据量越大,性能差距也越大。来解决,时间复杂度是O(nlogK)TopK问题的解法是:用数据结构。
2023-12-28 10:50:01
476
原创 线程池里对异常的处理方式
=方式:==重写afterExecute方法, 统一处理线程池里抛出的异常。但是要区分是execute方式提交的,还是submit方式提交的。
2023-10-29 09:11:09
338
原创 烟花效果,H5+C3+JS实现
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>11
2023-10-09 12:33:00
414
2
原创 Mybatis中的一级缓存与二级缓存
二级缓存是NameSpace级别(Mapper)的缓存,多个SqlSession可以共享,使用时需要进行配置开启。(2)缓存的查找顺序:二级缓存 => 一级缓存 => 数据库。(1)MyBatis的缓存分为一级缓存和 二级缓存。一级缓存是SqlSession级别的缓存,默认开启。
2023-09-13 08:53:35
96
原创 Redis相关知识
整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。3)采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。更快,也更不安全的选择。
2023-09-13 08:49:39
260
原创 线上排查定位OOM问题的记录
1、分析快照文件的工具建议用eclipse analyzer,而不是jdk自带的jvisualvm。eclipse analyzer的下载地址:http://www.eclipse.org/mat/downloads.php。整体思路:把机器上的快照文件下载到本地电脑,用eclipse analyzer打开它,找到是哪一行导致oom。因为快照文件很大,eclipse analyzer设置的大小阈值也要调成足够大。把该文件下载到本地电脑,可以借助xftp等工具下载。2、解压缩后,先编辑下这个文件。
2023-08-30 15:18:38
222
原创 用ThreadLocal做链路追踪(初版、升级版、最终版)
于是出现了升级版(InheritableThreadLocal):解决了初版的问题,但是当线程池中开辟线程时,线程复用会残留上一次的trace-id,导致混乱不准。初版(ThreadLocal)的缺点:当new新线程时,子线程获取不到父线程的变量,导致trace-id丢失。2、当我们写的接口接收到其它地方(可能是前端、也可能是其它服务)发来的请求时,此刻,我们的接口所在的服务称作。服务端的日志打印很好做,用过滤器Filter即可,每次请求打过来,记录下请求路径、请求头、参数。
2023-08-14 10:19:50
457
原创 读书之《被讨厌的勇气》
在理解了学习是孩子的课题这个基础上再去考虑能做的事情,具体就是不去居高临下地命令其学习,而是努力地帮助他本人建立“自己能够学习”的自信以及提高其独立应对课题的能力。3、既不可以批评,也不可以表扬。表扬这种行为含有“有能力者对没能力者所做的评价”。人表扬他人的目的就在于“操纵比自己能力低的对方”。“因为不想与父亲和好,所以才搬出被打的记忆”。那么“关系修复之卡”就我在我手里,只要我改变“目的”,事情就能解决。5、“因为被打所以才与父亲不和”,那么只能束手无策了。2、“可以把马带到水边,但不能强迫其喝水” –
2023-07-16 21:31:54
142
原创 匿名内部类.getClass()结果
匿名内部类是继承了指定的类或实现了指定接口的类,我猜想它的class类型应该和该类(接口)相同,但实际发现不同。public class M15 { public static void main(String[] args) { Runnable runnable = () -> { }; System.out.println(runnable.getClass()); System.out.println(Runnab
2022-05-22 14:49:01
490
1
原创 Rabbit基于插件实现一个延迟队列
前言:基于死信的延迟队列存在漏洞问题,所以要使用基于插件的延迟队列。前者延迟的时机发生在队列,后者则在交换机。插件在官网上下载:https://www.rabbitmq.com/commuinty-plugins.html配置类:@Configurationpublic class DelayedQueueConfig { // 队列 public static final String DELAYED_QUEUE_NAME = "delayed.queue"; //
2022-03-27 17:14:58
1726
原创 线程池中7种阻塞队列的介绍、区别与选择
1. ArrayBlockingQueue(常用)基于数组的阻塞队列实现,在 ArrayBlockingQueue 内部,维护了一个定长数组,以便缓存队列中的数据对象,这是一个常用的阻塞队列,除了一个定长数组外,ArrayBlockingQueue 内部还保存着两个整形变量,分别标识着队列的头部和尾部在数组中的位置。ArrayBlockingQueue 在生产者放入数据和消费者获取数据,都是共用同一个锁对象,由此也意味着两者无法真正并行运行,这点尤其不同于LinkedBlockingQueue
2021-08-15 20:05:12
8817
原创 Postman创建ElasticSearch索引一直在sending状态
解决办法:首次启动elasticsearch.bat需要管理员身份运行。
2021-06-20 23:11:35
1474
11
原创 vi和vim快捷键
拷贝当前行 yy,拷贝当前行向下的5行 5yy,并粘贴(输入p)。删除当前行 dd,删除当前行向下的5行 5dd在文件中查找某个单词[命令模式下/关键字,回车 查找,输入n就是查找下一个]设置文件的行号,取消文件的行号。[命令模式下:set nu和 set nonu]一般模式下,定位到文件的最末行[G]和最首行[gg]撤销操作:修改后回到一般模式,按u一般模式快速定位到某行:20+shift+g老韩视频链接:https://www.bilibili.com/video/BV1Sv411r.
2021-05-05 16:15:43
123
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人