- 博客(244)
- 收藏
- 关注
原创 MySQL为什么选择B+树
在选择数据结构时,不同的结构有其特定的优缺点。Hash表虽然查询速度快,但不支持范围查询。跳表通过增加索引层来加速查询,但索引层增加过快会导致IO成本急剧上升。二叉树、AVL树和红黑树在数据量增加时,树高度增长过快,同样导致IO成本增加。B树虽然在一定程度上控制了树高,但进行范围查询时仍需中序遍历,IO成本较高。相比之下,B+树在非叶子节点不存储数据,有效控制了树高度的增长,降低了IO成本,同时其叶子节点的双链表结构使得范围查询成本较低,因此在需要高效范围查询的场景中,B+树是一个更优的选择。
2025-05-11 15:40:40
459
原创 Java基本类型自动拆箱NPE异常
同理,对于Long、Float、Double也是编译器默认调用了取值函数,如果业务传的是NULL就会报空指针异常。(Autoboxing):把基本数据类型转换成对应的对象类型。在Java中,自动装箱和拆箱是十分重要的特性,允许基本数据类型(如。(Unboxing):把对象类型转换回基本数据类型。值,这个过程在编译时是自动处理的。)和它们对应的包装类(如。在自动拆箱操作中,会调用。
2025-02-12 16:47:21
119
原创 MyBatis相关问题汇总
https://www.cnblogs.com/Createsequence/p/16963891.htmlmybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache_mybatis缓存机制-优快云博客
2024-07-24 20:01:50
334
原创 Arthas watch命令加过滤字段
2.查看入参personList里name是'isMe'的Person实例信息。1.查看入参personList里id等于100L的Person实例信息。如果Person内容太多,我只关心name,那么可以这么写。3.查看返回结果List的某个Car的实例信息。
2024-04-26 17:27:27
1571
原创 中文引号导致读取JSON字段值失败问题
调试代码遇到无法读取其中一个字段的值,其他字段的值可以正常读取,百思不得其解,偶然在日志中发现了,这个字段后边是乱码,不是引号,猜测可能是手动输入入参时,最后一个参数的引号错误使用了中文引号,导致序列化没有成功,就无法读取这个字段对应的值。
2024-03-14 10:16:57
479
原创 Java面试八股文
一文搞懂所有计算机网络面试题 - 知乎01 我应该站在谁的肩膀上 - OSI vs TCPIP模型面渣逆袭必看,面试题八股文Java基础、Java 集合框架、Java 并发编程、JVM、Spring、Redis、MyBatis、MySQL、操作系统、计算机网络、RocketMQ、分布式、微服务👍 | 二哥的Java进阶之路代码随想录配套 JetBrains 刷题插件 | labuladong 的算法笔记
2024-02-22 15:12:00
540
原创 系统问题排查思路
整体思路:https://www.toutiao.com/article/6844670025068970500/?wid=1708583600413
2024-02-22 14:49:42
408
原创 数据结构好文集合
https://blog.youkuaiyun.com/weixin_46195957/article/details/125298629https://www.cnblogs.com/crazymakercircle/p/16320430.html#autoid-h2-5-2-0
2024-02-21 19:53:55
418
原创 记一次Log记录大对象导致的CPU异常和磁盘打满
代码里有个大对象Map,缓存了100M数据,在多线程任务中记录异常的任务时错误地记录了这个Map,导致JSON序列化时疯狂刷磁盘写入数据,导致磁盘被打满,CPU100%,机器拒绝访问。
2024-01-17 11:07:47
476
原创 分布式框架合集
https://cn.dubbo.apache.org/zh-cn/blog/2019/05/01/dubbo-%E4%B8%80%E8%87%B4%E6%80%A7hash%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1%E5%AE%9E%E7%8E%B0%E5%89%96%E6%9E%90/
2023-12-05 17:00:42
157
原创 CLH锁原理
所有自旋锁都在一个内存地址上自旋,持有锁的线程释放锁后,会引发惊群效应,而且会造成个别线程一只拿不到锁,处在饥饿状态,CLH锁通过队列将所有线程排队,避免惊群效应,也保证所有线程都能执行。将线程包装为CLH节点,locked代表线程状态,false表示释放锁或未持有锁,true表示持有锁或正在排队等待锁。1.设置一个尾节点tail,初始为一个空节点,节点状态为false;1.将当前节点的状态设置为false,表示锁已释放。4.自旋监听前一个节点的状态是否为释放锁;3.将前一个节点set进当前节点的属性;
2023-11-29 21:12:45
203
原创 JavaCPU异常飙升诊断套路
可以看到两个ID,tid是JVM层面的线程ID,nid是native ID,即OS的本地线程ID,Java线程模型是将JVM线程和本地线程1:1映射;1.2找到%CPU最大的线程ID,如25695,需要转十六进制 645f。grep 645f -A 30意思是显示匹配645f的行及其后边的30行。jps找到JVM进程ID,如6937,然后使用top命令查看资源信息。1.1 使用 top 命令找出有问题 Java 进程的 ID;-H会显示线程占用资源情况。2.抽象成shell脚本。-p指定被监视的进程。
2023-11-27 10:58:32
129
原创 Arthas使用技巧
阿里Java诊断工具 arthas - 排查线上环境内存使用过大、线程cpu使用率高问题_arthas排查内存高问题-优快云博客 arthas--vmtool查看内存对象_arthas查看对象_韩师学子--小倪的博客-优快云博客
2023-11-06 16:53:57
100
原创 Java参数按值传递
当对象(或引用类型)作为参数传递给方法时,传递的是对象的引用值,而不是对象本身。这个引用值会被复制到方法内部的新变量中,这意味着这两个引用变量都指向同一个对象。因此,在方法内部对这个新引用变量进行的任何操作都会影响到原始对象。但是,如果在方法内部将新引用变量指向另一个对象(即重新分配),这将不会影响到原始引用变量。按值传递:当基本数据类型被作为参数传递给方法时,实际上传递的是该数据类型的值。在方法内部,这个值会被复制到一个新的变量中,因此对这个新变量的任何修改都不会影响到原始变量。
2023-09-10 13:28:31
306
原创 线程唯一的单例
别跟我扯什么双重检测单例模式,性能太差,不考虑,单例模式就用静态内部类实现,高性能+延迟加载,还要什么双重检测!思路很简单:将线程id绑定对象实例就行了。以下使用Map和JDK原生的ThreadLocal实现这个想法。那么,问题来了,如果我要实现线程绑定呢,换句话说就是实现线程间唯一的单例,进程中可以有多个实例。
2023-09-02 13:56:16
361
原创 Java无锁并发工具类Unsafe.compareAndSwapLong方法
方法是一个原子操作,通常用于并发编程中的无锁算法。它的作用是以原子方式比较并交换某个对象的一个long类型的字段。类一起使用,这是一个用于执行低级操作的类。它允许你直接操作Java对象的内存,包括获取和设置字段的值、分配和释放内存等。如果不相等,说明其他线程可能已经修改过这个字段的值,那么方法不做任何操作,并返回。如果相等,说明没有其他线程修改过这个字段的值,那么方法会将该字段更新为。方法通常用于实现高性能的并发数据结构,如。
2023-09-01 10:56:47
386
原创 Arthas常用命令
trace className methodNamewatch className methodName "{params,returnObj}" -x5vmtool --action getInstances --className className -x3
2023-08-07 15:26:07
160
原创 sublime Text快捷键
josn 快捷键 command + ctrl +j。sql 快捷键 command + k + f。macbook适用!
2023-07-19 11:53:51
113
原创 提取SQL中的参数
group函数是与你的正则表达式有关的,String PS3 = "(#(\\{(.*?group()或者group(0)表示当前匹配的全部字符,group(x)代表匹配字符集的第几个分组,也就是第几个小括号内的字符集。不知道你注意到了java.util.regex.Matcher#group(int)吗?例如,对于字符串 "aaab",正则表达式。例如,对于字符串 "aaab",正则表达式。会非贪婪匹配到1个 "a"。会贪婪匹配到3个 "a"。
2023-06-25 17:29:05
943
原创 主备库的事务管理器如何设置
一般主库负责写,从库负责读,事务管理器主要作用是能在异常时回滚业务代码,读数据没有回滚业务代码的必要,所以主从模式下不需要为主从数据源都配置事务管理器,只需要为主库配置事务管理即可。
2023-06-23 13:37:44
653
原创 行业黑话之水位
MySQL水位是指MySQL数据库中的数据量或负载水平。在数据库管理中,高水位意味着数据库中的数据量或负载水平较高,可能导致性能下降、查询速度变慢等问题。相反,低水位意味着数据库中的数据量或负载水平较低,性能较好。系统管理员、开发人员和运维人员需要关注各种资源的水位,以确保系统的稳定运行、性能优化,防止资源耗尽等问题。通过监控水位,可以合理地分配和管理资源,提高系统的整体性能。相反,低水位意味着资源使用率较低,性能较好。例如,内存水位、磁盘水位、CPU使用水位等。
2023-06-20 11:28:24
1015
原创 PreparedStatemnet概念
都是Java中 JDBC(Java Database Connectivity)规范的一部分,它们用于执行SQL语句并与数据库交互。PreparedStatement防止SQL注入的关键在于它将参数值与SQL语句进行分离处理,而不是直接将参数值拼接到SQL语句中。数组中的参数值和类型一起发送给数据库服务器。数据库服务器会将这些参数值与 SQL 语句进行合并,然后执行处理过的 SQL 语句。对象设置参数值和类型。在执行 SQL 语句时(例如调用。方法中,参数类型将被设置为。方法中,参数类型将被设置为。
2023-06-20 11:22:53
222
原创 数据库横表和竖表有什么区别
横表和竖表是描述数据库表结构的两种形式,它们之间的主要区别在于数据的组织方式和用途。2.竖表(长表): 竖表是一种非常规表结构,其特点是将属性作为行而不是列存储。竖表通常包括实体ID、属性名和属性值三个字段。竖表的优点是可以处理稀疏数据和动态添加属性,适合用于数据仓库和数据挖掘。
2023-06-19 14:11:48
5463
原创 JDK动态代理
确保代理类和目标类在相同的类路径下被加载,可以避免类加载器之间的不兼容性问题。类加载器之间可能存在不同的类路径和委托模式,如果代理类和目标类使用不同的类加载器,可能导致代理类无法找到目标类或目标类的依赖。方法中,你应该调用目标对象(而非代理对象)上的方法,并在方法调用前后添加其他操作(如日志、安全检查等)。:当代理类和目标类使用相同的类加载器时,可以确保它们实现的接口是相同的。方法中,可以自定义如何处理方法调用,通过反射来调用目标对象的实际方法,以及在方法调用前后添加其他操作(如日志、安全检查等)。
2023-06-18 17:39:06
2329
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人