自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 dubbo基于SPI思想的内核实现

dubbo基于SPI思想的内核实现SPI机制SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样可以在运行时,动态为接口加载实现类。正因此特性,我们可以很容易的通过 SPI 机制为我们的程序提供拓展功能,比如数据库访问、日志等都是采用这种形式。一般通用组件为了...

2019-07-29 10:10:33 496 1

原创 final域的内存语义

与volatile和锁相比,对final域的读和写更像是普通变量的访问final域的重排序规则对final域,编译器和处理器要遵守两个重排序规则在构造函数内对一个final域的写入,与随后把这个被构造对象引用的赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。写final域的重排序规则写fi...

2019-07-28 20:02:45 246

原创 锁的内存语义

锁的释放-获取建立的hanppens-before关系锁是Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程想获取同一个锁的线程发送消息。锁的释放和获取的内存语义当线程释放锁时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存中。当线程获取锁是,JMM会把该线程对应的本地内存置为无效。从而使得被监视器保护的临界区代码必须从主内存中读取。锁和volat...

2019-07-28 20:02:10 274

原创 Java内存模型基础

并发编程模型的两个关键问题在编发编程里,需要处理的两个关键性问题:线程之间如何通信、线程之间如何同步。通信是指宣称之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的模型里,线程之间共享程序的公共状态,通过写-读内存中的公共状态进行隐式通信。在消息传递的并发模型里,线程之间必须通过发送消息来显式进行通信。同步是指程序中用于控制不同线程间操作发生...

2019-07-28 20:00:59 268

原创 原子操作的实现原理

原子(atomic):不能被进一步分割的最小粒子原子操作:不可被中断的一个或一系列操作。CPU术语术语名词英文解释缓存行Cache line缓存的最小操作单位比较并交换Compare and SwapCAS操作需要输入两个数值,一个旧值(期望操作前的值)和一个新值,在操作期间西安比较旧值有没有发生变化,如果没有发生变化,才交换成新值,发生变化则不交换...

2019-07-28 19:58:51 563

原创 volatile和synchronized底层实现原理

相关的CPU术语术语英文单词术语描述内存屏障memory barriers是一组处理器指令,用于实现对内存操作的顺序限制缓冲行cache line缓存中可以分配的最小存储单位。处理器填写缓存线时会加载整个缓存线,需要使用多个主内存读周期原子操作atomic operation不可中断的一个或一系列操作缓存行填充cache line fill...

2019-07-28 19:58:16 1910 1

原创 并发编程的挑战

并发编程的目的是为了让程序运行的更快,但是由于上下文切换、死锁等问题,线程数越多并不一定越好。上下文切换时间片:时间片是CPU分配给各个线程的时间,时间片一般是几十毫秒上下文切换:CPU通过时间片分配算法来循环执行任务,当钱任务执行一个时间片后会切换到下一个任务。但是在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以从保存到再加载的过程就是一次上下文切换...

2019-07-28 19:56:18 147

原创 类加载器

虚拟机设计团队把类的加载阶段中“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”两个类是否相等,只有在这连哥哥是由同一个类加载器加载的前提下才有意义,否则,即使这两个类来源于同一个Class文件,被同一个虚拟机加载,只要加载他们的类加载器不同,那这两个类就必定不相等。使...

2019-07-28 19:55:18 147

原创 虚拟机类加载机制

类的加载时机类从被加载到虚拟机内存中开始,到卸载出内存为止,整个生命周期包括:加载(Loading)验证(Verification)准备(Preparation)解析(Resolution)初始化(Initialization)使用(Using)卸载(Unloading)加载、验证、准备、初始化和卸载5个阶段的顺序是确定的,而解析不一定,在某些情况下可以在初始化之后开始,这是...

2019-07-28 19:54:45 139

原创 类文件结构

字节码是构成平台无关性的基石。Class文件格式所具备的平台中立(不依赖于特定硬件及操作系统)、紧凑、稳定和可扩展的特点,是Java技术体系实现平台无关,语言无关两项特性的重要支柱。实现语言无关性的基础:虚拟机和字节码存储格式。Java虚拟机不和包括Java在内的任何语言绑定,它只和“Class文件“这种特定的二进制文件格式锁关联,Class文件中包含了Java虚拟机指令集和符号表达以及若干...

2019-07-28 19:53:27 192

原创 内存分配与回收策略

Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题给对象分配内存回收分配给对象的内存对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配)对象主要分配在堆的新生代的Eden区上(如何理解),如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中。分配的规则并不是百分百固定的...

2019-07-28 19:52:46 213

原创 垃圾收集器

Serial收集器(单线程)Serial(串行)收集器是最近本、发展历史最悠久的收集器,曾经(JDK1.3之前)是虚拟机新声代收集的唯一选择。这是一个单线程收集器。它的“单线程”的意思并不仅仅说明它只会使用一个CPU或一条收集线程去完成垃圾收集工作,更重要的是它在进行垃圾回收是,必须暂停其他所有的工作线程(Stop The World),直到它收集结束。新生代采用复制算法,老年代采用标记-...

2019-07-28 19:52:10 138

原创 垃圾回收算法

标记-清除算法算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。缺点效率低空间碎片多复制算法为了解决效率问题,“复制”算法出现了。他将可用的内存按容量划分为大小相等的两块。每次只使用一块。当一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已经使用过的内存空间一次清理掉。这样使得每次都对整个半区进行内存回收,内存分...

2019-07-28 19:49:03 158

原创 JVM--对象已死吗

概述当需要排查各种内存溢出、内存泄漏问题是,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些自动化的技术试试必要的监控和调节程序计数器、虚拟机栈、本地方法栈随线程而生、随线程而灭;栈帧随着方法的开始入栈、方法结束出栈。这几个内存区域的内存分配和回收都具有确定性,在这几个区域内不需要过多考虑回收问题,因为方法结束或者线程结束时,内存自然就跟着回收了。而对于Java堆和方法区,...

2019-07-28 19:46:28 193

原创 HotSpot虚拟机对象探秘

对象的创建类加载检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个富豪引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行想用的类加载过程。分配内存在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存大小在类加载完后便可完全确定,为对象分配空间等同于把一块确定大小的内存从Java堆中划分出来。分配方...

2019-07-28 19:43:45 141

原创 JVM内存结构(运行时数据区)

1 概述对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题,由虚拟机处理内存这一切看起来都很美好。不过,也正是因为Java程序员把内存控制权利交给Java虚拟机,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。2 运行时数据区域...

2019-07-28 19:38:46 246

原创 堆转储快照文件分析工具MAT使用

背景我们知道jmap命令可以生成对转储快照文件,那么如何分析呢?除了jdk自带的工具(不好用,看不出来东西)下面介绍eclipse的memory analyze tool(mat)的使用mat可以独立于开发工具使用,是个比较方便不错的内存分析工具。下载下载地址:https://eclipse.org/mat/downloads.php选择适合自己的版本,笔者选择的是mac osx版本。...

2019-07-20 15:38:51 1856

原创 大型网站架构演化(读书笔记)

大型网站软件系统特点高并发、大流量高可用海量数据用户分布广泛,网络情况复杂安全环境恶劣需求快速变更,发布频繁大型网站架构演化发展历程大型网站的技术挑战主要来自于庞大的用户,高并发的访问和海量的数据。初始阶段网络所有资源都在同一台服务器上应用服务和数据服务分离使用缓存改善网站性能两种缓存本地缓存:缓存在应用服务上本地缓存的访问速度快,但是手应用服务器内存限制,...

2019-07-08 14:18:21 186

原创 zookeeper服务搭建

官网下载zookeeper ,解压到指定目录后修改或复制 zoo_sample.cfg zoo.cfg 内容如下tickTime=2000# The number of ticks that the initial# synchronization phase can takeinitLimit=10# The number of ticks that can pass between...

2019-07-06 18:20:04 309

原创 并发编程的挑战

文章目录上下文切换如何减少上下文切换死锁资源限制的挑战如何解决资源限制的问题在资源限制情况下进行并发编程并发编程的目的是为了让程序运行的更快,但是由于上下文切换、死锁等问题,线程数越多并不一定越好。上下文切换时间片:时间片是CPU分配给各个线程的时间,时间片一般是几十毫秒上下文切换:CPU通过时间片分配算法来循环执行任务,当钱任务执行一个时间片后会切换到下一个任务。但是在切换前会保存上一个...

2019-07-05 17:02:52 130

原创 java泛型详解

文章目录1 什么是范型2 实现范型构件2.1 使用Object表示范型2.2 基本类型的包装2.3 使用接口表示范型2.4 数组类型的兼容3 利用Java5范型特性时间范型构件3.1 范型类3.2 范型接口3.3 自动装箱拆箱3.4 范型的界限3.5 通配符3.5.1 <?>无界限的通配符3.5.2 <? extends T>有上限`Upper Bounds`的通配符3.5...

2019-06-21 17:50:41 2168 1

原创 lombok的使用

文章目录常用注解使用方式说明`val``var``@NonNull``@Clearup``@GET`和`@SET``@toString``@EqualsAndHashCode``@AllArgsConstructor``@NoArgsConstructor``@RequiredArgsConstructor``@DATA`日志相关的注解维护一个pojo的时候最讨厌看到满屏的set/get,有些时...

2019-06-17 22:33:42 1094

原创 Java反射机制的使用

文章目录定义反射常用API获取类的信息获取所有的方法信息获取实例的属性值及修改属性值修改常量修改静态私有属性源码定义反射就是在运行时才知道要操作的类是什么,并且可以在运行时获取类的完整构造,并调用相应的方法我们经常用的生成一个实例的一般如下 User user = new User(); user.setName("lili");但是如果大家有看过开源框架,constructor...

2019-06-17 19:55:38 289

原创 mybaits批量更新的几种方法

更新单条update shop_manager set marketing_category = #{marketingCategory} where id=#{id}更新多条且条件为多值的记录比较普通的写法是逐条更新优点:容易,不易出错,出错只影响当前行缺点:效率差,每条更新都会连接释放数据库资源。代码示例:<update id="updateBatch" param...

2019-06-17 14:28:03 1859

原创 Java基础知识整理

2019-05-21 16:21:18 132

原创 dubbo源码导读--持续更新中

2019-02-14 09:49:50 418

原创 dubbo服务远程调用

dubbo服务远程调用在调用dubbo服务时发现执行方法时实际上调用的是invoker的代理类,那么这个代理类是怎么生成的呢?本文讲下使用dubbo注解方式(@Reference)的服务引用过程示例import com.alibaba.dubbo.config.annotation.Reference;import com.momo.dubbo.provider.IHelloServi...

2019-01-19 13:57:51 12103 1

原创 sentinel限流入门

为什么限流前端时间遇到的一次大型故障:订单服务应查询量巨大拖垮服务,导致公司核心系统系统瘫痪。那么如何避免此类事情再次发生,公司内部做了大量的服务下线或者尽可能减少服务调用的工作;除此之外,服务提供方要保证在自己有限的负载下正常运作,最直观的方法是限制流量,也即服务限流。服务限流其实是指当系统资源不够,不足以应对大量请求,即系统资源与访问量出现矛盾的时候,我们为了保证有限的资源能够正常服务,...

2019-01-17 15:58:39 8225 1

原创 servlet容器的工具:Filter

介绍执行流程过滤器的生命周期代码示例介绍 filet是servlet里常用的工具,能够对servlet容器的请求和响应进行修改和检查,是个典型的处理链。可以认为是servlet的一个变种,它与servlet的区别在于:他不能直接为用户生成响应,只提供过滤功能。执行流程 当一个请求满足了一个filter的过滤条件后,请求会被移交到下一个filter处理。这就涉及到了过滤链FilterC

2017-04-05 19:20:38 417

原创 浅谈java定时任务:quartz、quartz with spring

添加依赖: <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>1.8.5</version> </dependency>注册jobpublic class InvokeQuartz {

2017-04-05 11:03:21 362

原创 浅谈java定时任务:@Scheduled

本文的讲解基于springmvc框架@Schedule的使用很简单,只需要引入spring-context包,在配置文件里加上task命名空间<task:annotation-driven/>来来来,一起先看看@schedule的结构@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})@Retention(RetentionPoli

2017-04-01 17:29:19 1819

原创 浅谈java定时任务:TimerTask

java 定时任务TimerTask定时任务有很多种实现,网上也有很多开源的定时任务框架可以参考,但博主只简单介绍一下博主使用到的四种定时任务的实现:Timer和TimerTaks、spring、quartz、spring和quartz。话不多说,直接上代码Timer和TimerTask我们先来看看Timer的源码 public void schedule(TimerTask task, Da

2017-03-31 20:51:15 4550

原创 mybatis 动态sql

mybatis 动态sqlspring 集成mybatis 不得不说省来很大一部分sql,但mybatis属于标签语言,平时习惯直接写sql语句 mybatis的一些很有用的东西毕竟不上手。比如mybatis强大的动态语句,在此记录一下 当然,MyBatis 从 3.2 开始支持可插拔的脚本语言,因此你可以在插入一种语言的驱动(language driver)之后来写基于这种语言的动态 SQL

2017-03-31 13:08:01 436

空空如也

空空如也

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

TA关注的人

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