- 博客(40)
- 收藏
- 关注
原创 java的SPI机制
SPI(Service Provider Interface)是java提供的一种服务发现机制。允许你定义一个接口或抽象类,然后由第三方实现这个接口,并在运行时动态加载这些实现类是:面向接口编程,解耦接口与实现。
2025-06-03 14:44:41
60
原创 MongoDB及spring集成
MongoDB 是一个基于的开源 NoSQL 数据库系统用文档存数据,每个文档可以看作是一个键值对集合,类似于 JSON 对象MongoDB 支持索引以提高查询性能,并且可以在任何属性上创建索引。
2025-05-19 10:05:23
809
原创 linux学习
linux指的是基于linux内核构建的一系列完整的操作系统发行版linux内核只负责管理硬件资源,提供基本的操作系统服务以及为用户程序提供运行环境在linux系统中,一个核心概念就是“一切皆文件”,无论硬件设备、目录、普通文件还是网络连接等,通过统一的接口进行访问和管理,极大地简化了系统的设计,通过一套通用的文件操作命令来与各种资源交互普通文件:包括文本文件、二进制文件、脚本文件等目录:特殊的文件,包含了其他文件或子目录的引用设备文件:表示硬件设备,分为字符设备和块设备。
2025-05-15 17:24:33
520
原创 contains方法的实现对比
contains方法定义在Collection接口中,所有实现了该接口的集合类都支持contains方法在Java中,不同的数据结构实现contains方法的方式各异,这直接影响了它们的时间和空间效率。下面我们将详细探讨几种主要的数据结构(如ArrayListLinkedListHashSetTreeSet等)的底层原理及其在执行contains操作时的表现。List。
2025-05-14 15:30:59
326
原创 常见的几种网络攻击
具体来说就是用户点了恶意链接之后,会把正常的URL中的某个参数修改成一段js代码,这个请求发送给服务器之后,服务器可能会把这段js代码当作一个普通的参数返回给用户,等到用户收到服务器的返回并且解析响应的时候这段js代码可能就会执行,从而对用户的浏览器发起攻击。在早期的web安全模型中,浏览器的安全机制主要依赖同源策略,即一个页面的脚本只能读取或修改来自同一来源(相同协议、域名和端口)的资源,然而XSS攻击打破了这种隔离,是的恶意脚本可以在不同的站点上下文中执行,从而影响到其他站点的数据和行为。
2025-05-14 14:19:08
804
原创 RASP的运行时注入与更新
背景:java中类加载器并不提供卸载单个类的功能,但是一个类加载器不再被引用并且可以被垃圾回收时,它所加载的所有类也会被一同回收,所以如果想卸载某个类,可以通过丢弃整个类加载器实例,并确保没有对该类加载器或其加载的任何类的强引用,这样垃圾回收器就可以回收这个类加载器及其加载的所有类。更新插件到V1.1版本,首先确保没有对旧版本插件对象的引用,下一步销毁当前使用的自定义类加载器,接下来创建一个新的自定义类加载器实例,用这个新的类加载器实例来加载新版的插件,再执行必要的初始化逻辑,此时新的插件就开始生效了。
2025-05-13 16:05:46
387
原创 agentmain对业务的影响
前面一篇已经说了java agent技术主要有premain和agentmain两种形式,如果大部分业务已经在线上运行的话,不方便用premain的方式来实现,所以agentmain的方式是更加通用、灵活的由于RASP是与用户业务运行在同一个jvm中的 ,所以RASP会严重影响用户业务的执行情况,如果RASP崩溃的话那么业务程序也会收到严重毁灭性的影响。对业务上的影响主要包含cpu占用和耗时方面的影响。
2025-05-13 10:01:33
889
1
原创 java agent技术
从JDK1.5之后引入了java angent技术Java Agent 是一种强大的技术,它允许开发者在或动态地修改类的字节码,从而实现诸如性能监控、日志记录、AOP(面向切面编程)等功能java agent依赖于,是 Java 提供的一个用于操作已加载类的字节码的标准API。通过这个API,你可以修改类的字节码,甚至可以在不重启应用的情况下重新定义已经加载的类具体的实现过程是通过一个agent来对字节码进行修改,agent实际上是一个特殊的jar包,包含了一个或多个特定的方法(premain或。
2025-05-12 14:50:03
372
原创 class文件(二)
java中的重载除了要与原方法具有相同的简单名称之外,还要求必须拥有一个与原方法不同的特征签名,特征签名是指一个方法中各个参数在常量池中的字段符号引用的集合,因为返回值不包含在特征签名中,所以java不能仅靠返回值来进行方法重载。去常量池中检索可以得到这个方法名是<init>,描述符为()v,表示没有参数没有返回值,属性名对应常量为"Code",说明这个属性是方法代码的字节码描述。这个方法有一个u2类型的参数说明调用哪个方法,指向常量池中的一个Methodref_info(此方法的符号引用)
2025-04-23 20:55:37
846
原创 class文件(一)
class文件是一组以的二进制流,没有任何分隔符,如果遇到需要占用8个字节以上空间的数据项时,会按照高位在前的方式分割成若干个8个字节进行存储class文件格式采用一种类似于C语言结构体的伪结构来存储数据,只有两种数据类型:“无符号数”和“表”无符号数:基本的数据类型,以u1,u2,u4,u8分别代表1、2、3、8个字节的无符号数表:由多个无符号数或者其他表作为数据项构成的复合数据类型。
2025-04-21 15:45:08
895
原创 函数式编程——lambda表达式
同门在面试腾讯的时候被问到jdk8最大的新特性是什么,应该就是lambda表达式了吧lambda表达式是一种代表函数的接口,可以代替某些匿名内部类对象(被重写方法的形参列表)->{被重写方法的方法体代码}lambda表达式只能替代的匿名内部类函数式接口:有且仅有一个抽象方法的接口@FunctionalInterface注解可以声明这个接口是一个函数式接口。
2025-04-14 16:20:05
360
原创 继承(this和super)
(这里注意,只有在父类的成员变量子类也拥有的时候,会把父类的隐藏掉,通过super来实现显式的调用,但是如果父类的成员变量子类没有的时候,就不会隐藏了,直接显式显示,这也就是为什么前面例子中fatherName前面没有Father.但是name前面有Father.,因为子类也有name,但是子类没有fatherName,如果给子类也加上fatherName这个属性的话,就是下面这样)发现会会报错,提示缺少‘.’,可以看出super并不是一个实例的引用,只是一个特殊的指示符,用于在子类中访问父类的成员。
2025-04-14 13:28:54
356
原创 java内部类
就是一个成员变量,不过这个成员变量是一个类内部类可以访问外部类的所有成员,包括私有成员编译之后可以看到产生了两个class文件(所以内部类实际上是可以和外部类同名的,因为编译之后内部类前面还会加上外部类的名字,所以可以做到区分):对内部类的class文件进行反编译这里要区别一下和的区别,子类只能访问父类的public和protect修饰的,但是内部类还可以访问私有的<关于继承和隐藏我后面再研究一下应该还会出一个帖子>
2025-04-14 11:07:06
346
原创 阅读redis源码——String
redis中最常用的五种数据类型:String、List、Hash、Set、Sorted Set这是一个通用函数,用于实现SETSETEXPSETEXSETNX和GETSET等命令。'flags':区分不同的行为(如NXXXGET等)。'expire':表示以用户传递的 Redis 对象形式设置的过期时间,'unit' 进为时间单位如果设置了GET选项,它会先获取键的当前值,然后再设置新值。大概的流程图是这样的调整参数列表:为了确保命令再持久化或复制到从服务器能够正确执行。
2025-04-13 17:06:56
820
原创 JVM指针压缩
首先先理解一下操作系统是怎么寻址的,以32位的操作系统为例,32位(4个字节)可以表示出2^32个不同的地址,内存的基本计量单位是字节,也就是每个内存地址对应的是 8 位的存储空间,所以2^32个地址可以表示2^32字节的内存空间,也就是4GB的内存空间,所以【结论:4个字节可以表示4GB的内存空间】JVM指针压缩说的是对象头中的【klass word】部分的指针压缩,在jvm内存小于32G的时候默认会开启指针压缩,将【klass word】8字节的指针压缩为4字节的指针。(32G内存的条件下)
2025-04-12 22:29:03
299
原创 java序列化
但是网络传输的本质是基于字节流的,所以虽然序列化成了文本格式和二进制格式最后在网络间传输的时候都会被编码成字节流(例如文本格式的话可以通过UTF-8编码成字节流,二进制格式本身就是字节流,可以直接在网络上传输)字节序列是数据的基本表现形式,而二进制格式是字节序列的一种结构化表示方式,用于特定的编码规则和数据结构,所以一般二进制格式的数据量更小,这也是为什么JDK自带的序列化方法结果很大。二进制格式是一种特定的编码方式,它基于字节,但是是有结构的,用于将数据以二进制形式表示。
2025-04-12 21:02:58
593
原创 java接口和抽象类
是用了abstract的特殊的一种类抽象类不能实例化、抽象方法所在的类必须是抽象类其实抽象类和普通类的区别仅仅在于有没有abstract修饰(也就是能不能实例化,能不能没有方法的实现,其他普通类有的一些特征抽象类都有)例如抽象类已有构造函数,抽象类也可以都是普通方法(没有抽象方法)抽象类的构造方法会在子类实例化的时候被调用,进行一些必要的初始化。
2025-04-08 19:15:20
188
原创 自己写spring整合mybatis
实现了这样一个特殊的接口之后就是一个特殊的类,从spring容器中通过getBean方法取出的对象实际上不是这个类的bean对象,而是这个类的getObject方法返回的bean对象。
2025-04-07 20:32:10
417
原创 redis的网络模型
redis在核心业务处理部分是单线程,但是整个redis是多线程(这里注意像关闭文件、AOF 刷盘、释放内存是后台线程,但是像AOF重写、bgsave保存RDB数据快照是子进程。
2025-04-07 18:49:50
879
原创 synchronized
在java中每个对象主要由三部分组成:【对象头】、【对齐填充】、【实例数据】对象头由两部分组成(数组对象的话还多一个部分是数组长度):【klass Word】(32bits):用于标记这个对象属于哪个类不同的对象状态实际上Mark Word的内容也是不一样的。
2025-04-07 13:08:18
379
原创 海量数据去重(利用redis)
也被问了至少两次好像。。。首先数据量如果比较小的话——set如果数据量很大很大很大很大,set当然就不行了,因为占内存太大了。
2025-04-06 17:16:44
136
原创 redis八股(我觉得一些不是很常见的八股)
(为什么setnx不能可重入,key-value中的value存成线程标识,再获得锁的时候判断一下这个线程标识是不是自己的,如果不是自己的就获得锁失败,如果是自己的就获得成功,但是光判断是不是自己的还不够,还需要标识获得几次锁,所以string数据类型的就不够了,虽然setnx可以插入hash类型的,但是判断是不是自己的锁和获得锁需要时一个原子操作,所以光setnx就不能满足要求了)(其实redisson实现分布式锁的方式跟上面分析的基本上是一致的)(是的也是美团面试的时候问的)指令来实现锁的排他性,
2025-04-06 16:45:06
303
原创 【无标题】
sentinel实现限流、隔离、降级、熔断等功能,本质上就是两件事:1.统计数据:统计某个资源的访问数据(QPS、RT等)2.规则判断:判断限流规则等是否满足。
2025-04-06 13:26:56
402
原创 四种限流算法代码实现(sentinel实现限流的原理)
因为有的时候刚开始数据可能还没加载到缓存中或者什么的,导致开始的时候并发处理的能力较差,等到预热完成之后,就可以实现高并发的处理了,然后这个时候阈值再达到设置的那个值。(第二次面试美团的时候有问我知不知道sentinel限流的底层原理,但是当我我还没学这个只能说不知道sentinel的底层原理,只知道四种限流算法,第一次面试美团的时候问我知不知道限流算法令牌桶什么的当时还没学只能说我不太了解orz)跟漏桶相似,但是桶里面放的是令牌,以固定的速率往桶里生产令牌,获得令牌的请求才能执行,获得令牌失败的拒绝。
2025-04-06 10:49:42
863
原创 阅读spring源码(二)——refresh方法
在这一步才初始化所有的bean:this.finishBeanFactoryInitialization(beanFactory);
2025-04-05 15:37:43
73
原创 阅读spring源码(一)——spring容器的创建过程
在执行完this.register(componentClasses);之后,这个bdm中会多一个bd,也就是传入的配置类的bd。首先来看这个AnnotationConfigApplicationContext这个类。在执行完this.refresh();之后可以看到所有的类的bd都有了。一个spring容器现在就真正的初始化完成了。spring最重要的一个组件就是IOC容器。这个时候还没有三级map。
2025-04-05 14:47:07
135
原创 Spring循环依赖!我好像搞懂了!
一个bean的生命周期(AService为例):1.实例化——>创建一个普通对象2.属性注入(例如BService——>去单例池Map找——>没找到就创建BService)1.实例化BService2.属性注入AService——>去单例池找——>没找到就创建3.填充其他属性4.初始化方法5.将这个bean对象放到单例池中3.填充其他属性4.初始化方法(AOP)5.将这个bean对象放到单例池中这里的AService和BService就构成了循环依赖。
2025-04-04 20:58:19
826
原创 Spring事务生效的底层原理
Configuratinon注解的目的是给这个配置类设置一个代理对象,然后调用产生jdbc的方法和产生事务管理器的方法传入的参数(也就是datasource)都是这个代理对象生成的,这个代理对象生成datasource的方式就是先去容器中找,有就直接返回,没有就调用方法产生一个datasource然后放到容器中。但是如果在调用普通对象的test方法的时候(也就是代理类内部调用的test方法又调用了其他的加了Transcationnal注解的方法,这个注解是不会生效的。
2025-04-04 17:45:20
303
原创 手写min-Spring框架——理解bean的生命周期
Spring的核心实际上就是Spring的IOC容器创建这个IOC容器最重要的就是扫描路径,这里通过一个配置类作为创建容器的参数,将要扫描的路径传入进去。
2025-04-04 15:30:51
673
原创 java动态代理
实际上代理可以说就是实际对象的方法增强,尤其是一些与业务无关的部分或者是想隐藏目标对象,代理的所有方法都会在InvocatianHandler中的invoke中进行执行,可以在这个invoke中判断方法然后进行增强。代理的作用:本质上是将对象的一部分职责转移到代理上,也是对对象本身方法的一个增强。对象有什么方法想被代理,代理就一定要有对应的方法。代理怎么知道有哪些方法要去代理呢?对象和代理都实现这个接口。将这些方法定义在接口中。
2025-04-03 21:27:00
212
原创 java注解
MyTest(a = "张三", b = false, c = {"小猫", "小狗"})这一行实际上是一个注解的实现类对象。如果是解析成员方法上的注解,就应该先获取到该成员方法的method对象,再通过method对象解析上面的注解。比如要解析类上的注解,就应该先获取该类的class对象,再通过class对象解析上面的注解。注解:java代码中的特殊标记,作用是让其他程序根据注解信息来决定怎么执行该程序。判断类、方法、成员变量上是否存在注解,并把注解里的内容解析出来。元注解:修饰注解的注解。
2025-04-03 20:48:49
297
原创 HashMap
为什么JDK1.8之后的HashMap在链表优化使用的是红黑树不是AVL树或者B+树?HashMap的get方法一定安全吗?HashMap的容量指的是什么?
2025-04-02 09:51:29
113
原创 ConcurrentHashMap
concurrntHashMap可以存储null作为key或者value吗?concurrenthashmap在get的时候会加锁吗?那读的时候如果不加锁,读写冲突了怎么办呢?
2025-04-02 09:49:20
74
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人