
java
文章平均质量分 95
jchen104
芝兰生于幽谷,不以无人而不芳
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java内存结构
方法区(Method Area)也被称为永久代。方法区用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。运行时常量池(Runtime Constant Pool)是方法区的一部分。Class 文件中除了有类的版本/字段/方法/接口等描述信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将类在加载后进入方法区的运行时常量池中存放。OutOfMemoryError 简称为 OOM。原创 2024-01-09 10:03:07 · 1267 阅读 · 0 评论 -
Tomcat源码:连接器与Executor、Connector
在前面得文章中,我们介绍了Tomcat中得容器是如何从service启动到具体得servlet包装类wrapper得。servlet容器启动后就可以为我们提供访问服务了吗?答案是否定得,因为servlet只规定了如何处理请求,但没有实现请求得分发,这个功能是由tomcat得另一部分连接器来完成得。(图片来源《Tomcat连接器》,左侧为连接器,右侧为容器)连接器的启动点为connector组件,在前文《Tomcat源码:StandardServer与StandardService》原创 2023-05-10 23:00:25 · 2006 阅读 · 0 评论 -
Tomcat源码:Pipeline与Valve
在前文中,我们介绍了tomcat容器部分中的Engine、Host、Context、Wrapper,截止Wrapper中loadOnStartup=1的servelt启动后整个tomcat的启动就算完成了,不过除了容器tomcat还有连接器的部分,即如何将请求发给对应的servlet来进行处理。连接器的内容我们会在后续的文章中进行介绍。原创 2023-04-26 21:26:46 · 1170 阅读 · 0 评论 -
DDD领域驱动设计入门:1
由于最近接触的新项目采用了DDD领取驱动设计的方式,网上对DDD的讲解文章很多都是偏理论的且很多都倾向于和微服务的结合,对一些朋友不太友好,因此本文计划直接以代码示例的方式来进行讲解,将抽象的概念具体化,让初学者也能快速入门。原创 2023-04-23 10:39:31 · 437 阅读 · 0 评论 -
Spring源码:动态代理的增强顺序(AOP与事务的先后)
在之前的文章中,我们介绍了AOP与Spring事务的内容(事务管理也是通过AOP的动态代理实现的),包括代理的创建、执行等,但是遗留了一个问题,那就是多个增强的执行顺序是怎样的,本文我们就来进行下梳理。AOP在被设置在了后置处理器中,每个bean创建完后会判断是否需要创建代理类,如果需要则获取所有的通知方法(包括继承了Advisor接口的实现类与@Aspect标注的切面类中的增强方法,包装为Advisor类)并放入缓存中以便下次代理,然后筛选出适用于当前bean的增强并封装为代理对象。原创 2023-04-30 17:37:54 · 2033 阅读 · 2 评论 -
SpringMVC源码:DispatcherServlet初始化流程
MVC结构我们都知道,将模型、视图与控制器拆分实现分层。SrpingMVC采用类似的结构。不同的地方在于,SpringMVC的控制器多了一个,即前端控制器。前端控制器的作用在于将不同的请求根据地址转给不同的控制器进行处理,并对返回的模型选择相应的视图进行渲染。原创 2023-02-26 11:13:40 · 1192 阅读 · 0 评论 -
设计模式:行为型设计模式
行为型模式是将不同的行为代码解耦,从而解决特定场景问题的一些经典结构。行为型设计模式主要解决的就是“类或对象之间的交互”问题。行为型设计模式比较多,有 11 个,几乎占了 23 种经典设计模式的一半。它们分别是:观察者模式、模板模式、策略模式、职责链模式、状态模式、迭代器模式、访问者模式、备忘录模式、命令模式、解释器模式、中介模式。只定义一个方法过程中的主要过程,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤,这就是模板模式。原创 2023-02-18 09:45:04 · 609 阅读 · 0 评论 -
Java8之JMX与MBean
Dynamic MBean必须实现javax.management.DynamicMBean接口,所有的属性,方法都在运行时定义。另外还有两类 MBean:Open MBean 和 Model MBean,实际上它们也都是动态 MBean。原创 2022-12-18 16:00:17 · 2091 阅读 · 0 评论 -
Java8:SPI机制
SPI(Service Provider Interface)是JDK内置的一种 服务提供发现机制,可以用来启用框架扩展和替换组件,主要是被框架的开发人员使用。比如java.sql.Driver接口,不同厂商可以针对同一接口做出不同的实现,MySQL和PostgreSQL都有不同的实现提供给用户,而Java的SPI机制可以为某个接口寻找服务实现。Java中SPI机制主要思想是将装配的控制权移到程序之外,在模块化设计中这个机制尤其重要,其核心思想就是解耦。原创 2022-12-11 13:04:26 · 815 阅读 · 0 评论 -
Tomcat:servlet与servlet容器
在介绍Tomcat之前,我们首先需要了解它的作用,简单的说,tomcat就是一个servlet容器。因此,本文首先从Web 应用程序开始讲起,逐步介绍servlet。Web即表示网页的意思,它用于表示 Internet 主机上供外界访问的资源。Web 应用程序是一种可以通过 Web 访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件。静态 web 资源:指 web 页面中供人们浏览的数据始终是不变。原创 2022-11-30 09:22:41 · 1651 阅读 · 0 评论 -
java8:关闭钩子shutdown hook
在Java程序退出时,我们可能需要先执行一些善后工作,如关闭线程池、连接池、文件句柄等,即所谓“优雅停机”(graceful shutdown)。如何保证善后工作的代码能够被执行到呢?Java为用户提供了关闭钩子(shutdown hook)。这些钩子可以在应用关闭时帮助我们完成JVM退出前的善后工作,例如删除临时文件,或者清除无法由操作系统自动清除的资源。程序正常退出,即最后一个非守护线程结束时;程序中执行到了System.exit()方法;终端接收到了CTRL-C中断,或者注销登录;原创 2022-11-28 09:09:29 · 1916 阅读 · 0 评论 -
性能优化:线程快照获取与分析
当我们想了解系统运行情况时,经常需要用到线程快照,这里介绍下线程快照的获取和分析。需要注意的时,线程快照展示的是某一时刻的线程状况,我们一般需要连续获取三到五次线程快照才能得到完整的运行状况。一、线程快照的导出1、JDK工具jstackjstack 命令是JDK工具之一,使用该命令可以打印正在运行中 Java 进程的栈信息。..............................原创 2022-06-27 08:30:00 · 7417 阅读 · 0 评论 -
性能优化:位运算的运用
写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。一、位运算初窥 1、位运算的简介计算机中所有的数据二进制的形式存储在设备中,即 0、1 两种状态。计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。符号 描述 运算规则 & 与 两个位都为1时,结果才为1 0&0=0 0&1=0 1&0=0 1&1=1 ...原创 2022-03-14 08:00:00 · 848 阅读 · 0 评论 -
Java8之反射源码
参考资料:《深入理解java反射原理》《深入理解 Java 反射和动态代理》《JAVA反射机制及理解》前文:《Java8之反射》写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。一、反射使用实例// person.javapublic class Person { // 其余省略... public Person() { System.out.println("调用默认构造函数");原创 2022-03-05 17:19:13 · 977 阅读 · 0 评论 -
Java8之类加载机制class源码分析
一、loadClass 类加载器的加载时通过loadClass方法实现的,改方法也是双亲委派机制实现的入口,在之前的文章中我们讲过,除了顶层的BootstrapClassLoader,其余类加载器都会先调用父加载器尝试查找加载缓存,如果所有父加载器中都没有才会调用自身的findClass方法加载该class。protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundEx...原创 2022-02-28 08:30:00 · 860 阅读 · 0 评论 -
Java8之序列化
参考资料:《序列化理解起来很简单》《一文带你全面了解java对象的序列化和反序列化》《深入理解 Java 序列化》写在开头:本文为个人学习笔记,内容比较随意,夹杂个人理解,如有错误,欢迎指正。一、序列化是什么1、序列化的定义序列化的意图是希望对一个Java对象作一下“变换”,变成字节序列,这样一来方便持久化存储到磁盘,避免程序运行结束后对象就从内存里消失,另外变换成字节序列也更便于网络运输和传播,所以概念上很好理解:序列化:把Java对象转...原创 2022-02-21 08:30:00 · 1116 阅读 · 0 评论 -
Java8之动态代理
参考资料:《Java动态代理分析》《JAVA动态代理》《Java 动态代理类》写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。原创 2022-02-15 10:58:44 · 718 阅读 · 0 评论 -
Java8之深克隆与浅克隆
参考资料:《深克隆和浅克隆有什么区别呢?它们是怎么实现的呢?》一、深克隆与浅克隆介绍 1、概述 java中允许将一个对象赋值出一份完全一样的对象出来,称之为克隆。克隆又分浅克隆与深克隆,他们的区别在于,对于引用类型的成员变量,浅克隆复制的是引用,而深克隆复制的是对象。 浅克隆(Shadow Clone)是把原型对象中成员变量为值类型的属性都复制给克隆对象,把原型对象中成员变量为引用类型的引用地址也复制给克隆对象,也就是原型对象中如果有成员变...原创 2022-02-09 17:20:45 · 1764 阅读 · 2 评论 -
Java8之反射
参考资料:《Java 基础 - 反射机制详解》《Java中Class对象详解》《java基础:深入理解Class对象与反射机制》《java反射机制》《Java基础之—反射》原创 2022-02-12 11:12:48 · 1034 阅读 · 0 评论 -
Java8之类的加载
参考文章:《JVM 基础 - Java 类加载机制》《Java的类加载器与双亲委托机制》《Java ClassLoader 理解》写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。目录一、类的生命周期 1、概述2、 加载3、连接 3.1、验证: 确保被加载的类的正确性 3.2、准备: 为类的静态变量分配内存,并将其初始化为默认值3.3、...原创 2022-02-07 08:45:00 · 1555 阅读 · 0 评论 -
Java8之泛型
泛型是JDK1.5版本引入的,以泛型类为例,申明泛型类时需带上参数类型T,成员变量就可以被限制为T的类型。不过需要注意的是,申明为泛型类,不代表新建对象时必须增加泛型限制。当类定义中的类型参数没有任何限制时,在类型擦除中直接被替换为Object,即形如和的类型参数都被替换为Object。当类定义中的类型参数存在限制(上下界)时,在类型擦除中替换为类型参数的上界或者下界,比如形如和原创 2022-01-03 18:13:43 · 3036 阅读 · 0 评论 -
Java8之BufferedInputStream源码
参考文章:《java.io.BufferedInputStream 源码分析》《IO源码解析--一文说尽BufferedInputStream》《BufferedInputStream 源码学习笔记》《JavaIO之BufferedInputStream详解》写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。前段时间遇到个需求涉及到了IO,趁这机会重新复习了下,这里简单记录下对缓冲流的理解。Java中的缓冲流BufferedInputStr...原创 2021-11-14 23:09:41 · 1678 阅读 · 0 评论 -
Java8之stream
参考文章:Java 8 stream的详细用法写在开头:本文为学习后的总结,可能有不到位的地方,错误的地方,欢迎各位指正。项目上对于list集合操作使用stream流较多,因此专门抽了个时间整理下这篇博客则侧重于实现方法的展示,主要涉及的中间操作符和终止操作符如下需要注意的是,stream转换流并不会改动原始对象(1)中间操作符filter 过滤操作,把不想要的数据过滤。sorted(unordered) 排序操作,对元素排序,前提是实现Comparable接口,当然也可以原创 2021-08-23 17:18:22 · 339 阅读 · 0 评论