- 博客(39)
- 收藏
- 关注
原创 ThreadLocal的使用与原理
1. 使用场景 如果我们需要在内存中,存储session信息,而由于session会存储一些附加信息,例如用户登录id等等,那么这个时候session就必须做到隔离,使用ThreadLocal就可以实现各个线程修改的Session之间不会相互影响。2. 使用方法@Testpublic void testThreadLocal() throws InterruptedException {
2017-07-16 22:52:47
347
原创 java 类加载机制
背景 类加载可以将一个用全限定名来描述的类加载到虚拟机中,了解类加载机制可以帮助更快的解决一些日常的jar包冲突等问题。双亲委派模型 在java中,这些类加载器都由java语言实现,并且都继承自java.lang.ClassLoader。绝大部分java程序都会使用到下面三种类加载器:启动类加载器:加载\lib目录下的jar包扩展类加载器用来加载\lib\ext目录下jar应用程序类加载器
2017-05-01 15:51:36
420
原创 虚拟机字节码执行引擎学习
概要 执行引擎是java虚拟机最核心的组件之一,栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。栈帧存储了方法的局部变量表、操作数栈、冬天连接和方法返回地址等信息局部变量表 局部变量表用于存放方法参数和内部定义的局部变量。以变量槽为基本单位。操作数栈 java的指令集都是面向栈的,所有的指令集的参数都是要从栈中间取出值。里面存储的方法执行过程中的数据。栈内的数据必须有着严格的顺序。动态链
2017-04-16 12:37:17
281
原创 JVM学习-java class文件的 学习(一)
概要 对于任何java程序而言,只要编译出来的class文件符合JVM虚拟机规范,那么就可以正常被执行。 那么为什么我们要了解class文件呢,不了解class文件我们业务代码不也写的好好的吗?我们学习class文件,一是当我们可以深入的了解我们所写的代码是怎样被编译,整个流程如果出错我们能够定位问题,例如当我们发现线上的业务逻辑执行地有问题的时候,我们在排查完主干上的代码,发现主干的代码没有任
2017-04-09 21:17:40
416
原创 java 中一个char包含几个字节
背景 char包含几个字节可能记得在上学的时候书上写的是2个字节,一直没有深究,今天我们来探究一下到底一个char多少个字节?Char char在设计之初的时候被用来存储字符,可是世界上有那么多字符,如果有1个字节,那么就意味着只能存储256中,显然不合适,而如果有两个字节,那么就可以存储65536种。这个数量符合大多数国家的语言字符的个数。于是java团队默认使用unicode作为编码,一个c
2017-03-19 19:57:15
11446
2
原创 AtomicLong和LongAdder的区别
前言 最近在看到不少框架里面使用到了LongAdder这个类,而并非AtomicLong,很是困惑,于是专门看了LongAdder的源码,总结一下这两个的区别。AtomicLong原理 就像我们所知道的那样AtomicLong的原理是依靠底层的cas来保障院子性的更新数据,在要添加或者减少的时候,会使用死循环不断地cas到特定的值,从而达到更新数据的目的。那么LongAdder又是使用到了什么原
2017-03-19 13:23:59
16912
1
原创 第二章:java内存区域与内存溢出异常
目的 最近在学习<<深入理解Java虚拟机>>一书,特整理成学习笔记。概要 对于java而言,我们在编码的时候不需要显式的编码分配内存和回收内存,可以节约我们大量的时间去关注业务。但是不需要显式的编码,并不意味着我们不需要去了解其中的原理,如果不了解的话,我们在进行编码的时候可能无法选择更加高效正确的实现方法,从而影响系统的性能。譬如当我们选择一个技术方法的时候,该技术方法会导致内存中产生巨量的
2016-11-27 00:17:30
345
原创 系统稳定性---监控指标
1. 背景 对于一个正在运行的系统,可能会碰到各种各样的问题,如依赖的应用宕机、程序bug、负载过高等问题,当遇到问题的时候,我们应该第一时间远程登录到服务器上,找到相关的日志进行分析或者查看对应的监控指标,以找到问题的根源。2.系统问题分析 不同的业务的日志都不同,因此本文中不对特定的业务日志进行分析,而从linux系统的常用命令的角度来排查问题。2.1 指标监控 系统运行的繁忙程度、健康程
2016-11-12 17:48:18
11358
原创 AtomicInteger
AtomicInteger AtomicInteger是java自带的原子操作的类,调用unsafe的 public final int getAndAddInt(Object var1, long var2, int var4) ;来完成自增操作。 “`public final int getAndAddInt(Object var1, long var2, int var4) { i
2016-04-19 16:22:52
315
原创 AtomicLongFieldUpdater VSAtomicLong
AtomicLong AtomicLong是一个对象,因此我们创建的时候需要的内存大小(对象的大小+对象的引用);AtomicLongFieldUpdater AtomicLongFieldUpdater需要的内存大小为(引用的大小+一个long对象的大小);结论 在大量需要大量的long实例,并且需要需要进行对应的原子操作的时候,AtomicLongFieldUpdater节省内存。一个At
2016-04-19 16:13:04
551
原创 Log4j和Slf4j的关系
Log4j是具体的实现,而Slf4j提供了一系列抽象接口,开发者一般用Slf4j提供的API进行开发,而Slf4j则调用Log4j进行日志的写入
2016-04-18 18:44:39
395
原创 Mysql的锁
Mysql的锁 在mysql中为了支持并发,提供了两种级别的锁,行锁和表锁,行锁并发性好但是加锁需要的时间更久,表锁并发性非常低但是加锁快。在innodb存储引擎中,行锁锁住的是索引,因此操作没有索引的话,就会导致大量的表锁,降低性能
2016-04-16 14:21:29
231
原创 Timer的scheduleAtFixedRate和schedule区别
Timer类 Timer类是进行任务调度的类,用来管理周期性任务的执行。scheduleAtFxiedRate和schedule 在Timer类中有两个方法用来提交周期性任务, public void schedule(TimerTask task, long delay, long period) ;和 public void scheduleAtFixedRate(TimerTask t
2016-04-08 16:55:21
547
原创 关于synchronized以及ReetrantLock、ReentrantReadWriteLock的选择
synchronized和ReetrantLock的区别 synchronized是java的内置锁,相对于ReetrantLock使用更加方便,如果实现自己的Lock,可以继承ReetrantLock来实现,在性能上,两个差异不是特别大。ReetrantLock仅仅高一点。 ReetrantReadWriteLock和上面两个相比,性能优越主要体现在读方面,因为多个线程同时读的时候是共享锁
2016-04-08 15:57:15
997
原创 代码中小知识点
1.ArrayList.toArray(new T[size]);如果size大于ArrayList的大小的话,后面用null进行填充。
2016-04-01 16:36:59
360
原创 jar包下的MANIFEST.MF文件
MANIFEST.MF 当我们在打包成jar包的时候,默认会产生一个MANIFEST.MF,这个文件包含了基本的信息,包含该jar包的版本,创建人等信息,如果是可运行jar包,那么就会有main-class属性,用来指定main函数所在的类。MAINFEST.MF用来定义jar的信息,提供给JVM在加载这个类的时候的一些描述信息
2016-03-31 12:18:44
920
原创 JAVA Agent的原理和使用
JAVA Agent Java Agent是在jdk1.5引入的,可以动态修改方法的字节码实现动态修改类代码。这通常是在类的方法调用之前进行的预处理,Agent执行的时间的是类的字节码加载进入JVM之前,实现AOP,这个AOP的好处是不会像动态代理那样产生一个新类。 因为在Agent执行的时候类的字节码还没有加入JVM,因此如果要分析该类的信息,需要利用到ASM(byte code anal
2016-03-31 10:03:34
1893
原创 java守护线程
守护线程与非守护线程 JVM中存在两种线程,用户线程和守候线程。 所谓的守护线程,是指用户线程在运行的时候后台提供的一种通用服务的线程,比如用于垃圾回收的垃圾回收线程。 当一个线程由守护线程创建的时候它也是守护线程,当JVM退出的时候,剩余的线程直接被禁用,finally块也不会使用,栈信息也不会退出,由于这个原因,守护线程谨慎使用,尤其是在线程中使用到IO的时候。如何设置一个线程为守
2016-03-29 21:23:13
220
原创 Void的使用场景
Void是什么 Void是一个不可实例化的占位符类用来保存引用代表了java里面的关键字void的Class对象,那么这个类的应用场景是什么?Void的应用场景 应用场景有两个:任务返回值 在我们使用Future实现异步任务调用的时候,例如执行一个删除的时候,这可能是没有返回值的,但是实现任务类需要继承的Callable里面必须指定任务返回值,那么这个时候就只能使用Void来作为占位符。
2016-03-28 18:05:32
505
原创 java Properties 的学习
Properties类 在一个系统中需要一些配置信息,那么如何更好地管理这些配置(增删改查)?Properties为我们提供了这样的基本功能,Properties用简单的key、value存储系统的配置信息。Properties类的使用 下面的这张图展示一个简单的系统如何在自己的运行器使用Properties管理自己的配置信息。 启动 在系统启动的时候,会发生图上前三个步骤。首先,程序从从
2016-03-28 16:35:33
271
原创 ReadWriteLock和ReetrantLock的区别
ReadWriteLock和ReetrantLock ReetrantLock是Lock框架的下的一个实现,实现对对象的锁定,用在保证线程安全,ReadWriteLock和ReetrantLock的功能类似。那么它们之间的区别是什么?以及各自使用于哪些场景。ReadWriteLock相对于ReetrantLock的优势 ReadWriteLock顾名思义:读写锁,当读锁占有的时候,允许别的读操作
2016-03-28 11:30:30
629
原创 File rename的bug问题
今天在stackOverFlow看到一个问题,这里是链接地址,经过测试,我们只要关闭了所有指向牵扯rename的两个文件的指针,就可以成功了。
2016-01-14 12:03:53
409
原创 分布式系统的心跳检测机制优化
心跳检测机制优化 在分布式系统中,我们一个非常典型的功能就是需要去检测各个机器的运行情况,最主要的是master节点判断所有Slave节点,以及Slave节点去判断Master节点的状态。 最简单的解决方案就是不断向对方机器发送ping消息,从而判断对方主机的状态。 我们来看一下可以优化的点有哪些?在心跳检测线程里,设置休眠时间,不必不停地发送ping消息,这样可以降低系
2016-01-14 11:59:14
1377
原创 mysql索引优化的总结
Mysql索引优化 就像我们经常知道的在数据库中我们可以通过设置索引来加快查询的速度。可是如果索引设置不合理也有可能导致非常不好的后果。 我们大家都知道的是mysql默认的引擎是innodb,建议不知道的去了解一下innodb。索引分为主索引、辅助索引。主索引会维护一个单独的B+树,B+树叶子节点对应行数据。而辅助索引同样也会维护一个B+树,它的叶子节点对应主索引。因此如果使用辅助索
2015-12-23 21:36:01
275
原创 FutureTask源码学习
FutureTask源码 FutureTask是一个可以用来监控Callable执行状况的类 我们首先来看一下它是如何实现监控的: public void run() { if (state != NEW || !UNSAFE.compareAndSwapObject(this, runnerOffset
2015-12-21 20:00:19
314
原创 Timer的源码分析
对java Timer的分析为什么要分析Timer的源码进行分析?之前说过要对java线程池进行了解,而Timer是newScheduleThreadPool的基础,因此我们首先来看一下Timer的实现。Timer源码的分析 public void schedule(TimerTask task, long delay);//经过特定的时间执行 public void schedule(T
2015-12-19 21:54:25
346
原创 FiexedThreadPoolExecutor的原理分析
FixedThreadPoolExecutor的原理分析定义FixedThreadPoolExecutor其实是利用ThreadPoolExecutor来实现的,因此我们只需要理解ThreadPoolExecutor这个类即可。 public void execute(Runnable command) { if (command == null) throw new Nul
2015-12-18 11:01:16
554
原创 关于java线程池的学习
java线程池的分类以及各自优缺点线程池的用处 服务器端处理客户端请求的方式有哪些?1.如果一个请求过来,那么直接给它分配一个新的Thread处理它的请求,2.单线程进行处理 对比上面两种方式,我们会发现两种方式都是不靠谱的。对于第一种方式,如果并发量很高的情况很容易将服务器压垮,另外线程过多,受限于cpu核数的限制,会导致大量的线程切换。2.会导致请求处理过慢。 我们能够想
2015-12-17 22:24:50
315
原创 MyBatis的学习总结
按照学习计划,本周应该学习Mybatis的源码。为什么要学习Mybatis? Mybatis是一款非常优秀的ORM框架,利用ORM我们可以非常容易地进行数据库的相关操作。本人希望通过Mybatis源码的学习,理解一个ORM框架应该具备的功能点,以及如何实现ORM类型的框架并且希望自己可以学习一些关于设计模式的知识。Mybatis的诞生? 为什么会产生Mybatis这个框架呢?亦或者为什么
2015-12-04 22:15:31
365
原创 关于maven pom.xml中dependency type 为pom的应用
dependency为什么会有type为pom,默认的值是什么? dependency中type默认为jar即引入一个特定的jar包。那么为什么还会有type为pom呢?当我们需要引入很多jar包的时候会导致pom.xml过大,我们可以想到的一种解决方案是定义一个父项目,但是父项目只有一个,也有可能导致父项目的pom.xml文件过大。这个时候我们引进来一个type为pom,意味着我们可以将所有的
2015-11-19 11:55:48
41993
1
原创 关于java里面注解的理解
今天看了java注解,总结一下注解的使用 (1)注解可以让我们更明白该方法的使用,譬如你在某方法的上面加上@ThreadSafe的时候,别人一看就知道该方法是线程安全的,就可以安心在多线程情况下使用该方法。 (2)注解可以帮助我们正确开发,譬如你想覆盖掉一个父类的方法,有可能方法名称写错了,如果用@Override很容易检测到这样的错误 (3)通过注解我们可以设置对象的值,这在Spring等框
2015-11-18 12:52:41
409
原创 ByteArrayOutputStream以及DataOutputStream的组合使用
DataOutputStream和ByteArrayOutputStream组合起来可以实现序列化,那么如何进行组合起来呢?@Test public void testDataOutputStreamAndDataInputStream() throws IOException { ByteArrayOutputStream bOutputStream = new Byte
2015-11-13 17:50:39
3339
原创 CountDownLatch的原理
今天在学习ZooKeeper的实例的时候,发现了CountDownLatch这个类,那么这个类又是如何使用的呢?以及这个类的原理是什么?我们首先看一下简单的demo:public class CountDownLatchTest { static class Student implements Runnable { CountDownLatch countDownLatch
2015-11-09 12:59:50
1061
原创 Thread.interrupt()的使用
Thread.interrupt()简单从名称来看就是打断线程,那么到底是如何打断线程的,有什么限制条件?我们今天来讨论一下这个问题 首先我们看一下jdk上面的解释 If this thread is blocked in an invocation of the {@link * Object#wait() wait()}, {@link Object#wait(long) wa
2015-11-08 15:49:02
523
原创 关于JDBC连接Class.forName()的思考
使用JDBC的时候,我们都会按照推荐的加入下面一条语句:Class.forName("com.mysql.jdbc.Driver");这条语句如果不添加就会错误,但是这条语句好像只是加载了一个类而已,没有执行任何操作。那么为什么必须添加这条语句呢?我们切进去看一下com.mysql.jdbc.Driver源码: static { try {
2015-09-27 11:49:30
454
原创 关于ConcurrentHashMap的size的思考
最近在学习关于java并发的一些知识,因此开通博客记录整个过程,也算是督促一下自己 ConcurrentHashMap我们都知道的是通过分段锁来控制整个HashMap的安全性,那么求ConcurrentHashMap在求size的时候是如何兼顾到性能以及安全性的呢?如果只是逐个地获取Segment,那么有可能在后面获取下一个Segment里面的元素的个数的时候,上面一个Segment里面元
2015-09-12 14:19:45
3345
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人