- 博客(20)
- 收藏
- 关注
原创 Java内存调优
内存泄漏(memory leak):在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收,这种情况就称之为内存泄漏。内存泄漏绝大多数情况都是由堆内存泄漏引起的,所以后续没有特别说明则讨论的都是堆内存泄漏。
2025-09-25 15:30:00
936
原创 Java中的垃圾回收机制
垃圾回收器的组合关系虽然很多,但是针对几个特定的版本,比较好的组合选择如下:JDK8及之前:ParNew + CMS(关注暂停时间)、Parallel Scavenge + Parallel Old (关注吞吐量)、 G1(JDK8之前不建议,较大堆并且关注暂停时间)JDK9之后:G1(默认)从JDK9之后,由于G1日趋成熟,JDK默认的垃圾回收器已经修改为G1,所以强烈建议在生产环境上使用G1。
2025-09-23 15:00:00
2943
原创 Java中的运行时数据区
Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。《Java虚拟机规范》中规定了每一部分的作用。
2025-09-22 15:00:00
1322
原创 Java中的双亲委派机制
一个Tomcat程序中是可以运行多个Web应用的,如果这两个应用中出现了相同限定名的类,比如Servlet类,Tomcat要保证这两个类都能加载并且它们应该是不同的类。如果不打破双亲委派机制,当应用类加载器加载Web应用1中的MyServlet之后,Web应用2中相同限定名的MyServlet类就无法被加载了。Tomcat使用了自定义类加载器来实现应用之间类的隔离。每一个应用会有一个独立的类加载器加载对应的类。那么自定义加载器是如何能做到的呢?
2025-09-21 11:57:22
1410
原创 MySQL的日志
二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。作用:①. 灾难时的数据恢复;②. MySQL的主从复制。在MySQL8版本中,默认二进制日志是开启着的,涉及到的参数如下:log_bin_basename:当前数据库服务器的binlog日志的基础名称(前缀),具体的binlog文 件名需要再该basename的基础上加上编号(编号从000001开始)。
2025-09-19 15:00:00
2622
原创 MySQL中的MVCC详解
当我们创建了上面的这张表,我们在查看表结构的时候,就可以显式的看到这三个字段。隐藏字段含义DB_TRX_ID最近修改事务ID,记录插入这条记录或最后一次修改该记录的事务ID。回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个版本。DB_ROW_ID隐藏主键,如果表结构没有指定主键,将会生成该隐藏字段。而上述的前两个字段是肯定会添加的, 是否添加最后一个字段DB_ROW_ID,得看当前表有没有主键,如果有主键,则不会添加该隐藏字段。
2025-09-18 15:00:00
2515
原创 MySQL的InnoDB引擎
MySQL5.5 版本开始,默认使用InnoDB存储引擎,它擅长事务处理,具有崩溃恢复特性,在日常开发中使用非常广泛。下面是InnoDB架构图,左侧为内存结构,右侧为磁盘结构。
2025-09-17 15:08:40
899
原创 MySQL的锁详解
全局锁就是对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML的写语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。其典型的使用场景是做全库的逻辑备份(将数据库中的数据备份成一个SQL文件,备份到磁盘中),对所有的表进行锁定,从而获取一致性视图,保证数据的完整性。为什么全库逻辑备份,就需要加全就锁呢?A. 我们一起先来分析一下不加全局锁,可能存在的问题。假设在数据库中存在这样三张表: tb_stock 库存表,tb_order 订单表,tb_orderlog 订单日志表。
2025-09-16 14:35:29
1296
原创 SQL优化
在之前的测试中,我们发现,如果数据量很大,在执行count操作时,是非常耗时的。MyISAM 引擎把一个表的总行数存在了磁盘上,因此执行 count(*) 的时候会直接返回这个 数,效率很高;但是如果是带条件的count,MyISAM也慢。InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。
2025-09-14 15:30:00
1051
原创 索引的使用及其设计原则
此时,查询时,就走了联合索引,而在联合索引中包含 phone、name的信息,在叶子节点下挂的是对应的主键id,所以查询是无需回表查询的。可以根据索引的选择性来决定,而选择性是指不重复的索引值(基数)和数据表的记录总数的比值, 索引选择性越高则查询效率越高, 唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。虽然是根据name字段查询,查询二级索引,但是由于查询返回在字段为 id,name,在name的二级索引中,这两个值都是可以直接获取到的,因为覆盖索引,所以不需要回表查询,性能高。
2025-09-13 15:30:00
1178
原创 MySQL的索引
索引结构描述B+Tree索引最常见的索引类型,大部分引擎都支持 B+ 树索引Hash索引底层数据结构是用哈希表实现的, 只有精确匹配索引列的查询才有效, 不支持范围查询R-tree(空间索引)空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少Full-text(全文索引)是一种通过建立倒排索引,快速匹配文档的方式。类似于 Lucene,Solr,ES上述是MySQL中所支持的所有的索引结构,接下来,我们再来看看不同的存储引擎对于索引结构的支持情况。索引。
2025-09-12 15:30:00
1574
原创 MySQL的存储引擎
存储引擎是mysql数据库的核心,需要在合适的场景选择合适的存储引擎。存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。可以在创建表的时候,来指定选择的存储引擎,如果没有指定将自动选择默认的存储引擎。1) 建表时指定存储引擎CREATE TABLE 表名(字段1 字段1类型 [ COMMENT 字段1注释 ] ,......字段n 字段n类型 [COMMENT 字段n注释 ]
2025-09-11 15:30:00
1775
原创 MySQL的事务
事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系 统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐 式的提交事务。
2025-09-10 15:30:00
871
原创 JUC包下的一些常见类
当读操作远远高于写操作时,这时候使用读写锁让读-读可以并发,提高性能。类似于数据库中的 select ... from ... lock in share mode提供一个 数据容器类 内部分别使用读锁保护数据的 read() 方法,写锁保护数据的 write() 方法测试 读锁-读锁 可以并发输出结果,从这里可以看到 t2 锁定期间,t1 的读操作不受影响测试 读锁-写锁 相互阻塞运行结果:读锁获取到锁后,休眠1秒,写锁尝试获取锁,失败,等读锁释放锁后,写锁才获取到锁。测试 写锁-写锁 相互阻塞。
2025-09-04 15:30:00
1500
1
原创 AQS原理
全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架getState - 获取 state 状态setState - 设置 state 状态compareAndSetState - 使用 cas 机制(为了防止多个线程读来修改 state 时,state 的线程安全,保证原子性,重试失败会进入队列等待)设置 state 状态独占模式是只有一个线程能够访问资源,而共享模式可以允许多个线程访问资源。
2025-09-03 15:30:00
654
原创 ThreadPoolExecutor类详解
线程池实现类是Executor框架最核心的类。ExecutorService:线程池的最基本的接口,里面定义了提交任务,包括关闭线程池的方法。ScheculeExecutorService: ExecutorService 的扩展接口,在基础线程池的功能上,新增了任务调度的功能,可以定时去执行任务。ThreadPoolExecutor : ExecutorService 最基础的实现,非常重要!!!
2025-09-01 14:37:01
1607
原创 快速搞懂volatile关键字的作用
volatile 可以用来修饰成员变量和静态成员变量,他可以避免线程从自己的工作缓存中查找变量的值,必须到主存中获取它的值,线程操作 volatile 变量都是直接操作主存。2. 因为 t 线程要频繁从主内存中读取 run 的值,JIT 编译器会将 run 的值缓存至自己工作内存中的高速缓存中, 减少对主存中 run 的访问,来提高效率。3. 1 秒之后,main 线程修改了 run 的值,并同步至主存,而 t 是从自己工作内存中的高速缓存中读取这个变量 的值,结果永远是旧值。它主要解决了什么问题?
2025-08-30 18:00:22
335
原创 java线程6种状态之间的转化详解
之前介绍了Java线程俩种层面的各种状态,现在来详细了解一下Java API层面六种状态是怎么变化的。假设有线程 Thread t。
2025-08-29 14:55:11
1099
原创 Java线程有几种状态?5种?还是6种?
Java线程状态可从操作系统和Java API两个层面理解:操作系统层面分为初始状态、可运行状态(就绪)、运行状态、阻塞状态和终止状态5种;Java API层面则细分为NEW、RUNNABLE(包含系统层的可运行/运行/阻塞)、BLOCKED、WAITING、TIMED_WAITING和TERMINATED 6种状态。代码示例通过不同线程操作(sleep、join、同步锁等)展示了各状态的转换,运行结果验证了状态的实际表现。两种分类方式本质是对同一机制的不同抽象层级描述。
2025-08-27 16:10:14
426
原创 一口气带你过完HashMap常见考点,面试官问到再也不怕了!
JDK1.7时用的是头插法,如果多线程同时执行put操作,可能会导致链表成环,造成死循环,所以JDK1.8改成了尾插法。15.尾插法链表就不会成环了吗?也可以成环,红黑树也可以成环,不过本就不应该在多线程环境用HashMap。16.HashMap的扩容机制?HashMap默认初始容量为16,负载因子是0.75,因此默认扩容阈值是12,理论上插入第13个元素就会触发扩容,扩容就是新建一个俩倍大小的新数组,然后把原来的元素重新哈希迁移过去。17.为什么是俩倍?
2025-08-07 20:41:24
292
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅