
Java手写源码系列
文章平均质量分 80
Java手写源码系列
源码小哥
这个作者很懒,什么都没留下…
展开
-
Java源码系列-手写数据库连接池
在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接的获取和返回方法。如外部使用者可通过`getConnection`方法获取数据库连接,使用完毕后再通过`releaseConnection`方法将连接返回,注意此时的连接并没有关闭,而是由连接池管理器回收,并为下一次使用做好准备。为了更好的理解数据库连接池的底层原理,我们可以自己手写一个数据库连接池!原创 2022-05-15 15:44:28 · 2440 阅读 · 0 评论 -
Java.util.ConcurrentModificationException异常产生及解决办法
同步类容器都是线程安全的,但是在某些场景下可能需要加锁来保护复合操作。复合操作如:迭代(反复访问元素,遍历容器中所有的元素)、跳转(根据指定的顺序找到当前元素的下一个元素)、以及条件运算。这个复合操作在多线程并发地修改容器的时候,可能表现出意外的行为,最为经典的便是ConcurrentModifationException,原因是当容器迭代的过程中,被并发地修改了容器的内容,这是由于在早起迭代器设计的时候并没有考虑并发修改的问题。原创 2022-05-13 16:00:12 · 15790 阅读 · 0 评论 -
JVM专题(十二)-垃圾回收(三)
文章目录1.垃圾回收器分类1.1.串行1.2.吞吐量优先1.垃圾回收器分类相关概念:并行收集:指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态并发收集:指用户线程与垃圾收集线程同时工作(不一定是并行的可能会交替执行)。用户程序在继续运行,而垃圾收集程序运行在另一个CPU上吞吐量:即CPU用于运行用户代码的时间与CPU总消耗时间的比值(吞吐量 = 运行用户代码时间 / ( 运行用户代码时间 + 垃圾收集时间 )),也就是。例如:虚拟机共运行100分钟,垃圾收集器花掉1分钟,那么吞吐量就是9原创 2022-04-22 10:59:49 · 715 阅读 · 0 评论 -
JVM专题(十一)-垃圾回收(二)
文章目录1.垃圾回收算法1.1.标记清除1.2.标记整理1.3.复制1.垃圾回收算法1.1.标记清除将没有被引用的对象标记出来,然后清除。这里的清除并不是把内存空间置零操作,而是把这些空间记录下来,待后面分配空间的时候,去寻找是否有空闲的空间,然后进行覆盖分配。优点:速度较快缺陷:清除的空间比较零碎,当待分配的新对象过大,即使零碎空间加起来总共是够的,但是由于过于零散,所以无法对其进行分配。1.2.标记整理优点:没有内存碎片,连续空间比较充足缺点:涉及到地址的改变,开销大,效率低1.3原创 2022-04-21 10:46:53 · 262 阅读 · 0 评论 -
JVM专题(十)-垃圾回收(一)
1.如何判断对象可以回收1.1.引用计数法当一个对象被其他变量引用,该对象计数加一,当某个变量不在引用该对象,其计数减一当一个对象引用没有被其他变量引用时,即计数变为0时,该对象就可以被回收缺点:循环引用时,两个对象的计数都为1,导致两个对象都无法被释放1.2.可达性分析算法JVM中的垃圾回收器通过可达性分析来探索所有存活的对象扫描堆中的对象,看能否沿着GC Root对象为起点的引用链找到该对象,如果找不到,则表示可以回收可以作为GC Root的对象– 虚拟机栈(栈帧中的本地原创 2022-04-20 18:03:31 · 571 阅读 · 0 评论 -
JVM专题(九)-直接内存
文章目录1.定义2.基本使用2.1.Java操作磁盘文件2.2.NIO操作磁盘文件2.3.内存溢出2.4.分配和释放原理1.定义不是虚拟机的内存,是系统内存。Direct Memory常见于NIO操作时,用于数据缓存区分配回收成本过高,但读写性能高不受JVM内存回收管理2.基本使用import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.n原创 2022-04-20 14:44:10 · 801 阅读 · 0 评论 -
JVM专题(八)-StringTable调优
文章目录1.增加桶的个数2.考虑是否将字符串对象放入池中,即用intern1.增加桶的个数因为StringTable(串池)底层是hashmap,实现了去重的功能,所以它的性能跟桶的个数(链表的节点数息息相关),桶数越多,性能越强,所以,当我们数据量较大的时候,适当增加桶的个数,能有效的提高效率。相关命令-Xms500m -Xmx500m -XX:+PrintStringTableStatistics -XX:StringTableSize=20000演示代码/** * 演示串池大小对性能的原创 2022-04-20 12:28:22 · 658 阅读 · 0 评论 -
枚举单例那些事儿
信如果能看到我这篇博客的小伙伴,肯定都看过Joshua Bloch大神说过的这句话:“单元素的枚举类型已经成为实现Singleton的最佳方法”。其实,第一次读到这句话,我连其中说的单元素指什么都不知道,尴尬。后来,网上看了搜索了好几篇文章,发现基本上都是转载自相同的一篇文章,而我的困惑是“为什么要用枚举类型实现单例模式呢”,文章中都说的很笼统,于是决定自己结合Joshua Bloch的《effective java》写一篇总结下,给后来的同学做个参考。原创 2021-12-14 11:25:55 · 203 阅读 · 0 评论 -
JVM专题(七)-StringTable
1.StringTable特性常量池中的字符串仅是符号,第一次用到时才变成对象。利用串池的机制,来避免重复创建字符串对象字符串变量拼接的原理是StringBuilder(1.8)字符串常量拼接的原理是编译期优化可以使用intern方法,主动将串池中还没有的字符串对象放入串池 1.8将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有则放入串池,两种情况均会把串池中的对象返回。 1.6将这个字符串对象尝试放入串池,如果有则并不会放入,如果没有会把此对象复制一份,原创 2021-11-18 09:46:25 · 1132 阅读 · 0 评论 -
JVM专题(六)-方法区
1.定义Heap堆通过new关键字,创建对象都会使用堆内存特点它是线程共享的,堆中对象都需要考虑线程安全的问题有垃圾回收机制原创 2021-11-09 18:00:03 · 201 阅读 · 0 评论 -
JVM专题(五)-本地方法栈
文章目录1.定义1.1.native 本地方法2.特点1.定义1.1.native 本地方法本地方法栈,给本地方法的运行提供一个空间。jvm类并不是所有的方法都是java代码编写的,有些底层的方法就是通过c/c++实现的。而java可以调用这些底层方法来完成一些功能。在java调用这些底层方法时,就是运行在本地方法栈中。2.特点**本地方法栈(Native Method Stacks)**与 Java 虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行 Java 方法(也就原创 2021-11-09 11:40:45 · 292 阅读 · 0 评论 -
JVM专题(四)-堆(heap)
文章目录1.定义2.堆内存溢出3.堆内存诊断3.1.jmp诊断堆内存3.2.jconsole诊断堆内存3.3.jvisualvm诊断堆内存1.定义Heap堆通过new关键字,创建对象都会使用堆内存特点它是线程共享的,堆中对象都需要考虑线程安全的问题有垃圾回收机制2.堆内存溢出OutOfMemoryError:java heap space 堆内存溢出堆空间调整参数-Xmx空间大小-Xmx4G案例package com.heap;import java.util.Ar原创 2021-11-06 23:51:29 · 288 阅读 · 0 评论 -
JVM专题(三)-虚拟机栈
1.定义Java Virtual Machine Stacks (Java 虚拟机栈)每个线程运行需要的内存空间,称为虚拟机栈每个栈由多个栈帧组成,对应着每次调用方法时所占用的内存每个线程只能有一个活动栈帧,对应着当前正在执行的方法2.演示public class Main { public static void main(String[] args) { method1(); } private static void method1() { method2(1, 2)原创 2021-11-06 16:34:07 · 497 阅读 · 0 评论 -
JVM专题(二)-程序计数器
文章目录1.定义2.作用1.定义Program Counter Register 程序计数器(寄存器).下图表示程序计数器在我们JVM中所处的地位作用:是记录下一条 jvm 指令的执行地址行号。特点:是线程私有的不会存在内存溢出2.作用我们看到下图左边是二进制字节码,右边是Java源代码,二进制字节码主要先交给解释器来进行解释成机器码,这样CPU才能看懂。但是解释器一次解释一句二进制字节码指令,那么解释器如何知道下一条二进制字节码指令是什么,这时就需要程序计数器。程序计数器记录下一条原创 2021-11-05 13:03:24 · 238 阅读 · 0 评论 -
JVM专题(一)-JVM与Java体系结构
文章目录1.Java发展的重大事件2.虚拟机与Java虚拟机2.1.虚拟机2.2.Java虚拟机2.3.Jvm的位置2.4.JVM、JRE、JDK3.学习 JVM 有什么用?4.常见的JVM种类4.1.HotSpot VM4.2.J9 VM4.3.J9JRockit5.学习路线6.Java代码执行流程1.Java发展的重大事件在上世纪90 年代初,sun 公司有一个叫做Green 的项目,目的是为家用消费电子产品开发一个分布式代码系统,这样就可以对家用电器进行控制,和它们进行信息交流。詹姆斯·高斯林(原创 2021-11-04 19:02:17 · 380 阅读 · 0 评论 -
《Java手写系列》-手写MyBatis框架(四)
在上一篇中已经对sqlsession进行了构造,本章内容主要是针对Executor进行自定义。1.自定义Executor执行器接口package org.apache.ibatis.executor;import org.apache.ibatis.configration.Configuration;import org.apache.ibatis.configration.MappedStatement;import java.util.List;public interface Ex原创 2021-08-03 17:38:45 · 297 阅读 · 0 评论 -
《Java手写系列》-手写MyBatis框架(三)
文章目录1.自定义SqlSessionFactory接口2.自定义SqlSession接口3.自定义DefaultSqlSession实现类4.自定义DefaultSqlSessionFactory5.自定义SqlSessionFactoryBuilder本章接着上一章手写MyBatis,主要这集中在sqlSession对象的获取!1.自定义SqlSessionFactory接口SqlSessionFactory接口是获取session工厂的规范:package org.apache.ibatis.原创 2021-08-02 20:31:56 · 202 阅读 · 0 评论 -
《Java手写系列》-手写MyBatis框架(二)
下面接着第一章内容,手写MyBatis框架!1.自定义Resources类Resources类的作用是获取一个类加载器,根据配置文件的路径,将配置文件加载成字节输入流,存储在内存中。package org.apache.ibatis.io;import java.io.InputStream;public class Resources { /** * 根据配置文件的路径,将配置文件加载成字节输入流,存储在内存中。 * @param path 文件路径原创 2021-08-02 20:12:28 · 346 阅读 · 0 评论 -
《Java手写系列》-手写MyBatis框架(一)
1.前言我们刚开始搞java的时候,貌似都知道用jdbc去连接数据库,那我们来看一下jdbc连接数据库的代码:public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { // 加载数据库驱动 Class.forName("com.mysql.jdbc.Drive原创 2021-08-02 19:37:08 · 460 阅读 · 0 评论 -
《SpringCloud专题12》-微服务架构编码构建-手写Ribbon负载均衡器
1.前言Ribbon是SpringCloud的负载均衡器,默认的算法是轮询。在这里为了方便负载均衡的原理,可以自己手写一个负载均衡器2.自定义一个本地负载均衡器2.1.ApplicationContextBean去掉注解@LoadBalancedpackage com.itxiongmao.config;/** * @BelongsProject: springcloud2020 * @BelongsPackage: com.itxiongmao.config * @CreateTime:原创 2020-11-21 22:39:32 · 158 阅读 · 0 评论 -
《Java手写系列》-纯手写数据库连接池
1.数据库连接池原理1.1.基本原理在内部对象池中,维护一定数量的数据库连接,并对外暴露数据库连接的获取和返回方法。如外部使用者可通过getConnection方法获取数据库连接,使用完毕后再通过releaseConnection方法将连接返回,注意此时的连接并没有关闭,而是由连接池管理器回收,并为下一次使用做好准备。1.2.连接池作用①资源重用由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能开销。在减少系统消耗的基础上,增进了系统环境的平稳性(减少内存碎片以级数据库临时进程、线原创 2020-10-28 14:50:43 · 1565 阅读 · 2 评论 -
《Java手写系列》-源码专题-手写SpringAop
1.AOP回顾1.1.AOP的概念AOP(Aspect Oriented Programming)是面向切面编程。是OOP面向对象编程思想的一种补充。OOP通过继承,封装,多态等概念构建一个对象的层级结构。构建的是一个纵向的关系。面对横向的问题,实现起来比较复杂,比如日志的输出。使用面向对象的思想,每个类都需要增加日志打印的相关代码。但是使用aop就可以很简单的解决这个问题。aop将影响了多个类的公共行为(如日志打印)封装为一个可重用模块,定义为一个切面(aspect)。切面中包括切入点,通知,连接原创 2020-10-01 19:05:02 · 466 阅读 · 0 评论 -
《Java手写系列》-源码专题-手写SpringIoc
Spring框架 作为一个轻量级的开源框架不仅给我们的开发工作带来了许多便利,同时也为众多开源框架的研究提供了不可或缺的指导思想。Spring最为核心的两大功能特性就是IOC和AOP.下面主要介绍SpringIOC及自己实现SpringIOC1.SpringIOCSpringIOC 指的是控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然的我们需要创建一个容器,同时需要一种描述来让容器知道需要创建的对象与对象的关系。这个描述最具体表现就是我们可配置的文件。.原创 2020-10-01 13:45:15 · 372 阅读 · 3 评论 -
Swing编程-俄罗斯方块游戏
1.游戏的面向对象分析与设计涉及到几个对象(类)每个类中包含了什么方法1.1.游戏的显示面板GamePanel类void display(); //显示1.2.方块Shap类void moveLeft(); //左移void moveRight(); //右移void moveDown(); //下移void rotate(); //变形旋转void drawMe(...原创 2020-02-26 16:56:52 · 527 阅读 · 0 评论 -
《Java手写系列》-手写tomcat(三)-WEB服务器开发进阶
1.mytomcat【响应动态: 客户端访问小 Java 程序】1.1.思路分析在上一个版本中,浏览器客户端发送的请求是 http://127.0.0.1:8080/oa/index.html,从请求路径上看到浏览器客户端访问的是 WebApp 中的静态 html 页面,服务器找到该静态页面之后直接将html 页面响应到浏览器即可,但是如果浏览器发送这样的请求http://127.0.0.1:...原创 2020-02-06 20:52:46 · 593 阅读 · 0 评论 -
《Java手写系列》-手写tomcat(五)-javadoc 解析生成帮助文档
1.第一步:打开相应的选项面板2.第二步:设置-encoding是java代码编码,-charset是对生成文档所用的编码。-windowtitle就是对应html的标签-encoding UTF-8 -charset UTF-8 -windowtitle "test"3.第三步:结果...原创 2020-02-06 17:14:31 · 282 阅读 · 0 评论 -
《Java手写系列》-手写tomcat(四)-WEB服务器测试-网银转账系统
1.引言在前几章我们已经设计并完成了 WEB 服务器的研发,接下来我们开发一个简单的网银转账系统对 WEB 服务器进行测试。 以下我们的开发角色都是 WebApp 的开发人员。 我们给该 Web 应用起名为bank。2.mytomcat【准备工作】大家是否还记得在 WEB 服务器开发阶段,有这样一段代码是写死的,如下图所示:看上图中的 BootStrap 类,该类是 WEB 服务器开发人...原创 2020-02-06 16:47:17 · 775 阅读 · 0 评论 -
《Java手写系列》-手写tomcat(二)-WEB服务器开发基础
1.WEB 服务器研发过程1.1 使用 JDK 版本: JDK1.7 或更高版本1.2 集成开发环境 IDE: Idea1.3 安装浏览器: Chrom1.4 安装数据库管理系统MySQL1.5 WEB 服务器名称:mytomcat2 WEB 服务器研发细节2.1 mytomcat【工具类的定义】(1) 设置工作区字符编码 UTF-8(File Encodings...原创 2020-02-05 17:49:17 · 786 阅读 · 0 评论 -
《Java手写系列》-手写tomcat(一)-知识储备
1.系统架构1.1.C/S 架构1.1.1 概述Client/Server 架构,即服务器/客户端架构。是大家熟知的软件系统体系结构,通过将任务合理分配到 Client 端和 Server 端,降低了系统的通讯开销,需要安装客户端才可进行管理操作。常见的 C/S 架构的系统有: QQ、百度网盘等,以下为 C/S 架构的客户端登录页面1.1.2 优点(1) 界面和操作可以很丰富。(...原创 2020-02-05 12:33:06 · 534 阅读 · 0 评论