- 博客(51)
- 收藏
- 关注
原创 类文件结构详解.下
在 Class 文件,字段表,方法表中都可以携带自己的属性表集合,以用于描述某些场景专有的信息。与 Class 文件中其它的数据项目要求的顺序、长度和内容不同,属性表集合的限制稍微宽松一些,不再要求各个属性表具有严格的顺序,并且只要不与已有的属性名重复,任何人实现的编译器都可以向属性表中写 入自己定义的属性信息,Java 虚拟机运行时会忽略掉它不认识的属性。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名,由于 Java 语言的单继承,所以父类索引只有一个,除了。
2024-11-26 20:35:10
628
原创 类文件结构详解.上
Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。高版本的 Java 虚拟机可以执行低版本编译器生成的 Class 文件,但是低版本的 Java 虚拟机不能执行高版本编译器生成的 Class 文件。在常量池结束之后,紧接着的两个字节代表访问标志,这个标志用于识别一些类或者接口层次的访问信息,包括:这个 Class 是类还是接口,是否为。文件是不同的语言在 Java 虚拟机之间的重要桥梁,同时也是支持 Java 跨平台很重要的一个原因。
2024-11-22 19:13:21
910
原创 JVM垃圾回收详解.③
Parallel Scavenge 收集器提供了很多参数供用户找到最合适的停顿时间或最大吞吐量,如果对于收集器运作不太了解,手工优化存在困难的时候,使用 Parallel Scavenge 收集器配合自适应调节策略,把内存管理优化交给虚拟机去完成也是一个不错的选择。标记-整理(Mark-and-Compact)算法是根据老年代的特点提出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。
2024-11-21 19:27:19
937
原创 JVM垃圾回收详解.②
垃圾回收器绝不会回收它。的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的,需要被回收。软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,JAVA 虚拟机就会把这个软引用加入到与之关联的引用队列中。弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java 虚拟机就会把这个弱引用加入到与之关联的引用队列中。
2024-11-20 19:32:24
991
原创 JVM垃圾回收详解.①
如果对象在 Eden 出生并经过第一次 Minor GC 后仍然能够存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间(s0 或者 s1)中,并将对象年龄设为 1(Eden 区->Survivor 区后对象的初始年龄变为 1)。从垃圾回收的角度来说,由于现在收集器基本都采用分代垃圾收集算法,所以 Java 堆被划分为了几个不同的区域,这样我们就可以根据各个区域的特点选择合适的垃圾收集算法。Java 的自动内存管理主要是针对对象内存的回收和对象内存的分配。GC 期间虚拟机又发现。
2024-11-15 19:32:55
773
原创 Java内存区域详解.下
这两种对象访问方式各有优势。而 Java 堆内存是否规整,取决于 GC 收集器的算法是"标记-清除",还是"标记-整理"(也称作"标记-压缩"),值得注意的是,复制算法内存也是规整的。内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),这一步操作保证了对象的实例字段在 Java 代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。参数来设置),保存的是字符串(key)和 字符串对象的引用(value)的映射关系,字符串对象的引用指向堆中的字符串对象。
2024-11-14 20:06:28
747
原创 Java内存区域详解.中
方法区和永久代以及元空间的关系很像 Java 中接口和类的关系,类实现了接口,这里的类就可以看作是永久代和元空间,接口可以看作是方法区,也就是说永久代以及元空间是 HotSpot 虚拟机对虚拟机规范中方法区的两种实现方式。大部分情况,对象都会首先在 Eden 区域分配,在一次新生代垃圾回收后,如果对象还存活,则会进入 S0 或者 S1,并且对象的年龄还会加 1(Eden 区->Survivor 区后对象的初始年龄变为 1),当它的年龄增加到一定程度(默认为 15 岁),就会被晋升到老年代中。
2024-11-13 19:25:33
1009
原创 Java内存区域详解.上
栈绝对算的上是 JVM 运行时数据区域的一个核心,除了一些 Native 方法调用是通过本地方法栈实现的(后面会提到),其他所有的 Java 方法调用都是通过栈来实现的(也需要和其他运行时数据区域比如程序计数器配合)。另外,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。与程序计数器一样,Java 虚拟机栈(后文简称栈)也是线程私有的,它的生命周期和线程相同,随着线程的创建而创建,随着线程的死亡而死亡。
2024-11-12 23:41:31
513
原创 数据库范式和索引结构
和 AVL 树不同的是,红黑树并不追求严格的平衡,而是大致的平衡。正因如此,红黑树的查询效率稍有下降,因为红黑树的平衡性相对较弱,可能会导致树的高度较高,这可能会导致一些数据需要进行多次磁盘 IO 操作才能查询到,这也是 MySQL 没有选择红黑树的主要原因。也正因如此,红黑树的插入和删除操作效率大大提高了,因为红黑树在插入和删除节点时只需进行 O(1) 次数的旋转和变色操作,即可保持基本平衡状态,而不需要像 AVL 树一样进行 O(logn) 次数的旋转操作。,B+ 树是 B 树的一种变体。
2024-11-11 11:46:24
974
原创 java常用技术总结
缩短值的长度才是关键,如果值是一个大的业务对象,可以将对象序列化成二进制数组;先应该在业务上进行精简,去掉不必要的属性,避免存储一些没用的数据;列化方式无论从速度还是压缩比都不尽如人意,这时可以选择更高效的序列化工具,如。加载完成后,再通知主节点将期间修改的操作记录同步到复。工具选择上,应该选择更高效的序列化工具来降低字节数组大小;的整数对象池,用于节约内存。可以使用主从同步,从从同步。的作用是将明文密码加密成密文密码,以便于存储和校验。安全框架,提供了认证、授权、加密和会话管理功能,
2024-11-08 19:11:36
377
原创 CAS 详解
如果一个变量 V 初次读取的时候是 A 值,并且在准备赋值的时候检查到它仍然是 A 值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回 A,那 CAS 操作就会误认为它从来没有被修改过。方法就是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。的值,如果更新失败(当前值在此期间被其他线程修改),它会重新获取当前值并再次尝试更新,直到操作成功。
2024-11-07 19:10:29
565
原创 乐观锁和悲观锁详解
乐观锁总是假设最好的情况,认为共享资源每次被访问的时候不会出现问题,线程可以不停地执行,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)。高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。当多个线程同时使用 CAS 操作一个变量时,只有一个会胜出,并成功更新,其余均会失败,但失败的线程并不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。
2024-11-06 19:22:37
744
原创 Java NIO 核心知识.下
零拷贝是指计算机执行 IO 操作时,CPU 不需要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及 CPU 的拷贝时间。可以看出,无论是传统的 I/O 方式,还是引入了零拷贝之后,2 次 DMA(Direct Memory Access) 拷贝是都少不了的。零拷贝是提升 IO 操作性能的一个常用手段,像 ActiveMQ、Kafka 、RocketMQ、QMQ、Netty 等顶级开源项目都用到了零拷贝。这篇文章我们主要介绍了 NIO 的核心知识点,包括 NIO 的核心组件和零拷贝。
2024-11-05 17:22:04
477
原创 javaNIO核心知识.中
Selector 是基于事件驱动的 I/O 多路复用模型,主要运作原理是:通过 Selector 注册通道的事件,Selector 会不断地轮询注册在其上的 Channel。在示例中,我们创建了一个简单的服务器,监听 8080 端口,使用 Selector 处理连接、读取和写入事件。Channel 与前面介绍的 Buffer 打交道,读操作的时候将 Channel 中的数据填充到 Buffer 中,而写操作时将 Buffer 中的数据写入到 Channel 中。BIO 中的流是单向的,分为各种。
2024-11-04 22:17:29
1001
原创 SpringBoot+Shiro管理
Shiro是一款主流的Java安全框架,不依赖任何容器,可以运行在Java SE和Java EE项目中。它的主要作用是对访问系统的用户进行身份认证、授权、会话管理、加密等操作。Shiro基于session进行身份认证和访问控制,提供了一套完善的权限管理机制。
2024-11-04 20:01:48
904
原创 Java NIO 核心知识.上
在 Java 1.4 的 NIO 库中,所有数据都是用缓冲区处理的,这是新库和之前的 BIO 的一个重要区别,有点类似于 BIO 中的缓冲流。NIO 在读取数据时,它是直接读到缓冲区中的。NIO 弥补了同步阻塞 I/O 的不足,它在标准 Java 代码中提供了非阻塞、面向缓冲、基于通道的 I/O,可以使用少量的线程来处理多个连接,大大提高了 I/O 效率和并发。// 调用clear()方法,清空缓冲区,将 position 的值置为 0,将 limit 的值置为 capacity 的值。
2024-10-30 19:41:58
878
原创 Java IO 模型
IO 多路复用模型中,线程首先发起 select 调用,询问内核数据是否准备就绪,等内核把数据准备好了,用户线程再发起 read 调用。但是,当面对十万甚至百万级连接的时候,传统的 BIO 模型是无能为力的。同步非阻塞 IO 模型中,应用程序会一直发起 read 调用,等待数据从内核空间拷贝到用户空间的这段时间里,线程依然是阻塞的,直到在内核把数据拷贝到用户空间。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
2024-10-29 19:56:58
649
原创 Shiro会话管理和加密
Shiro提供了完整的企业级会话管理功能,不依赖于底层容器(如Tomcat),可以在JavaSE和JavaEE环境中使用。Shiro的会话管理功能包括会话创建、维护、删除、失效、验证等,是Shiro框架的核心组件之一。总之,Shiro的会话管理和加密功能为Java应用程序提供了强大的安全保障。通过合理配置和使用Shiro框架,开发者可以轻松地实现会话的创建、维护、删除和加密等功能,从而确保应用程序的安全性和稳定性。Shiro提供了多种加密方式和工具,帮助开发者实现数据的加密和解密。
2024-10-29 08:00:48
770
原创 IO模式设计.下
内部是通过一个 daemon thread(守护线程)采用定期轮询的方式来检测文件的变化,简化后的源码如下所示。对象可以获取事件的具体信息比如文件目录下是创建、删除还是修改了文件、创建、删除或者修改的文件的具体名称是什么。// 可以调用 WatchEvent 对象的方法做一些事情比如输出事件的具体上下文信息。// 将这个 path 对象注册到 WatchService(监控服务) 中去。(需要监听的事件)为可变长参数,也就是说我们可以同时监听多种事件。NIO 中的文件目录监听服务使用到了观察者模式。
2024-10-28 21:23:33
469
原创 Java IO 设计模式.上
IO 流中的字符流和字节流的接口不同,它们之间可以协调工作就是基于适配器模式来做的,更准确点来说是对象适配器。更侧重于让接口不兼容而不能交互的类可以一起工作,当我们调用适配器对应的方法时,适配器内部会调用适配者类或者和适配类相关的类的方法,这个过程透明的。更侧重于动态地增强原始类的功能,装饰器类需要跟原始类继承相同的抽象类或者实现相同的接口。装饰器模式通过组合替代继承来扩展原始类的功能,在一些继承关系比较复杂的场景(IO 这一场景各种类的继承关系就比较复杂)更加实用。的子类实在太多,继承关系也太复杂了。
2024-10-26 16:55:23
759
原创 IO流.下③
System.out.println("读取之前的偏移量:" + randomAccessFile.getFilePointer() + ",当前读取到的字符" + (char) randomAccessFile.read() + ",读取之后的偏移量:" + randomAccessFile.getFilePointer());读取之前的偏移量:0,当前读取到的字符A,读取之后的偏移量:1。读取之前的偏移量:0,当前读取到的字符A,读取之后的偏移量:1。如果想要获取文件指针当前的位置的话,可以使用。
2024-10-25 19:33:40
580
原创 IO流.上②
从源头(通常是文件)读取数据(字节信息)到内存的过程中不会一个字节一个字节的读取,而是会先将读取到的字节存放在缓存区,并从内部缓冲区中单独读取字节。将数据(字节信息)写入到目的地(通常是文件)的过程中不会一个字节一个字节的写入,而是会先将要写入的字节存放在缓存区,并从内部缓冲区中单独写入字节。由于字节缓冲流内部有缓冲区(字节数组),因此,字节缓冲流会先将读取到的字节存放在缓存区,大幅减少 IO 次数,提高读取效率。因此,I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。
2024-10-24 19:34:44
563
原创 Shiro授权
授权(Authorization),也称为访问控制,是确定是否允许用户/主体做某事的过程。在Shiro安全框架中,授权是核心组件之一,它负责控制用户对系统资源的访问权限,确保用户只能访问其被授权的资源。通过授权,系统可以实现对用户行为的精细化管理,提高系统的安全性和可控性。
2024-10-23 19:42:59
951
原创 shiro
Shiro 是一个强大而灵活的 Java 安全框架,主要用于解决认证(Authentication)、授权(Authorization)、加密和会话管理等问题。认证(Authentication)、授权(Authorization)、会话管理(Session Management)、加密(Cryptography)被Shiro框架的开发团队称之为应用安全的四大基石,详细功能如下Authentication:身份认证/登录,验证用户是不是拥有相应的身份。
2024-10-17 09:06:23
1069
原创 IO流.上①
数据输入到计算机内存的过程即输入,反之输出到外部存储(比如数据库,文件,远程主机)的过程即输出。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。是一个比较常用的字节输入流对象,可直接指定文件路径,可以直接读取单字节数据,也可以读取至字节数组中。是最常用的字节输出流对象,可直接指定文件路径,可以直接输出单字节数据,也可以输出指定的字节数组。用于读取指定类型数据,不能单独使用,必须结合其它流,比如。用于写入指定类型数据,不能单独使用,必须结合其它流,比如。
2024-10-16 18:44:10
888
原创 map.下④
可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个。这些方法都可以接受一个函数作为参数,根据给定的 key 和 value 来计算一个新的 value,并且将其更新到 map 中。是线程安全的,意味着它可以保证多个线程同时对它进行读写操作时,不会出现数据不一致的情况,也不会导致 JDK1.7 及之前版本的。也就是说,多线程下无法正确判定键值对是否存在(存在其他线程修改的情况),单线程是可以的(不存在其他线程修改的情况)。中,还是根本没有这个键。
2024-10-15 22:38:52
679
原创 map.下(3)
属性维护红黑树的根结点,因为红黑树在旋转的时候,根结点可能会被它原来的子节点替换掉,在这个时间点,如果有其他线程要写这棵红黑树就会发生线程不安全问题,所以在。只锁定当前链表或红黑二叉树的首节点,这样只要 hash 不冲突,就不会产生并发,就不会影响其他 Node 的读写,效率大幅提升。)的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。,代码量从原来 Java 7 中的 1000 多行,变成了现在的 6000 多行。是一种可重入锁,扮演锁的角色。
2024-10-14 19:58:26
663
原创 集合.下②
但是,问题是一个 40 亿长度的数组,内存是放不下的。相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。
2024-10-11 18:56:39
874
原创 集合(下)①
自己不得不实现之外,其他方法都是直接调用。总是使用 2 的幂作为哈希表的大小。有了对集合内元素的搜索的能力。的源码非常非常少,因为除了。
2024-10-10 23:33:32
890
原创 集合.上(2)
ArrayList的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用操作来增加ArrayList实例的容量。这可以减少递增式再分配的数量。ArrayList继承于,实现了ListCloneable这些接口。List: 表明它是一个列表,支持添加、删除、查找等操作,并且可以通过下标进行访问。:这是一个标志接口,表明实现这个接口的List集合是支持快速随机访问的。在ArrayList。
2024-10-09 18:56:03
787
原创 最佳实践(1)
Java 集合,也叫作容器,主要是由两大接口派生而来:一个是。// 初始化一个 String 类型的 ArrayList。// 删除数组中的元素,需要手动移动后面的元素。// 初始化一个 String 类型的数组。// 修改 ArrayList 中的元素。// 删除 ArrayList 中的元素。// 添加元素到 ArrayList 中。接口,主要用于存放单一元素;接口,主要用于存放键值对。内部基于动态数组实现,比。// 修改数组元素的值。
2024-10-08 21:01:37
626
原创 JPA+Thymeleaf增删改查
在使用JPA(Java Persistence API)和Thymeleaf进行增删改查(CRUD)操作时,你通常会结合Spring Boot框架来简化开发过程。以下是一个基本的步骤指南和示例代码,展示如何使用这些技术来实现CRUD操作。
2024-09-24 08:10:03
945
原创 Thymeleaf模版引擎
定义与功能Thymeleaf模板引擎实现了用户界面与业务数据的分离,可以生成特定格式的文档,对于Web应用而言,主要是生成标准的HTML文档。它允许开发者以清晰和直观的方式将服务器端的数据与HTML、XML、JavaScript、CSS以及纯文本等模板文件结合起来。特点自然模板技术:开发者可以编写标准的HTML代码,并通过Thymeleaf特有的属性和表达式(如th:textth:if等)来动态插入或修改内容,而无需改变HTML的结构或引入特定的模板语法。高性能。
2024-09-24 08:01:48
653
原创 JPA关联&MyBatis
JPA提供了强大的ORM支持,使得对象与数据库之间的映射变得简单和自动化。JPA关联通过注解实现,适合那些希望减少数据库操作代码,并依赖JPA提供者(如Hibernate)来处理复杂场景的情况。MyBatis则提供了更高的灵活性和控制能力,允许开发者编写具体的SQL语句,并通过映射文件精确地控制如何将查询结果映射到Java对象。MyBatis适合那些需要高度优化SQL性能,或者需要在复杂查询中保持对SQL完全控制的情况。
2024-09-05 08:25:04
626
原创 SpringBoot数据访问jpa
Spring Boot 结合 JPA(Java Persistence API)提供了一种非常强大且灵活的数据访问方式,使得开发者能够更专注于业务逻辑的实现,而不是底层的数据库操作。
2024-09-03 08:27:16
919
原创 SpringBoot入门
Spring Boot通过提供大量的自动配置和简化的开发流程,极大地提高了Spring应用的开发效率。它支持快速创建独立运行的Spring项目,与主流框架的集成变得简单,同时减少了开发者需要编写的配置代码。通过使用Profiles,开发者可以轻松地管理和切换适用于不同环境的配置。Spring Boot的打包与运行也非常简单,只需要一个可执行的jar文件和一个java命令即可。
2024-08-29 08:41:47
525
1
原创 SpringMVC扩展和SSM框架整合
Jackson:你可以为等日期类型创建自定义的和。然后,使用和注解将这些序列化器和反序列化器应用到你的模型类上。Gson:Gson允许你通过注册自定义的来处理特定的类型,包括日期类型。对于Jackson,你可以在模型类的日期字段上使用注解来指定日期时间的格式。这样,Jackson在序列化和反序列化时就会使用这个指定的格式。Gson没有内置的注解,但你可以通过编写自定义的或来实现类似的功能。
2024-08-08 19:51:56
799
1
原创 框架升级文件上传
Spring MVC 是一个用于构建 Web 应用程序的框架,它基于 Java 的 Servlet API,但提供了更为高级的功能和更加清晰的分离关注点(如模型、视图和控制器)。下面,我将简要介绍如何在 Spring MVC 框架中实现基本的增删改查(CRUD)功能。
2024-08-08 19:40:18
593
原创 单例模式及统一异常处理
单例模式和统一异常处理是软件开发中常用的两种设计模式,它们各自解决不同的问题,但在很多情况下可以结合起来使用以提高软件的可维护性和健壮性。
2024-08-06 08:25:30
443
原创 SpringMVC框架
SpringMVC框架是Spring Framework提供的一个用于构建Web应用程序的组件,全称为Spring Web MVC。它是基于MVC(Model-View-Controller,模型-视图-控制器)设计模式实现的,旨在简化Web应用程序的开发过程。
2024-07-26 21:32:52
460
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人