- 博客(102)
- 收藏
- 关注
原创 JMM内存模型以及和JVM的关系
JMM(Java 内存模型)主要定义了在多线程环境下, 对于一个共享变量,当另一个线程对这个共享变量执行写操作后,其他线程对他的访问需要遵循哪些规则,以保证并发程序的可见性,原子性和有序性。happens-before 是 JMM 定义的一组规则,用于描述操作之间的可见性和有序性。以下是常见的规则:
2025-08-18 15:01:06
490
原创 垃圾回收机制总结
GC是Java的“自动清洁工”,专门回收程序不再使用的内存,防止内存泄漏, 就像不用了的空饮料瓶,系统自动帮你扔掉。垃圾回收机制有效的防止了内存泄露可以有效的使用可使用的内存。垃圾回收器通常作为一个单独的低级别的线程运行,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会对内存堆中已经死亡的或很长时间没有用过的对象进行清除和回收。对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。
2025-08-17 13:17:53
812
原创 MySql知识点总结
比如说现在Insert Buffer中有1,99,2,100,合并之前可能要4次插入,合并之后1,2可能是一个页的,99,100可能是一个页的,这样就减少到了2次插入。比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。notice的信息入库失败,但是history成功入库了。,因此,把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。
2025-08-17 13:15:37
1140
原创 JVM基本原理
对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要手动释放内存,不容易出现内存泄露和内存溢出问题。一旦出现内存泄露和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,排查错误将会异常艰难。虚拟机栈可能会抛出两种异常:虚拟机栈和本地方法栈的主要区别:参数设置:参数含义解析:11.1.6. 方法区(永久代) 方法区是 JVM 的一个规范,所有虚拟机必须要遵守的。常见的虚拟机有 Hotspot 、 JRockit(Oracle)、J9(IBM) 方法区逻辑上属于堆的一部分,但是为了与
2025-08-17 13:15:08
1022
原创 力扣(leetcode)HOT100算法题总结
解题思路:该代码使用二分查找算法来定位目标值在数组中的起始和结束位置。通过两次二分查找(分别查找左边界和右边界),确保在 O(log n) 时间复杂度内完成搜索。如果目标值不存在,返回 [-1, -1]。时间复杂度:O(logn) ,其中n为数组的长度。二分查找的时间复杂度为O(logn),一共会执行两次,因此总时间复杂度为O(logn。
2025-08-09 11:50:35
2006
原创 Redis分区,分布式锁SETNX以及缓存
前景引入:synchronized和Lock只可以做到线程间的同步,而且仅限于单机应用,在分布式集群系统中用来共享资源是不行的,尤其是电商项目,很可能出现超卖情况。
2025-08-08 09:06:21
1349
原创 MySql锁以及SQL约束
可重复读:读操作需要加共享锁,但是在事务提交之前并不释放共享锁,必须等待事务执行完毕以后才释放共享锁。读未提交 :不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突。读已提交:需要加共享锁,但是在语句执行完以后释放共享锁。串行化:并一直持有锁,直到事务完成。
2025-08-07 20:19:47
306
原创 MySql的索引介绍
比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间。由于B+树的内部节点。
2025-08-07 20:18:31
860
原创 MySql存储引擎MyISAM与InnoDB
比如说现在Insert Buffer中有1,99,2,100,合并之前可能要4次插入,合并之后1,2可能是一个页的,99,100可能是一个页的,这样就减少到了2次插入。这里索引不唯一是因为如果要保证唯一,每次操作还得去判断当前索引值是否已存在,而判断又涉及到磁盘随机 I/O,从而发挥不出插入缓存的优势。InnoDB 虽然主要使用 B+ 树作为索引结构,但在某些特殊场景下用到哈希索引。InnoDB的行锁是实现在索引上的,而不是锁在物理行记录上。潜台词是,如果访问没有命中索引,也无法使用行锁,将要退化为表锁。
2025-08-07 20:17:38
378
原创 事件轮询机制
轮询机制引出:JS是单线程的,同一时间只能做一件事,所有任务都需要排队,前一个任务结束之后,才会执行后一个任务什么是事件轮询:主线程从"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)以下是轮询机制的基本执行线:参考资料:事件轮询机制-优快云博客
2025-08-07 20:12:37
243
原创 BIO,NIO,AIO理解
Buffer又叫做缓冲区,是一个对象,里面主要是写入或者是读出的数据,在java.nio库中,所有的数据都是用缓冲区处理的在读取数据时,是直接读取到缓冲区的,在写入数据时也是直接写到缓冲区,任何时候访问Channel中的数据,都是通过缓冲区来进行操作的缓冲区实际上就是一个数组,通常是一个字节数组ByteBuffer,也有其他的。
2025-08-07 20:12:04
869
原创 ThreadLocal和线程同步机制
我们知道在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean(如RequestContextHolder、LocaleContextHolder等)中非线程安全状态采用ThreadLocal进行处理,让它们也成为线程安全的状态,因此有状态的Bean就可以在多线程中共享了。为解决Spring中的多线程并发问题(主要是相同变量的访问冲突),提出了ThreadLocal以及线程同步机制。
2025-08-07 20:11:12
306
原创 CAS算法
使得对临界区资源的修改可以马上被其他线程看到,它是通过添加内存屏障实现的。上面说到当前线程可以发现其他线程对临界区数据的修改,这点可以使用。
2025-08-07 20:10:37
632
原创 锁的介绍(synchronized为主)
synchronized 属于悲观锁。synchronized作用于静态的increase(),这样的话对象锁就在当前的类,无论创建多少个对象,类只有一个,也就是说synchronized同步静态方法的情况下对象锁就是唯一的。介绍 : synchronized(对象锁)采用互斥的方式让同一时刻至多只有一个线程能持有对象锁,其他的线程再想获取这个对象锁时就会被阻塞,属于是悲观锁。偏向锁只会执行一次CAS操作,而轻量级锁在发生锁的竞争和释放时每次都会执行CAS的操作,会造成一定的性能开销。
2025-08-07 20:10:08
588
原创 线程基础知识
线程在执行过程中虽然不会完全停止(不像死锁那样完全无法继续),但因为线程彼此互相影响,导致程序无法正常推进或完成任务。线程执行是不管执行顺序的,开始执行时的顺序都是随机的(实际上是操作系统通过算法调度和分配资源,JDK不能影响她)注意:wait和notify需要成对出现,或者wait和notifyAll成对出现,否则可能出现假死锁。方法是不允许有参数的,我们一般要执行的线程都要传参数,所以只能通过继承和实现来解决参数传递的问题。存在生产者消费者之间的问题,如果仓库中只剩下最后一个资源,A线程和B线程争夺。
2025-08-07 20:07:20
1063
原创 分代垃圾回收器
在大多数程序中,新创建的对象往往很快就会变得不可达(即不再使用),而长时间存活的对象则有可能继续存活下去。:分代垃圾回收的核心思想是将堆内存划分为多个区域或代。:在不同代使用不同的垃圾回收算法用来提高效率。
2025-08-07 20:03:23
363
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅