
Java
文章平均质量分 90
加班不秃顶
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
五分钟搞懂MySQL索引下推
索引下推(Index Condition Pushdown,简称ICP),是MySQL5.6版本的新特性,它能减少回表查询次数,提高查询效率。原创 2025-07-12 22:07:19 · 786 阅读 · 0 评论 -
深入学习MySQL(4)InnoDB存储结构
这一节本来计划开始索引的学习,但是在InnoDB存储引擎的索引里,存在一些数据存储结构的概念,这一节先了解一下InnodDB的逻辑存储结构,为索引的学习打好基础。从InnoDB存储引擎的存储结构看,所有数据都被逻辑地放在一个空间中,称之为表空间(tablespace)、区(extent)、页(page)组成,页在一些文档中也被称之为块(block)。原创 2025-07-12 22:07:04 · 803 阅读 · 0 评论 -
深入学习MySQL(3)日志文件详解
错误日志文件对MySQL的启动、运行、关闭过程进行了记录,是定位MySQL问题的第一把钥匙。原创 2025-07-12 22:06:42 · 711 阅读 · 0 评论 -
深入学习MySQL(2)存储引擎盘点
在前面我们了解了server层调用存储引擎层接口来完成sql的执行,使用存储引擎的好处是:每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表。。MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。其中最常用的3种,InnoDB、MyISAM、Memory,MySQL5.5.8以后,默认存储引擎为InnoDB。原创 2025-07-12 22:06:17 · 462 阅读 · 0 评论 -
深入学习MySQL(1)MySQL逻辑架构
深入学习MySQL,从概览MySQL逻辑架构开始。首先来看一下MySQL的逻辑架构图:值得一提的是在MySQL8.0中取消了查询缓存,大概的理由是查询缓存存在严重的可伸缩性问题,并且很容易成为严重的瓶颈缓存,将缓存移动到客户端能收获更好的性能。通过一条查询语句的执行过程,来了解一些关键的部件:复制代码。原创 2025-07-12 22:05:16 · 373 阅读 · 0 评论 -
JVM进阶之路(十四)类加载器和类加载机制
在上一章里,我们已经学习了类加载的过程,我们知道在加载阶段需要”通过一个类的全限定名来获取描述该类的二进制字节流“,而来完成这个工作的就是类加载器(Class Loader)。原创 2025-07-12 22:05:00 · 571 阅读 · 0 评论 -
JVM进阶之路(十三)类加载过程
通过前面的学习,我们了解了Class文件的结构,在Class文件中描述的各类信息,最终都需要加载到虚拟机中之后才能被运行和使用。接下来,我们开始学习JVM的类加载。原创 2025-07-11 21:38:16 · 620 阅读 · 0 评论 -
JVM进阶之路(十二)字节码指令
接下来,我们进一步学习字节码的相关指令。首先我们来看一个简单的程序:复制代码编译运行,使用JDK自带的javap我们来找找相加指令在哪里:对于大部分与数据类型相关的字节码指令,它们的操作码助记符中都有特殊的字符来表明专门为哪种数据类型服务:i代表对int类型的数据操作,l代表long,s代表short,b代表byte,c代表char,f代表 float,d代表double,a代表reference。原创 2025-07-11 21:37:39 · 453 阅读 · 0 评论 -
JVM进阶之路(十一)Class文件结构
Java虚拟机和Class文件是Java实现系统无关性的基石。Class文件是JVM实现语言无关性的基石。Class文件中包含了Java虚拟机指令集、符号表以及若干其他辅助信息。每一个 Class 文件对应于一个如下所示的 ClassFile 结构体:复制代码简单看一下各项的含义:由于 Class 文件结构没有任何分隔符,所以无论是每个数据项的的顺序还是数量,都是严格限定的,哪个字节代表什么含义,长度多少,先后顺序如何,都是不允许改变的。接下来我们来具体学习每项的含义。原创 2025-07-11 21:37:04 · 954 阅读 · 0 评论 -
JVM进阶之路(十)JVM调优总结
6、为了验证自己的猜想,于是准备登录后台去测试下,结果在测试的过程中发现到处订单的按钮前端居然没有做点击后按钮置灰交互事件,结果按钮可以一直点,因为导出订单数据本来就非常慢,使用的人员可能发现点击后很久后页面都没反应,结果就一直点,结果就大量的请求进入到后台,堆内存产生了大量的订单对象和EXCEL对象,而且方法执行非常慢,导致这一段时间内这些对象都无法被回收,所以最终导致内存溢出。解决方式除了调整本地内存大小之外,也可以在出现此异常时进行捕获,手动触发GC(System.gc())。原创 2025-07-11 21:36:39 · 933 阅读 · 0 评论 -
JVM进阶之路(九)性能监控工具-可视化工具篇
在前面已经学习了JVM性能监控的命令行工具,接下来学习JVM性能监控的命令行工具,通过可视化工具可以更直观地监控JVM性能、处理JVM相关问题。原创 2025-07-11 21:35:54 · 935 阅读 · 0 评论 -
JVM进阶之路(八)性能监控工具-命令行篇
定位问题的时候,知识、经验是关键基础,数据是依据,工具是运用知识处理数据的手段。在实际的故障排查、性能监控中,常常是操作系统的工具和Java虚拟机的工具结合使用。原创 2025-07-11 21:35:24 · 553 阅读 · 0 评论 -
JVM进阶之路(七)垃圾收集器盘点
在前面,我们已经了解了JVM的分代收集,知道JVM垃圾收集在新生代主要采用标记-复制算法,在老年代主要采用标记-清除和标记-整理算法。接下来,我们看一看JDK默认虚拟机HotSpot的一些垃圾收集器的实现。原创 2025-07-06 08:00:00 · 788 阅读 · 0 评论 -
JVM进阶之路(六)垃圾收集理论和算法
在前面我们了解了虚拟机如何判断对象可回收,接下来我们了解Java虚拟机垃圾收集的一些理论和算法。原创 2025-07-05 09:15:00 · 944 阅读 · 0 评论 -
JVM进阶之路(五)垃圾回收概述和对象回收判定
垃圾收集(Garbage Collection,简称GC)简单说,就是要干三件事:哪些内存需要回收?什么时候回收?如何回收?在Java的内存区域中:程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,栈中的栈帧随着方法的进入和退出而有条不紊地执行着出栈和入栈操作,所以这几个区域的内存回收是确定的,随着方法结束或者线程结束,内存自然回收。原创 2025-07-05 09:00:00 · 533 阅读 · 0 评论 -
JVM进阶之路(四)直面内存溢出和内存泄漏
在Java中,和内存相关的问题主要有两种,和。原创 2025-07-05 08:45:00 · 832 阅读 · 0 评论 -
JVM进阶之路(三)探究虚拟机对象
例如在64位的HotSpot虚拟机中,如对象未被同步锁锁定的状态下,Mark Word的64个比特存储空间中的31个比特用于存储对象哈希码,4个比特用于存储对象分代年龄,2个比特用于存储锁标志位,在其他状态(轻量级锁、重量级锁、偏向锁)下对象的存储内容变化如图示。如果对象是一个Java数组,那在对象头中还必须有一块用于记录数组长度的数据,因为虚拟机可以通过普通Java对象的元数据信息确定Java对象的大小,但是如果数组的长度是不确定的,将无法通过元数据中的信息推断出数组的大小。原创 2025-07-05 08:30:00 · 547 阅读 · 0 评论 -
JVM进阶之路(二)Java内存区域
考虑到HotSpot未来的发展,在JDK 6的 时候HotSpot开发团队就有放弃永久代,逐步改为采用本地内存(Native Memory)来实现方法区的计划了,到了JDK 7的HotSpot,已经把原本放在永久代的字符串常量池、静态变量等移出,而到了 JDK 8,终于完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间(Meta-space)来代替,把JDK 7中永久代还剩余的内容(主要是类型信息)全部移到元空间中。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。原创 2025-07-05 08:15:00 · 526 阅读 · 0 评论 -
JVM进阶之路(一)Java虚拟机概览
JVM是整个Java平台的基石。JVM可以看作抽象的计算机。编译器将Java文件编译为Java字节码文件(.class),接下来JVM对字节码文件进行解释,翻译成特定底层平台匹配的机器指令并运行。JVM和Java语言没有必然的联系,它只与class文件格式关联。也就是任何语言,只要能编译成符合规范的字节码文件,都是能被Jvm运行的。也就是说JVM是跨语言的平台。原创 2025-07-05 08:00:00 · 647 阅读 · 0 评论 -
面试官问:“在项目中用过多线程吗?”你就把这个案例讲给他听!
要说线程,必先说进程。进程是程序的⼀次执⾏过程,是系统运⾏程序的基本单位,因此进程是动态的。系统运⾏⼀个程序即是⼀个进程从创建,运⾏到消亡的过程。线程与进程相似,但线程是⼀个⽐进程更⼩的执⾏单位。⼀个进程在其执⾏的过程中可以产⽣多个线程。与进程不同的是同类的多个线程共享进程的堆和⽅法区资源,但每个线程有⾃⼰的程序计数器、虚拟机栈和本地⽅法栈,所以系统在产⽣⼀个线程,或是在各个线程之间作切换⼯作时,负担要⽐进程⼩得多,也正因为如此,线程也被称为轻量级进程。原创 2025-07-04 13:19:32 · 555 阅读 · 0 评论 -
MySQL索引由浅入深
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。通俗来讲,索引类似文章的目录,用来提高查询的效率。它是 B Tree 的变种,B Tree 能解决的问题,它都能解决。B Tree 解决的两大问题是什么?(每个节点存储更多关键字;路数更多)原创 2025-07-04 13:09:56 · 977 阅读 · 0 评论 -
这些不可不知的JVM知识,我都用思维导图整理好了
JVM是面试中必问的部分,本文通过思维导图以面向面试的角度整理JVM中不可不知的知识。原创 2025-07-04 13:08:31 · 883 阅读 · 0 评论 -
synchronized详解
在Java中,锁可能是我们最早接触的锁了,在 JDK1.5之前synchronized是一个重量级锁,相对于juc包中的Lock,显得比较笨重。庆幸的是在 Java 6 之后 Java 官⽅对从 JVM 层⾯对进行⼤优化,所以现在的 synchronized 锁效率也优化得很不错。 的作用主要有三:Synchronized主要有三种用法:(1)、修饰实例方法: 作用于当前对象实例加锁,进入同步代码前要获得 当前对象实例的锁复制代码 (2)、修饰静态方法: 也就是给当前类加锁,会作用于类的所有对象原创 2025-07-04 13:04:22 · 569 阅读 · 0 评论 -
盘点分布式文件存储系统
在开始介绍分布式存储之前,先了解一下,非分布式的存储方案。在单机时代,将文件直接存储在服务部署的服务器上——直连存储(DAS):存储和数据直连,拓展性、灵活性差。为了扩展,将文件和服务分离,通过网络连接——中心化存储(NAS、SAN):设备类型丰富,通过网络互连,具有一定的拓展性,但是受到控制器能力限制,拓展能力有限。同时,设备到了生命周期要进行更换,数据迁移需要耗费大量的时间和精力。原创 2025-07-04 13:02:28 · 552 阅读 · 0 评论 -
思维导图整理Java并发基础
乐观锁和悲观锁是在数据库中引入的名词,但是在并发包锁里面引入了类似的思想。悲观锁指对数据被外界修改持保守态度,认为数据很容易就会被其他线程修改,所以在数据被处理前先对数据进行加锁,并在整个数据处理过程中,使数据处于锁定状态。悲观锁的实现往往依靠数据库提供的锁机制,即在数据 ,在对数据记录操作前给记录排它锁。如果获取锁失败, 则说明数据正在被其它线程修改,当前线程则等待或者抛出异常。如果获取锁成功,则对记录进行操作 ,然后提交事务后释放排它锁。原创 2025-07-04 13:00:25 · 609 阅读 · 0 评论 -
一张脑图整理Docker常用命令
:Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。其它的指令还有ENTRYPOINT、ARG、VOLUME、WORKDIR、USER、HEALTHCHECK、ONBUILD、LABEL等等。Dockerfile 是一个文本格式的配 文件,用户可以使用 Dockerfile 来快速创建自定义的镜像。一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。原创 2025-07-04 12:58:21 · 894 阅读 · 0 评论 -
什么是接口幂等性?为什么会产生接口幂等性问题?如何保证接口幂等性?
首先看看幂等性的概念:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。比如下面这些情况,如果没有实现接口幂等性会有很严重的后果: 支付接口,重复支付会导致多次扣钱;订单接口,同一个订单可能会多次创建。原创 2025-07-04 12:55:34 · 543 阅读 · 0 评论 -
StringBuilder/StringBuffer源码阅读笔记
这里我们先看一下AbstractStringBuilder这个类,StringBuilder、StringBuffer中的很多方法都是调用它们的父类。原创 2025-07-03 22:31:03 · 152 阅读 · 0 评论 -
Java Review(三十九、类加载机制与反射)
例如, 如果在 pg 的包中有一个名为 Person 的类, 被类加载器 ClassLoader 的实例 kl负责加载, 则该 Person 类对应的 Class 对象在 JVM 中表示为 Person、pg、kl ) 这意味着两个类加载器加载的同名类: (Person 、pg、 kl ) 和( Person、 pg、 kl2) 是不同的, 它们所加载的类也是完全不同、互不兼容的。在 Java 中, 一。类加载器负责加载所有的类, 系统为所有被载入内存中的类生成java.lang.Class 实例。原创 2025-07-03 21:52:48 · 506 阅读 · 0 评论 -
Java Review(三十五、注解)
©Documented 用于指定被该元注解修饰的注解类将被 javadoc 工具提取成文档, 如果定义注解类时使用了©Documented 修饰, 则所有使用该注解修饰的程序元素的 API 文档中将会包含该注解说明。必须编写代码来使用注解。注解不仅可以是这种简单的注解, 还可以带成员变量, 成员变量在注解定义中以无形参的方法形式来声明, 其方法名和返回值定义了该成员变量的名字和类型。使用注解修饰了类、 方法、 成员变量等成员之后, 这些注解不会自己生效, 必须由开发者提供相应的工具来提取并处理注解信息。原创 2025-07-03 21:50:06 · 800 阅读 · 0 评论 -
Java Review(三十四、JDBC)
一旦在 MySQL 的命令行窗口中输入 set autocommit=0 开启了事务, 该命令行窗口里的所有 DML语句都不会立即生效, 上一个事务结束后第一条 DML 语句将开始一个新的事务, 而后续执行的所有 SQL语句都处于该事务中, 除非显式使用 commit 来提交事务, 或者正常退出, 或者运行 DDL、 DCL 语句导致事务隐式提交。因此不仅安全, 而且编程十分简单。除 JdbcRowSet 需要保持与数据库的连接之外, 其余 4 个子接口都是离线的 RowSet, 无须保持与数据库的连接。原创 2025-07-03 21:48:50 · 978 阅读 · 0 评论 -
Java Review(三十三、异常处理----补充:断言、日志、调试)
对于包来说,一个包的名字与其父包的名字之间没有语义关系,但是日志记录器的父与子之间将共享某些属性。在一个专业的应用程序中,不要将所有的日志都记录到一个全局日志记录器中,而是可以自定义日志记录器。当断言被禁用时, 类加载器将跳过断言代码, 因此,不会降低程序运行的速度。这条命令将开启 MyClass 类以及在 com.mycompany.mylib 包和它的子包中的所有类的断言。另外, 还可以使用 Level.ALL 开启所有级别的记录, 或者使用 Level.OFF 关闭所有级别的记录。原创 2025-07-03 21:46:51 · 562 阅读 · 0 评论 -
Java Review(三十一、泛型)
根据前面的 List接口定义的代码可以发现 : add()方法有类型参数 E 作为集合的元素类型,所以传给 add 的参数必须是 E 类的对象或者其子类的对象。假设实现一个工具方法:实现将 src 集合中的元素复制到 dest 集合的功能,因为 dest 集合可以保存 src 集合中的所有元素,所以 dest 集合元素的类型应该是 src 集合元素类型的父类。不管 src 集合元素的类型是什么,只要 dest 集合元素的类型与前者相同或者是前者的父类即可,此时通配符的下限就有了用武之地。原创 2025-07-03 21:45:54 · 708 阅读 · 0 评论 -
Java Review (三十、集合----- 操作集合的工具类: Collections)
Java 提供了一个操作 Set 、 List 和 Map等集合的类:Collections , 该工具类里提供了大量方法对集合元素进行排序、 查询和修改等操作,还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。Collections 类中提供了多个 synchronizedXxxO方法,该方法可以将指定集合包装成线程同步的集合,从而可以解决多线程并发访问集合时的线程安全问题。Collections 还提供了如下常用的用于查找、替换集合元素的类万法。原创 2025-07-03 21:43:33 · 954 阅读 · 0 评论 -
Java Review (二十八、集合----- Queue 集合)
之所以说它是比较标准的队列实现 , 而不是绝对标准的队列实现 , 是因为 PriorityQueue 保存队列元的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。Deque 接口提供了 一个典型的实现类: ArrayDeque ,从该名称就可以看出 , 它是一个基于数组实现的双端队列,创建 Deque 时同样可指定一个 numElements 参数 , 该参数用于指定 Object[]数组的长度 :如果不指定 numElements 参数, Deque 底层数组的长度为 16。原创 2025-07-03 21:43:01 · 896 阅读 · 0 评论 -
Java Review (二十七、集合----- List 集合)
执行①行代码时 ,程序试图删除一个 A 对象 , List 将会调用该A对象的equals()方法依次与集合元素进行比较,如果该 equalsO方法 以某个集合元素作为参数时返回 true , List将会删除该元素——A 类重写了 equalsO方法 , 该方法总是返回 true。ArrayList 和 Vector 在用法上几乎完全相同 ,Vector十分古老,那时候 Java 还没有提供系统的集合框架,所以 Vector 里提供了 一 些方法名很长的方法。,无须程序保证该集合的同步性。原创 2025-07-03 21:41:32 · 566 阅读 · 0 评论 -
Java Review (二十六、集合----- Set 集合)
如果有两个元素通过 equals()方法比较返回 true,但它们的 hashCode()方法返回值不相等, HashSet 将会把它们存储在不同的位置,由此应该注意一个问题 : 当需要把一个对象放入 TreeSet中, 重写该对象对应类的 equals()方法时,应保证该方法与 compareTo(Object obj)方法有一致的结果,其规则 是 : 如果两个对象通过 equals()方法比较返回 true 时,这两个对象通过 compareTo(Object obj)方法比较应返回 0。原创 2025-06-30 21:20:35 · 963 阅读 · 0 评论 -
Java Review (二十五、集合----- Iterator接口)
Iterator接口 也是 Java 集合框架的成员 , 但它与 Collection 系列 、 Map 系列 的集合不 一样 : Collection系列集合、 Map 系列集合主要用于盛装其他对象,而 Iterator 则主要用于遍历(即迭代访问) Collection集合中的元素, Iterator 对象也被称为。Iterator 接口隐藏了各种 Collection实现类的底层细节,向应用程序提供了遍历 Collection 集合元素的统一编程接口。原创 2025-06-30 21:19:55 · 240 阅读 · 0 评论 -
Java Review (二十四、集合-----Collection 接口)
Collection 接口是 List 、 Set 和 Queue 接口的父接口,该接口里定义的方法既可用于操作 Set 集合 ,也可用于操作 List 和 Queue 集合。集合类就像容器,现实生活中容器的功能, 无非就是添加对象、删除对象、清空容器、判断容器是否为空等,集合类就为这些功能提供了对应的方法。原创 2025-06-30 21:19:21 · 230 阅读 · 0 评论 -
Java Review (二十三、集合-----概述)
Java 的集合类主要由两个接口派生而出 : Collection 和 Map , Collection 和 Map 是 Java 集合框架的根接口,这两个接口又包含了一些子接口或实现类。Map 与此类似, Map里的 key 是不可重复的, key 用于标识集合里 的每项数据,如果需要查阅 Map中的数据时,总是根据 Map 的 key 来获取。他们希望将传统的类融人新的框架中。与所有的集合类库设计者一样, 他们必须做出一些艰难的选择,于是,在整个设计过程中,他们做出了一些独具特色的设计决定。原创 2025-06-30 21:18:41 · 266 阅读 · 0 评论