- 博客(152)
- 资源 (3)
- 收藏
- 关注
原创 什么是死锁?死锁的必要条件是什么?如何避免与检测死锁?
所谓死锁,就是在两个或多个并发进程中,如果每个进程持有某种资源而又都等待着别的进程释放它或它们现在保持着的资源,否则就不能向前推进,此时每个进程都占用了一定的资源但又都不能向前推进,称这一组进程产生了死锁。举个例子,如果此时有一个线程A持有a锁,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁。
2025-01-25 11:49:48
952
原创 Spring源码学习-Resource
Spring的Resource接口为资源访问提供了统一的接口,不同的实现类实现了从不同上下文获取资源。下面列举几个常用的Resource实现类。
2024-06-13 23:18:33
361
原创 Spring源码学习-DispatcherServlet注册
暂时只关注Servlet的注册,Spring容器相关的以后介绍,createDispatcherServlet()方法创建了一个DispatcherServlet实例,然后通过servletContext.addServlet()方法完成DispatcherServlet的注册。首先调用父类的方法完成root WebApplicationContext的初始化,然后调用registerDispatcherServlet()方法完成DispatcherServlet的注册。
2024-06-13 22:32:33
501
原创 JVM运行时数据区 - 虚拟机栈
虚拟机栈是线程执行Java程序时,处理Java方法中内容的内存区域。虚拟机栈也是线程私有的区域,每个Java方法被调用的时候,都会在虚拟机栈中创建出一个栈帧。如图,栈帧又由局部变量表、操作数栈、动态链接和方法返回四部分组成,有些虚拟机的栈帧还包括了一些附加信息。
2024-06-05 04:30:00
997
原创 JVM运行时数据区 - 本地方法栈
在JVM规范中,本地方法也有和Java方法一样的方法调用栈,称为本地方法栈。如果本地方法栈在动态扩展的过程中无法申请到足够的内存,或者在创建线程时,无法申请到创建方法栈所需的内存,将会抛出OutMemoryError异常(系统分配给进程内存大小上限固定,当创建线程越多,单个线程所分配的内存就越少)。在JDK自带的方法库中常常看到被native修饰的方法,这些方法没有方法体实现,它们方法体通常是由C/C++语言实现,这种方法称为本地方法。本地方法可以通过本地方法接口来访问虚拟机内部的运行时数据区。
2024-06-05 04:00:00
358
原创 JVM运行时数据区-方法区
JDK8以前,很多人把方法区称为永久代(Permanent Generation),实际上两者并不等价,这一说法是因为HotSpot虚拟机将垃圾收集分代设计将区域扩展到方法区,或者说永久代是方法区的实现。由于永久代更容易OOM,所以该设计在JDK7以后逐渐被淘汰,JDK1.7以后将字符串常量池和静态变量移入堆区,在JDK8以后,就不再有永久代说法,而是元空间(Meta Space)实现方法区。方法也是线程共享的区域,在JVM启动的时候被创建,并且,和堆区一样可以是逻辑上连续,物理上不连续的区域。
2024-06-04 23:12:39
499
原创 JVM运行数据区-Java堆
伊甸区和S0、S1区默认为8:1:1,可通过-XX:SurvivorRatio参数修改,如-XX:SurvivorRatio=6,通过监测发现设置,以后并不是6:1:1,这是因为Java堆的内存分配策略,关闭内存分配策略,-XX:-UseAdaptiveSizePolicy。堆区(Heap区)是JVM运行时数据区占用内存最大的一块区域,每一个JVM进程只存在一个堆区,它在JVM启动时被创建,JVM规范中规定堆区可以是物理上不连续的内存,但必须是逻辑上连续的内存。-Xms:设置初始堆内存,如-Xms64m。
2024-06-04 23:02:12
1319
3
原创 JVM运行时数据区 - 程序计数器
如图,Java方法编译之后会生成JVM字节码指令,字节码指令并不能被CPU直接执行,需要通过字节码执行引擎解释成机器码执行,字节码执行引擎通过程序计数器中存储指令地址,找到对应的字节码指令,如果执行引擎中正在执行0对应的指令,程序计数器中则记录的下一条指令的地址就是3,紧接着就是4,5,6,如此推进。1、保证CPU的处理器切换线程执行时,等待的线程恢复执行之后能回到正确的位置继续执行(CPU的处理器在任一时间只能执行一个线程的指令,并且会不断切换线程执行)。
2024-06-02 22:49:47
483
原创 JVM类加载时机
Java程序对类的使用分为主动引用和被动引用,主动引用时,会触发类的初始化(在JVM虚拟机规范中,对于类在什么时候加载并没有做限定,但是对类的初始化时机有规定),而被动引用则不会。8、当一个接口中定义了JDK8新加入的默认方法(被default关键字修饰的接口方法)时,如果有这个接口的实现类发生了初始化,那该接口要在其之前被初始化。3、访问类中final修饰的静态变量(常量在编译期间会存入常量池,本质上并没有直接引用到定义该常量的类,所以不会触发该类的初始化)。2、通过定义数组引用类,不会导致该类初始化。
2024-06-02 22:35:49
525
原创 JVM双亲委派模型
在之前的JVM类加载器篇中说过,各个类加载器都有自己加载的范围,比如引导类加载器只加载Java核心库中的class如String,那如果用户自己建一个包名和类名与String相同的类,会不会被引导类加载器加载。可以通过如下代码测试,通过执行结果中的报错信息可以发现,JVM实际上加载了rt.jar中的String类,并未加载自定义的String,这个就是JVM的双亲委派模型解决的问题之一。运行结果。
2024-06-02 22:30:29
933
原创 JVM类加载器
隔离类,如类路径冲突。防反编译加密Class文件。扩展类的加载源。自定义实现类加载器可以通过继承java.lang.ClassLoader并重写loadClas()方法或者实现findClass()(推荐)方法,如下代码就是加载指定目录class的简单实现。// 指定目录@Override// class文件路径is.read(b);
2024-06-02 22:24:04
1228
1
原创 JVM类加载过程
在Java虚拟机规范中,把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java.lang.Class对象,这个过程被称作类加载过程。一个类在整个虚拟机周期内会经历如下图的阶段,从加载到初始化就是类加载过程。
2024-06-02 22:18:46
926
1
原创 登录github突然出现Two-factor authentication怎么办?
今天想登录github下载项目,输入用户名密码认证之后竟然弹出来了Two-factor authentication,像下图,我只记得之前好像开启过这玩意,但是不知道哪里找这个code了。在你的iphone里面搜索密码。然后找到github网页,就能看到验证码了。
2024-04-18 10:57:50
708
原创 Exchanger 怎么用J.U.C
Exchanger通常用来解决以下类似场景的问题,如下:两个线程间需要交换数据的问题,在多线程编程中,经常会有这样的场景:两个线程各自持有一些数据,并且需要在某个点上交换这些数据,Exchanger类提供了一个简单、高效的机制来实现这种数据交换。
2024-04-03 11:26:10
324
原创 Spring中最常用的11个扩展点
我们一说到spring,可能第一个想到的是 IOC(控制反转) 和 AOP(面向切面编程)。没错,它们是spring的基石,得益于它们的优秀设计,使得spring能够从众多优秀框架中脱颖而出。除此之外,我们在使用spring的过程中,有没有发现它的扩展能力非常强。由于这个优势的存在,让spring拥有强大的包容能力,让很多第三方应用能够轻松投入spring的怀抱。比如:rocketmq、mybatis、redis等。
2024-04-02 11:54:05
1089
1
原创 (n - 1) & hash 为什么等于hash % n
为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀,Hash 值的范围值-2147483648到2147483647,前后加起来大概40亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位置也就是对应的数组下标。这个数组下标的计算方法是“ (n - 1) & hash”。(n代表数组长度)。
2024-04-02 11:44:08
633
原创 28. 找出字符串中第一个匹配项的下标
"leeto" 没有在 "leetcode" 中出现,所以返回 -1。字符串的第一个匹配项的下标(下标从 0 开始)。第一个匹配项的下标是 0 ,所以返回 0。"sad" 在下标 0 和 6 处匹配。
2023-10-31 14:15:41
145
原创 如何理解Spring的IOC和AOP
在传统的java应用中bean的生命周期很简单,使用new进行bean的实例化,然后该bean就可以使用了,一旦该bean不再被使用则由java自动。以及设置相关的属性,让spring容器来生成类的实例对象,在spring容器启动时候,spring会把你在配置中配置的bean都初始化好。这个Resource 指的是BeanDefinition的资源定位,这个过程就是容器找数据的过程。相比之前,spring容器中的bean的生命周期就相对复杂的多了,正确理解spring bean的生命周期非常重要。
2023-10-24 14:21:28
190
原创 kong网关从入门到放弃
Kong网关是一个轻量级、快速、灵活的云名称API网关。Kong Gateway位于您的服务应用程序前面,可动态控制、分析和路由请求和响应。KongGateway通过使用灵活、低代码、基于插件的方法来实现您的API流量策略。除了对管理员进行身份验证和划分工作区外,Kong Gateway还能够使用分配给管理员的角色,对所有资源实施基于角色的访问控制(RBAC)。只能控制到接口层面,权限包括 create\read\update\delete 具体什么动作,不太清楚企业版才支持。konga也有必要了解一下。
2023-10-16 18:06:26
1272
原创 解决kong部署自定义插件报 helloworld plugin is enabled but not installed
custom plugins \ kong \ 部署
2023-10-16 17:07:23
1312
原创 程序员对代码注释可以说是又爱又恨又双标……怎么看待程序员不写注释这一事件的呢?
程序员对代码注释可以说是又爱又恨又双标……怎么看待程序员不写注释这一事件的呢?
2023-10-09 18:06:39
187
原创 mysql中varchar长度为多少
可以看见当设置长度为65533时,已经超过行最大长度,我们可以计算一下,行最大长度是65535字节。还有默认为空,那么还有null标识位,( 1 + 7 ) / 8 =1,所以null标识位占用1个字节。现在我们来看看,65533 + 1 + 2=65536字节,已经大于行最大长度。这里2字节怎么来的?每个NULL字段用1bit标识,10个字段都是default null,那么需要用(10+7)/8bit = 2 bytes存储NULL标识位。那么上面这条语句中的varchar(N)的最大值是多少呢?
2023-10-09 16:02:12
5433
原创 Zuul网关探秘
Spring Cloud创建了一个嵌入式Zuul代理,以简化一个非常常见的用例的开发,在这个用例中,UI应用程序希望代理对一个或多个后端服务的调用。该功能对于用户界面来说非常有用,可以代理到所需的后端服务,从而避免了为所有后端独立管理CORS和身份验证问题的需要。
2023-09-13 11:50:35
444
原创 高并发读,高并发写解决方案
高并发读动静分离与CDN加速网站开发分为静态内容和动态内容两部分。1. 静态内容:常用的处理测了就是CDN,一个静态文件缓存到网络各个节点。加缓存当数据库支持不住时,首先想到的是加一层缓存,一种是本地缓存,另一种是集中式缓存,比如redis缓存的数据结构通常是<k,v>结构,v是普通对象也有复杂一点的<k,list> <k,hash>结构缓存的更新有两种,一种是主动更新,当数据库数据发生变更时,主动的更新缓存中的数据,另一种是被动更新,当用户的查
2022-05-03 00:05:17
3117
原创 转换json自定义返回属性,转换json忽略某个属性注解
问题在开发中,我们定义的对象,接口返回json,有些属性不想返回,有些属性我们想转换一下返回!怎么处理呢?解决@JsonProperty 在转换json时候会把org作为SZDW进行返回@JsonIgnore 在转换json不处理该字段import com.fasterxml.jackson.annotation.JsonIgnore;import com.fasterxml.jackson.annotation.JsonProperty;@JsonProperty("SZDW")priva
2022-04-27 17:26:10
742
原创 Java8默认垃圾收集器介绍
如何确认自己的JDK使用的哪个垃圾收集器?在可以用jvm参数,打印自己的jdk版本和收集器信息 -XX:+PrintCommandLineFlags -version测试代码-指定参数启动/** * @author yangyuanliang * @version 1.9 * @date 2022/4/25 20:34 */public class JvmGC { public static void main(String[] args) { System.out.
2022-04-25 20:50:53
6222
原创 JAVA堆溢出OOM场景模拟及排除过程
模拟过程加参数定义最大堆空间和最小堆空间 -Xms20m -Xmx20m 加参数在堆溢出dump出当前的堆快照-XX:+HeapDumpOnOutOfMemoryError上代码import java.util.ArrayList;import java.util.List;/** * @author yangyuanliang * @version 1.9 * @date 2022/4/24 21:49 */public class HeapOOM { stati
2022-04-24 22:28:09
1548
1
原创 k8s中pod一直处于ContainerCreating状态
查询pod详情 kubectl describe pod -n namespace podname 发现docker使用空间满了 清理docker空间docker system prunedocker images | grep "linkid" | awk 'NR>1 {print $3}' | xargs docker rmi -f
2021-11-10 10:46:48
1814
原创 html页面解析modelAndView返回的对象
后端ModelAndView modelAndView=new ModelAndView();modelAndView.setViewName("index");modelAndView.addObject("redirectUrl",redirect_uri);modelAndView.addObject("state",state);return modelAndView;前端<p th:utext=${redirectUrl} id="redirectUrl">&l
2021-08-27 17:55:35
1444
原创 springboot项目如何重写源码
背景在spring-security-oauth组件中获取用户信息接口,第三方返回的是{ "id":"xxxx", "attr":{ "xx":"" }}在security-oauth中解析用户信息写了public Authentication extractAuthentication(Map<String, ?> map) { //其中username,spring定义了固定值,并且没有配置final String USERNAME = "user_name"
2021-04-22 17:39:08
888
原创 LDAP支持TLS协议,JAVA客户端支持
服务端支持ldap的tls加密传输参考链接 https://www.golinuxcloud.com/configure-openldap-with-tls-certificates/安装openssl yum -y install openssl生成加密私钥 openssl genrsa -des3 -out ca.key 2048生成CA证书 openssl req -new -x509 -days 365 -key ca.key -out ca.cert.pem
2021-03-23 18:52:25
578
原创 CAS登出原理-源码分析
CAS-server登出如何保证客户端登出的?大致流程描述:server端登出会根据在webflow scope中存储的TGT信息查询ticket即st,然后根据st携带应用信息向客户端发送登出POST请求。客户端需要配置SingleSignOutFilter拦截器,在拦截器中将客户端的session失效。源码分析server端cas源码5.3.3TerminateSessionAction类 public Event doExecute(final RequestContext reque
2021-02-23 14:54:55
1667
1
原创 拉取docker镜像推送到私有仓库(公司仓库)
拉取docker hub镜像到linux[root@localhost ~]# docker search mysqlNAME DESCRIPTION STARS mysql MySQL 9727 [root@localhost ~]# docker pull mysql打t
2020-07-13 15:34:41
927
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人