自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java虚拟机启动、加载类过程分析

方法),如果加载过,可以直接返回对应的Class instance,如果没有,则返回null. 图上的指向引导类加载器的虚线表示类加载器的这个有限的访问 引导类加载器的功能。类加载器的引用,由于这些类是由引导类加载器(Bootstrap Classloader)进行加载的,而 引导类加载器是由C++语言实现的,所以是无法访问的,故而该引用为。11. 准备阶段:在类加载的准备阶段,JVM 为类的静态变量分配内存空间,并设置默认的初始值,例如数字类型对应的零值、对象引用类型对应的 null 值等。

2023-11-11 17:42:31 72

原创 AQS

AQS的核心思想就是,如果线程请求的共享资源是空闲状态,则该线程被设置为正常运行的有效线程,并修改共享资源的状态为锁定。如果线程请求的共享资源是锁定状态,则线程进入等待状态,受AQS管理其等待状态及唤醒时机唤醒时锁的分配机制。AQS通过将等待锁的线程放入CLH队列来实现这个机制(基于CLH队列,volatile修饰共享变量state,线程通过CAS去改变state)。CLH是一个虚拟双向队列,即没有队列实力只有节点间的关联关系,AQS将每一个请求共享资源的线程封装成队列的一个节点实现锁分配。...

2021-12-14 20:44:09 257

原创 java 线程池实现原理

ThreadPoolExecutor 继承了 AbstractExecutorService,成员变量 ctl 是个 Integer 的原子变量用来记录线程池状态 和 线程池中线程个数,类似于 ReentrantReadWriteLock 使用一个变量存放两种信息。//用来标记线程池状态(高3位),线程个数(低29位)//默认是RUNNING状态,线程个数为0private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));

2021-03-03 16:48:23 193 1

原创 java线程状态与操作系统线程状态的关系

清楚的理解和认知线程状态是java多线程的基础,多线程本质上其实就是管理多个线程的状态,以期在保证线程安全的情况下获得最佳的运行效率(发挥cpu的最佳效能)首先列举几个容易混淆的线程状态问题文末进行解答:1Java线程有几种状态2.线程sleep之后处于什么状态3.A线程被sychnolozy锁阻塞了,B线程被lock锁阻塞了 AB两个线程是否处于相同状态是什么状态4.当java线程发生IO阻塞时 线程处于什么状态:5.java线程和操作系统线程状态是如何对应的:java线程状态:...

2021-03-02 19:10:24 2241 2

原创 Spring获取及创建bean的流程 (doGetBean、createBean源码解析)

doGetBean关键过程 伪码 protected <T> T doGetBean(1.bean名称2.对象类型3.对象构造参数4.向容器标记bean是否被创建的参数,用于检查){ 1.获取规范的bean名称(不重要) 2.从缓存中获取单例bean(getSingleton) 3.if(存在该单例bean&无构造参数){ 返回bean(getObjectForBeanInstance) }else { //若不存在该单例bean,则进入双亲委派实例

2021-01-17 15:42:05 452

原创 通俗解释spring是如何解决循环依赖的

spring解决的是bean属性的循环依赖,bean的初始化一般要经过实例化、属性赋值、初始化三个过程之后才能被spring使用的。循环依赖其实是发生在属性赋值的阶段。spring是通过三级缓存去解决循环依赖的问题的,三级缓存其实就是其实就是spring在初始化bean的过程中三个不同的存放不同时期的bean的三个map。分别存放完整的bean、提前曝光的半成品bean、和半成品bean它们分别是singletonObjects,earlySingletonObjects,以及singletonFact

2021-01-16 18:54:02 290

原创 java类的执行顺序

(静态变量->静态初始化块)->main->(实例变量->实例初始化块)->构造器类的初始化:是完成程序执行前的准备工作。在这个阶段,静态的(变量,方法,代码块)会被执行。同时在会开辟一块存储空间用来存放静态的数据。初始化只在类加载的时候执行一次。类的实例化:是指创建一个对象的过程。这个过程中会在堆中开辟内存,将一些非静态的方法,变量存放在里面。在程序执行的过程中,可以创建多个对象,既多次实例化。每次实例化都会开辟一块新的内存。构造方法 ——> @Autowire

2021-01-15 00:25:39 134

原创 Mysql技术内幕InnoDB存储引擎读书笔记

1、Mysql体系结构1.1库和实例的定义数据库是文件的集合数据库实例是应用程序,用户操作(增删改查数据)数据库要通过数据库实例。1.2mysql整体架构1.连接池组件2.管理服务和工具组件3.Sql接口组件4.查询分析器5.优化器6.缓存(cache)组件7.插件式存储引擎8.物理文件通过上图可以看出mysql分为四层,分别为连接层、服务层、存储引擎层、存储层。连接层:连接池组件服务层:从左向右分别为:管理服务和工具组件、SQL接口组件、查询分析器组件、优化器组件、缓冲组件

2021-01-06 11:10:34 271

原创 从理解出发:聊聊class字节码文件

参考https://www.cnblogs.com/756623607-zhang/p/12564358.htmlhttps://blog.csdn.net/justry_deng/article/details/86079756Class文件数据类型:Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表。无符号数:无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1、2、4、8个字节;无符号数可以用来描述数字、索引引用、数量值或者

2021-01-05 21:48:37 278 1

原创 java程序员需要掌握的网络知识

1.七层网络模型2.三次握手过程SYN:连接请求 ACK:确认符号 ACK=1为确认 FIN:中断请求Seq:用于标记数据段的顺序 第一个数据段序号随机产生随后发出的数据段依次加一首先客户端向服务端发送一个连接请求SYN服务端收到后回复一个ACK+SYN表示确认收到的连接请求,并且要求连接客户端客户端收到后回复一个ACK服务端收到后建立连接。3.四次挥手过程客户端发送断开请求FIN服务端收到后回复一个ACK表确认收到进入closewait状态期间将所需发送完的数据包发完然后向客

2020-12-29 21:22:50 739 1

原创 JVM优质博客内容及知识点汇总

JVM参数调优https://www.cnblogs.com/anyehome/p/9071619.htmlJVM类加载器机制与类加载过程(运行main方法的原理)https://blog.csdn.net/m0_45406092/article/details/108976907《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合https://blog.csdn.net/luanlouis/article/details/41039269Class文.

2020-12-26 19:58:44 205 2

原创 java new一个对象的过程

Java中创建一个对象所涉及的知识主要有以下几点:1.类加载机制及双亲委派模型 2.JVM组成结构及内存模型首先new一个对象一定是在一个线程中某个方法执行了new操作,此时程序计数器告诉了执行引擎需要执行new所在行的代码,执行引擎获取到new指令后触发了初始化类的操作。初始化类操作首先要检查该类是否被加载,该检查操作需要到方法区中(该new关键字所在的类的)运行时常量池当中先获取该类的全限定类名,通过全限定类名在方法区中查找是否已经被加载。如果没有被加载,使用经过双亲委派模型选定类加载器(一般是ap

2020-12-15 22:36:51 766

原创 软件架构设计原则

1.开闭原则对扩展开放,对修改关闭。发挥java面向对象的继承和多态特性。抽象出包含基础属性的接口或抽象类,然后在具体的实现类或子类中去定义特有的方法。尽量不修改接口和父类,有新需求或版本更新的时候尽可能的不修改源代码,但可以增加新功能。先抽象出最具基础特征的接口或抽象类。然后抽象出基础的实现类,再在类的基础上设计实现更细的子类。例如在一套教育系统中,要做有关人员的模块。先抽象出一个接口【人】然后其具体实现类可以有【学生】【老师】新增需求后可以再添加【校长】【教导主任等】学生可以继续有其子类【小学生

2020-12-02 23:03:38 140

原创 单机Rsyslog+Kafka+logStash+ES架构日志系统搭建

Rsyslog1.配置文件修改"/etc/rsyslog.conf"配置文件中添加以下内容:引入rsyslog的输入及输出模块module(load=“omkafka”)module(load=“imudp”)#设置日志输出到kafka的ruleset(waf和fw日志两种)ruleset(name=“kafka”) {#日志转发kafkaaction (type=“omkafka”template=“nginxAccessTemplate”topic=“ngfw”broker=“

2020-11-28 00:12:04 386

原创 Docker项目远程debug步骤

以idea远程debug戍云2.0项目为例一、将项目所在docker服务映射出一个闲置的端口供远程debug使用第一种方式:kill掉原先的容器、重新执行 docker run -p ip:hostPort:containerPort 命令第二种方式改安装脚本 install.sh中的 PORT_CONTROLLER 加上你所需要的端口然后重新执行update-web-controller.sh (原理与第一种方式相同)二、更改catalina.sh并重新运行(1)/usr/local/t

2020-11-28 00:07:33 4093

原创 mysql知识整理

聚集索引是指,索引顺序和行的顺叙相同的索引,通常是指主键索引。非聚集索引是指索引顺序和行顺序不同的索引。聚簇索引是指b+树的叶子节点包含索引和数据本身。通常作为innodb的索引结构,innodb存储文件分为两种: .frm文件存储表定义 .ibd存储索引及数据。非聚簇索引: 是指b+树的叶子结点 存储的数据并非数据本身而是数据存放的地址(页编号和偏移量offset) myisam的索引结构即为非聚簇索引。MyISAM :在磁盘上存储成三个文件。 .frm文件存储表定义。数据文件的扩展名为.MYD (

2020-10-27 23:41:45 52

原创 hashmap知识整理

hashmap底层数据结构是hash表 ,是由数组加链表加红黑树实现的hash表,jdk1.8之前没有红黑树。hashmap在put数据时需要先使用hash算法结合数组长度进行寻址,找到数组上的一个槽位,如果槽位是空的就加入这个槽位中,如果槽位不是空的则加入该槽位上的链表尾部((JDK 1.7 之前使用头插法、JDK 1.8 使用尾插法)),若该链表长度超过8则转化为红黑树以提高查询效率。hashmap在第一次put操作时初始化底层数据结构也就是hash表。hash表也就是一个数组中装entry可以作为

2020-10-14 11:49:26 108

原创 ES写入原理

ES写入时1.首先写入数据的请求由客户端选择一个node节点,这个节点成为协调节点。2.协调节点进行路由(给document分配一个id根据id进行哈希算法找到一个主分片)将请求发送到该主分片所在的node3.node处理请求写入document并将数据同步到副本分片上,数据写入后向协调节点发送写入成功的响应4.协调节点收到写入成功的响应之后返回结果给客户端写入数据的底层原理写入数据时会先后记录数据的位置有以下节点1.buffer 2.os cache 中的segment file 3.tr

2020-09-28 16:39:39 1905

原创 synchronized实现原理

synchronized作为锁在java中的使用及其简单,但是其实现原理还是有很多值得探究的地方的。 在java代码中根据Synchronized用的位置可以有这些使用场景: ![](https://img-blog.csdnimg.cn/2020090520244272.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOT.

2020-09-05 21:28:42 193

原创 多线程知识梳理

111

2020-09-04 16:28:05 73

原创 通俗解释线程池如何设置核心池大小

通俗解释线程池如何设置核心池大小首先明确使用线程池的目的:充分利用多核CPU资源提高多线程任务执行效率,缩短总的执行时间。核心就是提高多核CPU的利用率。Cpu资源消耗分两种:1.计算2.上下文切换所以最理想的状况是让每一个cpu核心处于计算状态,并且一个线程的执行周期中不发生上下文切换。网上最常见的一种说法是核心池大小取决于你的执行任务是cpu密集型,还是io密集型。假设CPU核数是NCpu密集型是N+1最合理IO密集型是2N+1最合理但是其实这种说法是存在很大漏洞的第一条CPU密集型N

2020-09-02 19:37:52 659

空空如也

空空如也

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

TA关注的人

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