自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(88)
  • 资源 (2)
  • 收藏
  • 关注

原创 JVM性能监控与分析工具

如何定位系统问题分析内容GC日志 堆转储快照 线程快照 运行日志分析工具JVM性能相关的6个常用的JDK命令jps:查询JVM中的所有进程,找出将要操作的PID,是所有命令的基础 jstat:查看相应JVM进程的gc、类加载卸载信息,是没有GUI界面查看JVM运行数据的首选 jinfo:查看和在运行期动态修改JVM配置参数 jmap:生成堆转储快照和比较占内存的对象 jhat:配合jmap分析堆转储日志,除非没有其他工具可做这个事儿,否则就不用该工具 jstack:生成线程

2020-11-15 16:35:56 449

转载 JAVA中BitSet

JAVA中BitSet就是“位图”数据结构,根据“位图”的语义,数据的存在性可以使用bit位上的1或0来表示;一个bit具有2个值:0和1,正好可以用来表示false和true。对于判断“数据是否存在”的场景,我们通常使用HashMap来存储,不过hashmap这个数据结构KEY和Value的保存需要消耗较多的内存,不适合保存较多的数据,即大数据场景;比如在有10亿条URL中判定一个“www.baidu.com/a”是否存在,如果我们使用常规的hashmap来保存将是不现实的,因为URL本身需要占据较多的内

2020-11-10 13:40:26 297

转载 Java String.intern()

引言常量池分为静态常量池、运行时常量池。静态常量池在.class中,运行时常量池在方法区中,JDK1.8中方法区已经被元空间代替。字符串池在JDK1.7之后被分离到堆区。String str = new String("Hello World") 创建了2个对象,一个驻留在字符串池,一个分配在Java堆。str指向对上的实例String.intern()能在运行时向字符串池添加常量。部分包装类实现了池华技术,-128-127以内的对象可以重用本文实例针对HotSpot虚拟机。一般

2020-11-06 15:20:59 246

原创 Java 单例模式及线程安全问题

单例的目的是为了保证运行时Singleton类只有唯一的一个实例,用于一些较大开销的操作。实现单例模式的方式饿汉式public class Singleton { private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return instance; }}由于

2020-11-05 15:03:34 2183

转载 深入理解SPI机制

一、什么是SPISPI ,全称为 Service Provider Interface,是一种服务发现机制。它通过在ClassPath路径下的META-INF/services文件夹查找文件,自动加载文件里所定义的类。这一机制为很多框架扩展提供了可能,比如在Dubbo、JDBC中都使用到了SPI机制。我们先通过一个很简单的例子来看下它是怎么用的。1、例子首先,我们需要定义一个接口,SPIServicepackage com.viewscenes.netsupervisor.spi;p

2020-11-05 13:49:13 196

原创 Java热加载

什么是热加载热加载是指可以在不重启服务的情况下让更改的代码生效,热加载可以显著的提升开发以及调试的效率,它是基于 Java 的类加载器实现的,但是由于热加载的不安全性,一般不会用于正式的生产环境。热加载和热部署的区别首先,不管是热加载还是热部署,都可以在不重启服务的情况下编译/部署项目,都是基于 Java 的类加载器实现的。那么两者到底有什么区别呢?热部署是在服务器运行时重新部署项目。 热加载是在运行时重新加载 class。热加载实现思路根据Java的类加载机制,我们可操作的环节只有

2020-11-04 15:38:29 683

原创 Java类加载机制

什么是类的加载 类加载器(ClassLoader),顾名思义,即加载类的东西。在我们使用一个类之前,JVM需要先将该类的字节码文件(.class文件)从磁盘、网络或其他来源加载到内存中,并对字节码进行解析生成对应的Class对象,这就是类加载器的功能。我们可以利用类加载器,实现类的动态加载。从上图可以看,java文件通过编译器变成了.class文件,接下来类加载器又将这些.class文件加载到JVM中。其中类装载器的作用其实就是类的加载。类加载的过程...

2020-11-03 15:51:40 178

转载 JDK1.7VS1.8---HashMap和CurrentHashMap原理

深入解析HashMap和ConcurrentHashMapy源码以及底层原理前言HashMap 和ConcurrentHashMap,这两个相信大家都不陌生,在面试中基本上是必问的,以及在实际开发过程中也是比用的,那么看了这篇文章,无论在面试还是在实际开发中都可以顺手拈来,得心应手了。HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null 建和null 值, 因为key不允许重复,因此只能有一个键为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入

2020-10-20 07:41:19 1304

原创 Java 多线程之悲观锁与乐观锁

一、悲观锁总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加锁,当其他线程想要访问数据时,都需要阻塞挂起。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。二、乐观锁乐观锁相对悲观锁而言,它认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,不立刻挂起而是稍微等待再次尝试获取等待策略,以减少线程因为挂起、阻塞、唤醒(发生CPU的调度切换) 而造成的开销。偏向锁、轻量级锁(CAS轮询

2020-10-18 19:52:17 308

原创 深入理解Java中的AQS

核心原理AQS就是基于CLH队列,用volatile修饰共享变量state,线程通过CAS去修改状态符,成功则获取锁成功,失败则进入等待队列,等待被唤醒。

2020-10-18 10:11:40 508

转载 Java Synchronized锁

锁存在哪里对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。 synchronized用的锁是存在Java对象头里的 Hotspot虚拟机的对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针),数组会多1字宽(32位:4字节)来存储数组长度 其中Klass Pointer是对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例;Mark Word用于存储对象自身的运行时数据,它是实现轻量级锁和偏...

2020-10-14 08:09:26 240 1

原创 Raft算法

Raft算法是什么分布式系统在极大提高可用性、容错性的同时,带来了一致性问题。Raft算法能够解决分布式系统环境下的一致性问题。过去,Paxos一直是分布式协议的标准,但是Paxos难于理解,更难以实现。后来斯坦福大学提出来Raft算法。Raft是用于管理复制日志的一致性算法,它的效果相当于(multi-)Paxos。原文请参考:https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md帮助大家理解算法的页面:https://r

2020-06-21 17:19:42 293

原创 数据结构与算法——跳表

什么是跳表跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳表的平均查找和插入时间复杂度都是O(logn)。它是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中介,这时,跳转到下一个层次,重复搜索,直到找到需要查找的元素为止。 跳表的实现插入元素时,需要确认是否需要逐层插入。想要每层的跳跃都非常高效,越是...

2020-06-07 11:01:56 241

原创 Redis设计与实现---Sentinel

SentinelRedis的高可用性解决方案:由一个或多个Sentinel实例组成的系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。 对于每个被Sentinel监视的主服务器来说,Sentinel会创建两个连向主服务器的异步网络连接:命令连接:用于向主服务器发送命令,并接收命令回复 订阅连接:用于订阅主服...

2020-05-31 16:52:17 262

原创 Redis设计与实现---复制

旧版复制实现同步:将从服务器的数据库状态更新至主服务器当前所处的数据库状态 命令传播:在主服务器的数据库状态被修改,导致主从服务器的数据库状态不一致时,让主从服务器的数据库重新回到一致状态。当主服务器执行完命令之后,进行命令传播操作,将命令发送给从服务器执行,从服务器执行了相同命令。主从服务器再次回到一致状态。缺陷断线后重复制,需同步所有数据。实际可能只是一小部分数据缺失。新版复制实现 完整重同步:通过让主...

2020-05-30 09:45:39 199

原创 Redis的事件

Redis服务器是一个事件驱动程序,服务器需要处理一下两类事件文件事件:Redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象 时间事件:Redis服务器中的一些操作需要在给定时间点执行,而时间事件就是这类定时操作的抽象文件事件Redis基于Reactor模式开发了自己的网络事件处理器:这个处理器被称为文件事件处理器。文件事件处理器使用I/O多路复用程序来同时监听多个套接字,并根据套接字目前执行的任务来关联不同事件处理器 当被监听的套接字准备好执行连接应答、读取

2020-05-25 22:36:01 203

原创 Redis数据库的实现

数据库redisDb结构中的dict字典保存了数据库中的所有键值对,我们将这字典成为键空间。redisDb结构的expires字典保存了数据库中所有键的过期时间,我们称这个字典为过期字典。过期键删除策略定时删除:在设置键的过期时间的同时,创建一个定时器。让定时器在键的过期时间来临时,立即执行对键的删除操作。 优点:过期键尽快删除,释放占用内存 缺点:CPU时间最不友好,在内存不紧张但CPU时间紧张的情况下,将cpu用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞.

2020-05-22 23:08:20 325

原创 Redis设计与实现笔记--对象

对象Redis没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象五种类型的对象。优点根据对象类型可以判断一个对象是否可以执行给定的命令 带孩子内地不同使用场景,为对象设置多种不同的数据结构实现,优化对象在不同场景下的使用效率 基于引用计数的内存回收机制,当程序不再使用某个对象的时候,所占用的...

2020-04-21 20:33:48 157

原创 Redis设计与实现笔记--数据结构

目录简单动态字符串(SDS:simple dynamic string)应用场景SDS定义SDS与C字符串的区别链表链表实现字典字典的实现普通状态下的字典哈希算法Rehash渐进式Rehash跳跃表使用场景跳跃表实现整数集合整数集合的实现压缩列表压缩列表构成连锁更新简单动态字符串(SDS:simple dynami...

2020-04-19 21:00:47 160

原创 ScheduledExecutorService 和 Timer 的区别

Timerschedule:任务开始的时间 + period(时间片段),强调“固定间隔”地执行任务scheduleAtFixedRate:参数设定开始的时间+ period(时间片段),强调“固定频率”地执行任务Timer的缺陷:Timer被设计成支持多个定时任务,通过源码发现它有一个任务队列用来存放这些定时任务,并且启动了一个线程来处理。通过这种单线程的方式实现,在存...

2019-03-25 22:13:35 427

原创 java定时任务接口ScheduledExecutorService

一、ScheduledExecutorService 设计思想ScheduledExecutorService,是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。需要注意,只有当调度任务来的时候,ScheduledExecutorService才会真正启动一个线程,其余时间ScheduledExecutorService都是c...

2019-01-27 16:33:03 429

原创 Hessian 示例

Hessian是caucho公司开发的一种基于二进制RPC协议(Remote Procedure Call protocol)的轻量级远程调用框架

2017-07-30 19:15:14 509

原创 Spring 通过ApplicationListener&ApplicationEvent实现事件监听

实现了ApplicationListener接口的bean,每当一个ApplicationEvent发布到ApplicationContext时,该Listener  bean将得到通知。这是标准的观察者模式示例:import org.springframework.context.ApplicationEvent;public class MyEvent extends Ap

2017-07-23 19:01:26 707

原创 instanceof 与 isAssignableFrom

instanceof、isAssignableFrom区别与用法

2017-03-31 21:47:03 728

原创 Spring初始化Bean方法

Spring初始化Bean方法

2017-02-15 21:02:32 896

原创 JVM垃圾收集器

JVM垃圾收集器

2016-12-20 14:42:33 726 1

原创 Java虚拟机运行时数据区域

Java虚拟机运行时数据区域

2016-12-20 10:51:25 551

转载 Java字符串模版

Java字符串模版

2016-12-08 13:28:35 6855

原创 Java字符串分割

Java字符串分割

2016-12-06 17:34:05 797

原创 AtomicInteger的用法

AtomicInteger实现线程安全计数器

2016-12-05 17:20:38 2776

转载 ConcurrentHashMap原理分析

ConcurrentHashMap原理分析

2016-12-05 15:43:41 257

原创 Java代理

Java代理实现

2016-12-05 10:31:53 477

原创 Java对象序列化

Java序列化

2016-12-01 17:48:01 473

转载 Java序列化 transient关键字

java 的transient关键字

2016-12-01 17:40:14 682

原创 Java定时任务

Java定时任务

2016-11-30 16:47:34 782

转载 Spring mvc ContentNegotiatingViewResolver 根据路径后缀,选择不同视图

Spring mvc通过ContentNegotiatingViewResolver 实现根据路径后缀,选择不同视图

2016-11-29 15:21:02 1141

转载 web.xml配置中classpath:与classpath*:的区别

web.xml配置中classpath:与classpath*:的区别

2016-11-28 17:43:47 427

原创 Java并发编程

Java并发编程

2016-11-28 15:26:38 388

转载 Java线程池之ThreadPoolExecutor

Java中的ThreadPoolExecutor类

2016-11-25 15:23:40 665

原创 Spring异常处理

Spring异常处理

2016-11-06 12:11:48 484

eclimma 2.3.2

单元测试覆盖率

2017-04-09

Eclipse 反编译插件jad

Eclipse 反编译插件jad

2016-09-20

空空如也

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

TA关注的人

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