自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 收藏
  • 关注

原创 JVM类加载图示

拿图请标明出处

2021-04-03 21:54:03 3158

原创 MAC地址-集线器-ARP

传输数据有了数据链路就可以实现两台数据之间通信了,下图是基于PPP协议进行通信但是如果要多台主机进行通信怎么办?每一个主机都只能和另外一台主机相关联,如果想要进行多台主机的通信那么必须要使用一个中间设备来连接,例如想要实现3台主机之间的通信,我们可以使用一个中间设备,该设备拥有三个网络接口,可以和三台主机关联,我们假设该设备就是改造过后的一个计算机三台主机都与主机P相关联逻辑上就可以进行通信了,使用计算机来充当这个中间设备太过于浪费,因为计算机的功能远远不止于此,还可以进行很多其他操作。集线器

2021-01-14 11:37:29 11298 1

原创 计算机网络-数据链路层-多图

计算机网络体系结构常见的三种网络分层结构OSI: 国际标准化组织提出的网络层次结构TCP/IP: 我们现在用的最多的网络层次结构五层原理: 这是方便我们学习计算机网络而划分的,将物理层和数据链路层分离了出来为什么有多种不同网络层次划分OSI七层网络模型是国际标准化组织提出的,但是在OSI七层网络提出前TCP/IP网络模型已经被大规模使用了,成为了因特网事实上的网络模型(使用了TCP/IP模型的网络就是因特网,因特网是世界上最大的互联网)ps: 下面介绍的内容都是基于 五层原理体系图网络分层

2021-01-06 16:17:34 12709 1

原创 单点登陆和无状态登陆

很多人都听说过单点登陆。今天我们来说说什么是单点登陆和无状态登陆。传统的项目都是使用session来验证登陆,但是在分布式项目中使用session是不行的。因为每个服务都是一个独立的项目,那么我们将服务拆分,肯定会有一个登陆的模块。如果将用户信息保存到session中那么也只有对登陆这个模块有效。而且使用session做登陆的话还有很多缺点,比如服务器要保存每个用户的session这样做的...

2019-08-24 13:36:24 12239 2

原创 类加载器的命名空间

命名空间是类加载器中一个很重要的概念,对于只要学过java的人都知道java万物皆对象,在java中即使是一个“.class”文件,通过类加载器加载到虚拟机内存,那么在内存中会生成一个对应的Class对象那么问题又来了,你应该听说过,一个类在内存中只能有一个Class对象,那么真的是这样吗?没有任何前提吗?接下类我们就来详细的分析一下,为什么那么多人说同一个类在内存中有且只有一个Cla...

2019-08-21 12:21:11 12015 2

原创 java中获取泛型参数详解【全网最详细】

java中所有的类型都继承自Type其中包括Class类也是继承自它,另外它还有四个重要的子类如果调用Method的getGenericParameterTypes()可获取到带泛型的参数。

2023-09-16 00:17:54 1037

原创 Mysql行格式索引页

每条记录是如何存储的每条记录都会有我们的真实数据和一些额外数据数据在索引页中会组成一个链表删除数据时只是打了一个删除标记,并不是真正的数据删除的数据也会组成一个链表,称为垃圾链表每个索引页中会生成两条虚拟记录分别是Infimum和Supremum记录会将页中的记录分为很多个组,每个组的最大记录会记录到一个称为槽的地方当在单个索引页查找数据时会遍历每个槽来查找数据在有多个索引页时会记录每个页的最小记录以及该记录所在的页号

2023-03-18 17:34:06 679

原创 PE文件硬编码代码注入

以下适合有PE基础的人看,最起码要知道PE的基本结构和rva以及foa之间如何相互转换,不然会看的迷迷糊糊首先我们需要准备一个程序,待会将代码注入这个程序中随便编写一个简单的程序,将随机基址给关闭程序编译完成之后就是一堆二进制的数据,如果我们想将代码注入到这个程序中,我们也只能以二进制的形式进行注入,不能像编码高级语言一样,比如我们想将 这段代码注入进去,要求是在程序运行时首先运行这段代码,然后再跳转到之前的代码逻辑我们想将这段代码注入进去的话就只能将这段代码翻译成二进制的形式,然后再到这个exe的

2022-12-03 16:08:08 605

原创 记一次调第三方接口反序列化时容易出现且忽略的问题且很难排查

出现问题在完成上周工作时有一个接口出现了一个 empty string异常,刚开始还以为是我项目没重启导致的(因为我确信我的业务代码没有问题),然而事情并没有我想象中的简单。首先来看这个异常是在feign的解码器中抛出来的异常,解码失败了,说什么是空字符串,我还以为是第三方接口返回了一个空字符串?然后又调试,发现第三方接口返回的内容没有问题, 然后我就懵逼了然后我只能说服自己要坚强,接下来就一步一步调异常是在 feign解码时抛出来的,那好,我们在这里下个断点发现是在进行json反序列

2021-08-09 10:23:47 298 1

原创 C语言实现二叉树--->二叉查找树

二叉查找树是二叉树中最简单的了定义若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;任意节点的左、右子树也分别为二叉查找树。没有键值相等的节点(no duplicate nodes)。假设有一个节点,这个节点的左右节点都有值,那么它左边的节点一定小于它本身,它右边的节点一定大于它本身,就和上面的图一样C语言实现分别创建三个文件bin_tree.hbin_tree.cbin_tr

2021-04-22 15:39:17 800

原创 被C语言的malloc给坑了

事情是这样的,最近想用C语言实现一些数据结构,今天在写二叉树时在linux下使用gcc编码是没有任何问题的,然而当我在本地window使用clion编写时,同样的代码竟然不能用了,反复看了下代码没有任何问题,然后我把代码拷贝到linux中用gcc编译执行竟然是好的,是能正常执行的问题说明接下来说说我的问题通过 Tree_create() 返回了一个Tree结构体的指针,然后通过add()方法添加元素,然而这段执行完后没有任何输出,也就是有问题的,我反复确认了我的添加逻辑,确认没有问题发现问题接

2021-04-17 01:30:14 361

原创 为什么List<Dog>不能隐式转为List<Animal> ?

public class Main { public static void main(String[] args) { List<Cat> catList = Lists.newArrayList(); List<Dog> dogList = Lists.newArrayList(); List<Animal> animalList2 = dogList; // 编译报错 test1(catList); // .

2021-04-01 11:22:30 10679 3

原创 从ReentrantLock的角度来看AQS原理

ReentrantLockReentrantLock作为java api层面的加锁方式,其性能比synchronized更好(synchronized进行优化后性能差不太多),灵活性更强ReentrantLocksynchronized可重入可重入可尝试加锁不能尝试加锁加锁时支持打断加锁时不支持打断加锁时可设置超时时间不能设置超时时间关联多个条件队列关联一个条件队列需要手动释放锁自动释放锁公平&非公平非公平

2021-03-20 18:29:32 10597 3

原创 经过测试synchronized并不会立即释放锁

今天在测试进入偏向锁之后调用锁对象的hashCode()会不会升级为重量级锁,结果无意中测试出来了,synchronized进入重量级锁之后,即使临界代码执行完了也并不会立即释放锁先来看看对象头各个bit的含义上代码public class ObjectHeader { public static void main(String[] args) throws InterruptedException { Object monitor = new Object();

2021-03-07 16:21:10 11171 2

原创 分享一个关于类加载类初始化的面试题的坑

public class Test { private static final Test INSTANCE = new Test(); private static int x = 0; private static int y; public Test() { x++; y++; } public static Test getInstance() { return INSTANCE; }

2021-03-02 17:40:04 10286 1

转载 RBAC新解:基于资源的权限管理(Resource-Based Access Control)

原文地址转载地址本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的。同时我将讨论一种我认为更好的权限管理方式什么是角色当说到程序的权限管理时,人们往往想到角色这一概念。角色是代表一系列可执行的操作或责任的实体,用于限定你在软件系统中能做什么、不能做什么。用户帐号往往与角色相关联,因此,一个用户在软件系统中能做什么取决于与之关联的各个角色。例如,一个用户以关联了”项目管理员”角色的帐号登录系统,那这个用户就可以做项目管理员能做的所有事情――如列出项目中的应用、管理项目

2021-01-27 14:47:45 10890

原创 finally这样写会吞掉异常?

在finally中写return语句最终会造成吞掉异常的后果从JVM指令层面来看可以看到 如果从 0 到 9 (不包含9) 出现了任何异常都会跳转到 8的位置而接下来所做的,仅仅只把异常对象存储到了局部变量表中的0号位置,接着把30放入栈顶就返回了期间丢失了 athrow指令,所以不会有任何异常堆栈的显示,所以在开发中最好不要在finally 中写return语句,否则会吞噬异常...

2020-07-19 14:44:56 10603 2

原创 一文学会使用MethodHandle

MethodHandle方法句柄第一次看到这个类是在看Mybatis源码,自以为对java很熟悉,反射很熟的我,看到这个API竟然不知道是干什么用的因此花了很多时间去了解这个东西,发现网上的资料是很少的,特别是对刚接触这个api的人很不友好,后来通过自己的不断验证,不断查找资料,终于有了一些自己的了解,但还是不是很深,因为这套Api涉及到jVM指令层去了MethodHandles这个类有一下三点作用查找方法,以及可以帮助字段或者方法创建相应的方法句柄(MethodHandle)组合器方法,用于

2020-07-19 14:34:19 11670

原创 java不通过构造函数创建对象(Unsafe)

java中不通过构造函数创建对象(也有说不创建对象直接执行成员方法)这里就不和你们扯什么通过 反序列化、clone等方法了 个人觉得都是在胡扯。如何不执行构造函数创建对象?先来带大家认识一个类 sun.misc.Unsafe 该类主要提供一些直接访问系统内存资源等等(学过C语言的应该知道和C语言中的指针一样),但是由于此类能够直接操作内存,这无疑也增加了程序的安全风险。所以技术不是那么好的千万不要在应用中直接使用哟。从上图可以看出 java是不允许直接创建该类对象的,但是我们可以看到第一个红框

2020-05-31 17:02:16 13299 1

原创 使用docker安装jenkins

接下来将一系列博客都将介绍jenkins与docker持续集成。先来介绍怎么用docker安装jenkins然后在下篇中我们将介绍怎么将我们的springboot项目用jenkins来持续集成安装java我们知道jenkins是使用java开发的。所以肯定是要用到java环境,但是使用jenkins安装的话,其镜像类已经封装了openJdk 所以其实这一步可以省略。从Oracle官方网站下下载jdk8的一个本版并上传至自己的服务器将jdk8的压缩包解压至一个任意目录即可。我这里将 jdk解压到

2020-05-23 23:29:14 10919

原创 centOs7安装docker笔记

docker安装docker卸载sudo yum remove docker docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \

2020-05-23 20:54:46 10404

原创 Spring源码笔记之自动装配以及beanFactory.ignoreDependencyInterface()

beanFactory.ignoreDependencyInterface(Class<?> ifc) 方法相信很多人在看Spring源码的时候的会看到这个方法,但是不知道这个方法是干嘛的,但是从方法名中我们能够大概知道其功能。先看下Spring源码中这个接口的注释。大概的翻译前面两句话忽略给定的依赖接口进行自动装配。通常由应用程序上下文用来注册以其他方式解析的依赖项,例如通过BeanFactoryAware的BeanFactory或通过ApplicationContextAwar

2020-05-22 23:28:43 11475 2

原创 Spring源码笔记之beanFactory.registerResolvableDependency()方法

registerResolvableDependency() 方法registerResolvableDependency()方法是声明在 ConfigurableListableBeanFactory接口中的在初始化IOC中的时候,在AbstractApplicationContext#prepareBeanFactory中被调用作用?在Spring自动装配的时候如果一个接口有多个实现类,并且都已经放到IOC中去了,那么自动装配的时候就会出异常,因为spring不知道把哪个实现类注入进去,但

2020-05-11 14:36:32 15184 8

原创 使用Optional的orElse()重复执行问题

使用Optional.orElse(T other)方法产生的问题问题复现:Optional.orElse(T other)方法的原本作用是,如果Optional中的value为null的话,则返回orElse(T other)方法中的 “other” 这个值现有代码如下 public static List<String> test(){ return Optional.ofNullable(a()).orElse(b()); } pub

2020-05-11 14:31:12 11670

原创 看了这篇文章别再跟我说你面试挂在了String的面试题上

首先来看一到面试题,不管你能不能答上来,我都相信你能够在这篇文章学到一些你以前不知道的知识String s1 = "a";String s2 = "b";String s3 = "a" + "b";String s4 = s1 + s2;String s5 = "ab";String s6 = s4.intern();// 问System.out.println(s3 == s4...

2020-03-14 19:07:00 10686

原创 Elasticsearch的match到底是怎么回事?为什么有的人说会分词去查询?为什么有的时候又不分词?

相信很多人都已经接触过Elasticsearch了,而且查询的时候使用的最多的就是 match 查询那么match 到底是怎么做的呢?接下来用Elasticsearch的 profile 来分析match查询到底是个什么鬼?为什么有的时候会分词去查,有的时候又不会分词去查询。我使用的是Elasticsearch7.6 (不同版本可能会稍有不同) 和Ik分词器首先我们先创建索引PUT te...

2020-03-13 17:48:04 13030 3

原创 糟了,线上程序没反应了,是死锁了吗?该怎么去排查?

作为程序猿难免遇不到线程死锁,但是遇到死锁的时候也不要慌,我们冷静下来仔细排查有时候可能会遇到调用接口的时候突然没反应了,数据库,或者其他微服务也都一切正常,这个时候可能就是出现死锁了,使用 jstack 这个工具可以帮助我们排查死锁使用 jps 找到你出现死锁的那个程序的 pid然后使用 jstack 19064 即可看到线程的堆栈信息这里有过jstack使用经验的应该已经看到哪里...

2020-03-13 10:14:57 10532

原创 案例,实战演示线上定位哪个线程占CPU执行时间最多

首先来查看一个 top命令给出的信息图中有一个java进程占用了CPU执行时间的百分之99,我们到线上也难免会出现这种问题,那么出现这种问题我们该怎么排查呢?首先我们已经知道了占用CPU执行时间的进程ID,即16578那么我们可以使用 top H -p pid 和 ps H -eo pid,tid, %cpu pid 这两个命令中任意一个命令来获取这个进程中是哪个线程占用了执行时间,这里我...

2020-03-13 09:50:26 10368

原创 Launcher类源码分析

我们通常通过ClassLoader.getSystemClassLoader();方法类获取系统类加载器,那么有没有想过这个方法的内部是怎么实现的呢?接下来我们一起来分析一下这个方法点进来那个红框套住的方法就是最主要的方法了,接下来我将这个方法的代码拷贝下来并写上注释,便于理解 private static synchronized void initSystemClassLo...

2020-02-23 02:26:10 10723

原创 自定义类加载器详细分析

最近一段时间发现好多小伙伴对类加载器的认实还停留在很浅的一个层面所以我想特意出一系列关于java类加载的一些讲解今天我们从最简单的将起,如何自定义一个类加载器首先我们先来说说java中有哪几种类加载器加上我们自定义类加载器一共四种, 其中启动类加载器是由 c++实现的 在java中用"null"来表示,除此之外,扩展类加载器,以及系统类加载器都是由java实现的,并且都直接或间接的继承了C...

2020-02-23 01:04:01 10644

原创 记一次多重if判断优化

有时候写代码,你会发现越写越有劲,觉得越有趣,时间在不知不觉中流逝先看一下需求场景现在开始发挥你们的思路,如果要你们对接,你们会怎么做,写在一个方法里然后判断msgType的类型,然后做相应的事情? 那可就完了,这么多个类型你要挨个判断不说,业务逻辑都写在了一个方法里,你不觉得这样耦合太紧了吗?你当然可以在订阅主题的方法里只写判断然后调用相应的方法,但是这么做。。总有点不好吧,如果你觉得没事...

2020-01-22 11:37:41 12115

原创 各种锁的概念

我们学习多线程相关知识的时候都会涉及到各种锁,自旋锁、乐观锁、悲观锁、可重入锁、互斥锁、排它锁、独占锁、 共享锁。。等等其实很多锁的概念都是来源与数据库,java中的锁也有这些特性,因此我们在学习多线程的时候就会接触这些概念synchronized我们先从这个关键字开始讲,相信接触过多线程的人都知道这个关键字是用来干嘛的,它保证了我们一个代码块的原子性,当一个线程想要执行synchroni...

2020-01-02 10:50:59 10471

原创 InheritableThreadLocal的使用与原理

经过 ThreadLocal实现原理 这一篇的分析。我们了解了ThreadLocal的原理,也知道我们可以使用ThreadLocal来保存线程的局部变量,但是我们也知道,一个线程保存的值,另外一个线程也是访问不了的,那么问题也随之而来了,比如我们有时候想要在子线程中访问父线程中ThreadLoca中的值,那么该怎么办呢?InheritableThreadLocal使用InheritableTh...

2019-12-31 16:22:50 10493 1

原创 ThreadLocal实现原理详细分析

线程安全问题我们都知道程序中如果有多个线程对一个共享资源进行了‘写’操作,那么就会出现线程安全问题问题怎么产生的线程安全问题是怎么产生的呢?是因为对共享资源的操作不是原子性的,什么是原子性?即:一组操作要么都成功,要么都失败,不存在只成功一部分注:以下对ThreadLocalMap对象简称为map,实际ThreadLocalMap和Map接口并没有关系,感兴趣的可以了解一下Thr...

2019-12-31 11:41:50 10440

原创 你真的会单例吗?单例的八种写法

说起单例设计模式因该很多人都不陌生,按理说只有接触过java的都应该知道这个设计模式,但是你真的会写吗?还是说只会懒汉式和饿汉式?其实日常工作中随便掌握一种就已经可以了,但是我们身为java程序员应该不断的学习,即使用不到但是也要来了解以下,接下来我就来给你们写单例的八种写法,其中只有四种是能有并且没有问题的,其他的都有问题写法一:传统的饿汉式class Singleton01{ priva...

2019-09-19 15:48:56 10682

原创 Mybatis源码导入

导入Mybatis源码还是比较简单的,但是难免第一次导入可能也会失败,所以我来说说我是怎么导入的首先下载Mybatis源码,这个版本是用的比较多的3.4.6。https://github.com/mybatis/mybatis-3/tree/mybatis-3.4.6下载完成之后下载Mybaits的parent源码,parent的版本有很多,我们怎么知道下载哪个版本的呢?打开你下载的My...

2019-09-18 14:10:41 11075

原创 有趣的面试题 int a = 0; a = a++;

觉得这题挺有趣的,所以还是可以写一篇文章来说说public class Main { public static void main(String[] args) { int i = 0; i = i++; System.out.println(i); }}这段代码的执行结果是什么呢?大多数人都觉得是 1,确实以我们的理解...

2019-09-18 14:00:12 11833 1

原创 Mybatis加载机制和缓存机制

这里只会告诉你面试怎么回答,如果你不懂的话,那么这篇文章可能不适合你看加载机制:立即加载(饥饿加载)延时加载(懒加载)回答:如果说一个数据库中有两个表是有关系的,在java中一个表对应一个java对象,如果表A有个外键是B的话,那么在java中A这个bean对象中会依赖表B这个在java中对应的这个java对象,如果是立即加载的话,如果查询的表A,那么它会把表B的数据给查询出来,如果是懒...

2019-09-04 21:18:12 10808

原创 深入理解IOC和DI的区别

什么是IOC?在Spring中最出名的两个概念莫过于IOC和AOP了吧,只要是学过Spring的人都知道,即使很出名,很多人也大概知道,那么面试的时候你是否能够说出来呢?相信很多人都对IOC和DI都大概理解,但是要你说的话就很模糊了IOC是一种程序设计的思想(控制反转),并不是什么技术,用来管理我们程序中的对象和对象之间的依赖关系,如果不用IOC容器,那么程序中所有对象的依赖关系都需要我们...

2019-08-19 10:23:57 11357

原创 什么是AOP对AOP的面试题

我是属于那种你让我写代码我能写出来,而且底层原理大概我也都知道的那种,但是你要我说各种概念我就不行了,而且我只喜欢代码,但是奈何面试的时候不可能让你你这做吧,所以为了应付面试只能做做总结了,索性就写博客来巩固了,来吧!什么是AOP?首先告诉面试官aop就是面向切面编程,那什么是面向切面编程呢?就是指在运行期动态的将代码切入到制定类的指定位置这种思想就是面向切面编程,举个例子,如果我们要在执行哪...

2019-07-20 15:59:57 11813 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除