自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

转载 Spring是怎样解决循环依赖的。

前言实际工作中,经常由于设计不佳或者各种因素,导致类之间相互依赖。这些类可能单独使用时不会出问题,但是在使用Spring进行管理的时候可能就会抛出BeanCurrentlyInCreationException等异常 。当抛出这种异常时表示Spring解决不了该循环依赖,本文将简要说明Spring对于循环依赖的解决方法。循环依赖的产生和解决的前提循环依赖的产生可能有很多种情况,例如:A的...

2019-03-24 15:31:20 223

原创 从AbstractQueuedSynchronizer到Reentrantlock。

前言谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer(AQS)!本文基于JDK1.8来解读从AQS到Reentrantlock源码。什么是AQSAQS是AbustactQueuedSynchronizer的简称,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列...

2019-03-02 15:41:37 218

原创 HashMap源码剖析。

前言声明,本文用的是jdk1.8。一、HashMap剖析首先看看HashMap的顶部注释说了些什么:再来看看HashMap的类继承图:下面我们来看一下HashMap的属性:成员属性有这么几个:再来看一下hashMap的一个内部类Node:我们知道Hash的底层是散列表,而在Java中散列表的实现是通过数组+链表的~再来简单看看put方法就可以印证我们的说法了:数组+链表...

2019-02-15 17:22:20 176

原创 从输入URL到页面展示到底发生了什么

前言本文的目的是通过输入url发生的事情来做知识的总结和扩展。所以文章可能会很杂。过程1、输入地址当我们开始在浏览器中输入网址的时候,浏览器其实就已经在智能的匹配可能的url了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的url,然后给出只能提示,让你可以补全url地址。对于google的chrome浏览器,他甚至会直接从缓存中把网页展示出来,就是说,你还没有按下enter,...

2019-02-07 20:32:39 287

原创 字节码层面i++,++i以及线程安全问题。

前言在前面的文章我们讲过JVM的内存结构,虚拟机栈和Java堆,这章我们通过字节码指令来观察两者的差异。一、准备工作代码如下:public class Main { int count = 0; public static void test1() { } public void test2() { int i = 0; ...

2019-02-02 22:16:21 1232

转载 四张图带你了解Tomcat系统架构。

前言俗话说,站在巨人的肩膀上看世界,一般学习的时候也是先总览一下整体,然后逐个部分个个击破,最后形成思路,了解具体细节,Tomcat的结构很复杂,但是 Tomcat 非常的模块化,找到了 Tomcat最核心的模块,问题才可以游刃而解,了解了Tomcat的整体架构对以后深入了解Tomcat来说至关重要!一、Tomcat顶层架构先上一张Tomcat的顶层结构图(图A),如下:Tomcat中最...

2019-01-23 15:56:30 158

转载 IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别

一、什么是socket?什么是I/O操作?我们都知道unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,对我们来说,一切都是文件,一切都是流。在信息 交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output),往流中读出数据,系统调用read,写入数据,系统调用write。不过话...

2019-01-21 19:36:27 214

原创 IO之NIO详解。

简介NIO的全称是New I/O,与之相对应的是Java中传统的I/O,这里都指的是Java的API包。传统的IO包提供的是同步阻塞IO,即当用户线程发出IO请求后,内核会去查看数据是否已经就绪,若未就绪,则用户线程会处于阻塞状态(让出CPU),当数据就绪后,内核会将数据复制到用户线程,并把结果返回给用户线程,同时接触用户线程的阻塞,同步体现在用户线程需要等待数据就绪后才能向后执行(后面的执行...

2019-01-20 20:02:33 182

原创 I/O之BIO详解

简介传统的BIO编程网络编程的基本模型是C/S模型,即两个进程间的通信。服务端提供IP和监听端口,客户端通过连接操作想服务端监听的地址发起连接请求,通过三次握手连接,如果连接成功建立,双方就可以通过套接字进行通信。传统的同步阻塞模型开发中,ServerSocket负责绑定IP地址,启动监听端口;Socket负责发起连接操作。连接成功后,双方通过输入和输出流进行同步阻塞式通信。到底什么是“IO...

2019-01-20 19:29:50 895

转载 用户态和内核态之间的关系。

一、 Unix/Linux的体系架构如上图所示,从宏观上来看,Linux操作系统的体系结构分为用户态和内核态(或者用户空间和内核)。内核从本质上看是一种软件——控制计算机的硬件资源,并提高上层应用程序运行的环境。用户态即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,包括CPU资源、存储资源、I/O资源等。为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口:即系...

2019-01-19 14:29:49 1196

原创 基于JDK命令行工具的监控。

前言不会JVM调优的程序员不是一个好Java程序员。一、JVM调优命令大全jpsJVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程.命令格式jps [options] [hostid]Option参数-l : 输出主类全名或jar路径-q : 只输出LVMID-m : 输出JVM启动时传递给main()的参数-v : 输出JVM启动...

2019-01-17 14:08:12 292

原创 关于Springstatic属性依赖注入失败问题。

近期在做一个小东西的时候使用@VALUE注入一个静态变量,发现注入不进去。现记录一下原因:在spring里,我们不能@Autowired一个静态变量,使之成为一个spring bean,例如下面这样://不仅仅是Autowired@Autowired private static YourClass yourClass;可以试一下,yourClass在这种状态下不能够被依赖注入,会抛...

2019-01-09 15:48:56 646

原创 Mysql索引详解。

前言昨天面试被问到了索引,之前也看过不少关于索引的资料,但是感觉还是有很多欠缺。故结合网上一些资料将知识重新梳理一遍。一、索引的原理1.1 索引原理索引的目的在于提高查询效率,与我们查阅读书所用的目录是一个道理:先定位到章,然后定位到该章下的一个小节,然后找到页数。本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的时间变成顺序的事件,也就是说,有了这种索引机...

2018-12-20 14:09:32 136

原创 深入理解JAVA虚拟机读书笔记:类加载器

前言类加载器是Java语言的一个创新,也是Java语言流行的重要原因之一。它使得Java类可以被动态加载到Java虚拟机中并执行。类加载器从JDK1.0就出现了,最初是为了满足Java Applet的需要而开发出来的。Java Applet需要从远程下载Java类文件到浏览器中并执行。现在类加载器在Web容器和OSGi中得到了广泛的使用。一般来说,Java应用的开发人员不需要直接同类加载器进行交...

2018-12-10 10:31:39 138

原创 深入理解JAVA虚拟机读书笔记:虚拟机加载机制

前言虚拟机把描述类的数据和Class文件加载进内存,并对数据进行效验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。一、类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析3个部分统称为连接。加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,...

2018-12-06 17:31:51 116

原创 深入理解JAVA虚拟机读书笔记:内存分配与回收策略。

前言对象的分配,往大方面讲,就是在堆上分配(但也有可能经过JIT编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配(只是每个线程在不同的TLAB上分配对象,在分配的角度上是线程私有的,在回收的角度上TLAB实际上也是在Eden区上)。少数情况下也可能会直接分配在老年代中,分配规则并不是百分百固定的,其细节取决于...

2018-12-03 16:25:53 174

转载 G1垃圾收集器之SATB

对象漏标垃圾回收的并发标记阶段,GC线程和应用线程是并发执行的,所以一个对象被标记之后,应用线程可能篡改对象的引用关系,从而造成对象的漏标、误标,其实误标没什么关系,顶多造成浮动垃圾,在下次GC还是可以回收的,但是漏标的后果是致命的,把本应该存活的对象给回收了,从而影响了程序的正确性。为了解决在并发标记过程中,存活对象漏标的情况,GC HandBook把对象分成三种颜色:1、黑色:自身以及可...

2018-12-02 19:32:53 2758

转载 JVM源码分析之线程局部缓存TLAB

前言介绍TLAB之前先思考一个问题:创建对象时,需要在堆上申请指定大小的内存,如果同时有大量线程申请内存的话,可以通过CAS乐观锁机制确保不会申请到同一块内存,在JVM运行中,内存分配时一个极其频繁的动作,这种方式势必会降低性能。因此,在HotSpot1.6的实现中引入了TLAB技术。什么是TLABTLAB全称ThreadLocalAllocationBuffer,是线程的一块私有内存,...

2018-12-02 16:54:08 203

转载 深入理解JAVA虚拟机读书笔记:G1收集器入门

前言在官网中,是这样描述G1的:The Garbage-First (G1) collector is a server-style garbage collector,targeted for multi-processor machines with large memories. It meetsgarbage collection (GC) pause time goals wi...

2018-12-02 16:54:00 929

原创 深入理解JAVA虚拟机读书笔记:垃圾收集器

上一篇文章我们讲了很多关于垃圾回收的算法,这一篇我们一起来看看垃圾收集器是如何来实现他们的。一、垃圾收集器的组合在jdk7后,HotSpot虚拟机所有的垃圾收集器和组合如下。1、图中他们所在的区域表明他们是属于新生代收集器还是老年代收集器:新生代收集器:Serial、ParNew、ParallelScavenge老年代收集器:CMS、SerialOld、ParallelOld整堆收集...

2018-12-01 15:34:16 230

原创 深入理解JAVA虚拟机读书笔记:垃圾收集与垃圾收集算法

概述我们需要思考三个问题:1、哪些内存需要回收?2、什么时候回收?3、如何回收?一、哪些内存需要回收?在Java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,这部分不需要过多考虑回收问题。垃圾收集器主要关注的是Java堆中内存回收。二、什么时候回收判断对象是否存活的算法:1、引用计数算法给对象添加一个引用计数器,每一个地方引用它...

2018-12-01 15:33:42 165

原创 深入理解JAVA虚拟机读书笔记:HotSpot虚拟机对象探秘

HotSpot虚拟机对象探秘1、对象的创建虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位这个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有,那必须先执行响应的类加载过程。(类加载会在后面的章节给出)。在类加载检查通过后,虚拟机将会为新生对象分配内存。对象所需的内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于...

2018-11-27 20:33:30 200

原创 深入理解JAVA虚拟机读书笔记:HotSpot的算法实现

上一篇我们学习了判断对象是否存活的一些算法,主要就是可达性分析算法。这篇来讲讲HotSpot的算法实现。一、枚举根节点我们知道在可达性分析算法中是需要有GC Roots节点,可作为GC Roots的节点主要在全局性的引用(例如常量或静态变量,这部分数据存储在方法区)与执行上下文(例如栈帧的局部变量表)中,现在很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很多时间。而...

2018-11-26 16:49:46 138

原创 深入理解JAVA虚拟机读书笔记:Java内存区域

目录概述运行时数据区1、程序计数器2、Java虚拟机栈3、本地方法栈4、java堆5、方法区6、运行时常量池7、直接内存HotSpot虚拟机对象探秘1、对象的创建2、对象的内存布局。对象头实例数据对齐填充3、对象的访问定位句柄方式直接指针方式概述对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个...

2018-11-22 16:32:57 179

原创 Java内存模型JMM

Java内存模型定义Java作为一个跨平台的语言,它的实现要面对不同的底层硬件系统,设计一个中间层模型来屏蔽底层的硬件差异,给上层的开发者一个一致的使用接口。Java内存模型就是这样一个中间层的模型,它为程序员屏蔽了底层的硬件实现细节,支持大部分的主流硬件平台。Java内存模型(Java Memory Mode):Java内存模型是java虚拟机内存如何与计算机内存(RAM)一起工作。...

2018-11-21 15:19:20 177

原创 CPU多级缓存

1、名词解释一种规范,规范了Java虚拟机与计算机内存如何协同工作的。他规定了一个线程如何和何时可以看到其他线程修改过的共享变量的值,以及在必须时如果同步地访问共享变量。2、CPU多级缓存左图为最简单的高速缓存的配置,数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一条特殊的快速通道;主存和高速缓存都连在系统总线上,这条总线还用于其他组件的通信。高速缓存出现不久,系统变得越来越复杂,...

2018-11-21 14:14:19 2453

转载 深入理解Java并发之synchronized实现原理

synchronized底层语义原理Java虚拟机中的同步(Synchronization)基于进入和退出管程(Monitor)对象实现,无论是显示同步(有明确的monitorenter和monitorexit指令,即同步代码块)还是隐式同步都是如此。在Java语言中,同步用得最多的地方可能是被synchronized修饰的同步方法。同步方法并不是由monitorenter和monitorexi...

2018-11-15 19:51:54 150

空空如也

空空如也

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

TA关注的人

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