java
文章平均质量分 78
jjavaboy
这个作者很懒,什么都没留下…
展开
-
Java虚拟机
前序Java虚拟机可能指三个不同的东西: 1、抽象的规范2、一个具体的实现3、一个运行中的虚拟机实例抽象的规范,是sun公司对Java虚拟机的抽象规范;一个具体的实现,不同公司或机构基于抽象规范实现各自的虚拟机,如官方sun公司的Java 虚拟机HotSpotVM,这是大家使用最多的,当然还有其他公司,如IBM的J9VM;一个运行的虚拟机实现,当你启动了一个Java程序时,原创 2016-04-09 15:04:47 · 602 阅读 · 0 评论 -
LinkedList笔记
java的LinkedList原创 2015-04-16 15:05:47 · 473 阅读 · 0 评论 -
动态代理
动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实。代理一般会实现它所表示的实际对象的接口。代理可以访问实际对象,但是延迟实现实际对象的部分功能,实际对象实现系统的实际功能,代理对象对客户隐藏了实际对象。客户不知道它是与代理打交道还是与实际对象打交道。原创 2015-04-13 17:13:06 · 653 阅读 · 0 评论 -
对象池
平时开发涉及到比如数据库连接、Redis连接等等其他连接,连接在创建、销毁的过程往往比较消耗资源、时间,于是,便出现连接池的概念。其中不同的连接池都是保存着对象的,只不过有的对象是数据库连接对象,有的对象是Redis连接对象,由此可见,只要我们理解了对象池,则不同的池我们也掌握了原理。我们基于apache开源的common-pools包来掌握对象池(GenericObjectPool)原创 2017-03-24 15:00:50 · 922 阅读 · 0 评论 -
软引用、弱引用和虚引用
一般来说,我们创建一个一般的对象,如:Cow cow = new Cow();这就是变量cow就是强引用,是强可触及的,和所有局部变量一样,对垃圾收集器来说,这是一个根节点。#垃圾收集器的根节点的引用和强引用的对象包含的引用都是强引用。在java的源码中,有这么几个类-java.lang.ref +SoftReference.java +WeakReferenc原创 2017-04-02 20:31:19 · 762 阅读 · 0 评论 -
LinkedHashMap笔记-LRU(least recently used)
本文,只要讲下基于LinkedHashMap来实现LRU结构,了解LRU的实现思路,LinkedHashMap的实现结构,也基本熟悉了。原创 2015-04-16 14:55:39 · 510 阅读 · 0 评论 -
序列化protobuf
参考:https://developers.google.com/protocol-buffers/https://developers.google.com/protocol-buffers/docs/encoding属性标记protobuf的属性的三个标识required,序列化的内容里必须有这个属性键对key-value pairoptional,序列化的内容里有0个或1个属性键对repea...原创 2017-06-23 15:20:14 · 1226 阅读 · 0 评论 -
Java虚拟机:垃圾收集
java对象在虚拟机中经过三个过程:1.首次加载类型 => 初始化类变量2.创建对象 (有四种方式) 2.1 new 操作 2.2 Class或java.lang.reflect.Constructor.newInstance() 2.3 调用对象的clone() 2.4 对象的反序列化 ObjectInutStream.readObje原创 2016-06-25 23:37:13 · 493 阅读 · 0 评论 -
JVM 的内存管理(垃圾收集)
文章主要从垃圾收集来讲解内存的管理如何知道对象可以被回收JVM垃圾回收,主要是对“死亡”的对象进行回收,因此如何知道一个对象是“死亡”的,是可以被垃圾回收器回收的,JVM有几个方法:1.引用计数器算法在堆中的每一个对象才有一个引用计数器,当一个对象被创建了,任何一个对象变量赋值为该对象的引用时,对象的计数器就加1;变量不再引用该对象时,对象的计数器就减1,当一个对象的计数为0时,它就会当作垃圾被回...翻译 2017-06-23 10:05:24 · 907 阅读 · 1 评论 -
自增id算法snowflake
Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同机器产生的id必须不同。snowflake生成64的id,刚好使用long来保存,结构如下:41位时间截,可以使用69年,年T = (1L 10位的数据机器位,可以部署在10转载 2016-05-21 22:34:40 · 6446 阅读 · 4 评论 -
CountDownLatch笔记
CountDownLatch是java的concurrent包下的一个倒计时锁。//倒计时锁public class CountDownLatch { //锁 private final Sync sync; //构造函数 //count:表示必须调用count次countDown()方法,await()方法才不会阻塞 //或者我们可以说倒计时原创 2016-12-13 15:59:23 · 454 阅读 · 0 评论 -
java使用redis
使用Jedis开发redis,需要jedis.jarJedisServer:public class RedisServer { private JedisPool jedisPool; private final static RedisServer instance = new RedisServer(); private RedisServer(){} pub原创 2015-05-25 23:19:21 · 1544 阅读 · 0 评论 -
TreeMap和TreeSet
TreeMap是保存树形结构的map类,树的节点结构是TreeMap.Entry类,如下图。二叉树在查询操作中表现出较快的速度,但前提是,它是平衡二叉树,平衡二叉树的左右子树的节点平均分布,这样使得查找时间O(lg n),平衡二叉树有以下特点:二叉树是空树,或者它的左右子树的高度差的绝对值不超过1,而且左右子树也是平衡二叉树。为保证二叉树是平衡二叉树,有各种算法实现,其中java中使用红黑树的算法来实现了平衡二叉树原创 2015-05-06 21:10:40 · 963 阅读 · 0 评论 -
线程之间的协作wait/notify
例子: 一个任务将蜡涂到Car上,一个抛光它。抛光任务在涂蜡任务完成之前,是不能执行基工作的,而涂蜡任务在涂另一层蜡之前,必须等抛光任务完成。WaxOn和WaxOff都使用了Car对象,该对象在这些任务等待条件变化的时候,使用wait()和notifyAll()来挂起和重新启动这些任务:class Car { private boolean waxOn = false;原创 2015-03-29 22:56:43 · 617 阅读 · 0 评论 -
线程之间的协作await/signal
有一个文章讲到线程之间的协作是用到Object类的wait,notify/notifyAll,点击打开链接在javase5的java.util.concurrent类库中还有额外的显式工具可以用来重写线程之间的协作这个程序。使用互斥并允许挂起的基本类是Condition,你可以通过在Condition调用await()来挂起一个任务。当外部条件发生变化,意味着某个任务应该继续执行时,你可以原创 2015-04-12 23:02:44 · 1539 阅读 · 0 评论 -
原码、反码和补码
java中的整数都是有符号的,使用补码来表示,其中最高位是表示符号位,正数则最高位是0,负数是1为了表示一个整数的补码,我们先了解下原码,反码。一、原码、反码和补码概念原码,则直接使用二进制来表示整数,反码,正数的反码和原码相同,负数的符号位不变,其他数值们取反,即,0变1,1则变成0。补码,正数的补码和原码相同,负数则求得它的反码再加1 便得到补码。如,jav原创 2016-05-22 15:19:36 · 515 阅读 · 0 评论 -
Cookie/Session机制详解
转自:http://blog.csdn.net/fangaoxin/article/details/6952954会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。本章将系统地讲述Cookie与Session机制,并转载 2015-04-20 21:25:25 · 698 阅读 · 0 评论 -
Heap space 与 PermGen space
1.当java程序运行到一定时间的时候。常常抛出java.lang.OutOfMemoryError: Java heap space异常。2.java heap space 指的是JVM的内存不够用了,内存泄露。 原因: JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值,其初始空间(即-Xms)是物转载 2015-04-17 12:32:07 · 625 阅读 · 0 评论 -
Semaphore笔记
java的信号量Semaphore经常用来限制只能有至多特定数量的线程操作某个资源,若取不到信号量的令牌刚需要等待有可用的令牌才能对资源进行操作。//信号量public class Semaphore implements java.io.Serializable { /** All mechanics via AbstractQueuedSynchronizer subcla原创 2016-12-15 00:09:56 · 401 阅读 · 0 评论 -
ThreadPoolExecutor笔记
ThreadPoolExecutor是java中线程池类,平时可能我们并不直接用到它,我们可能是通过调用Executors来使用线程池的原创 2016-12-13 00:49:56 · 909 阅读 · 1 评论 -
volatile和Cache一致性协议之MESI
转自:http://www.cnblogs.com/dolphin0520/p/3920373.htmlvolatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件转载 2017-08-14 17:46:06 · 15404 阅读 · 27 评论 -
VisualVM监视
整理下怎么通过JDK提供的视图化工具来监视java应用。1.配置文件远程机器上,建立jstatd 的 security policy 文件,比如建立在$JAVA_HOME/bin目录下:文件jstatd.all.policy:grant codebase "file:${java.home}/../lib/tools.jar" { permission java.sec原创 2017-09-03 22:54:49 · 355 阅读 · 0 评论 -
JMM-Java内存模型
JMM由来Java语言规范规定了JVM要维护内部线程类似顺序化语言:只要程序的最终结果等同于它在严格顺序化环境中执行的结果,允许编译器生成指令的次序跟源代码的次序不同,并且处理器可以乱序或者并行地执行指令,可以改变将处理器的高速缓存(寄存器)写入提交到主内存的变量的次序,所以存储在处理器缓存中的值,对于其他处理器并不可见。那为什么编译器改变源代码的执行次序,在近些年重新排序后的指令原创 2017-11-26 13:28:24 · 304 阅读 · 0 评论 -
synchronized的实现原理
转自:http://blog.csdn.net/chenssy/article/details/54883355记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道synchronized是一转载 2018-01-21 15:30:58 · 320 阅读 · 0 评论 -
ConcurrentHashMap笔记
在容器Map中,HashMap对数据的操作效率快,但是不加锁,不安全;虽然Hashtable对数据的操作是加锁的,安全,但是对象级加锁的,整个对象都加锁了,比如,现在需要对Hashtable进行put操作,而同时已经对Hashtable有get操作,则put操作需要等get操作完后释放对象的锁才继续进行,这样效率上会有所降低。即需要解决效率,也需要考虑问题,java提供了java.util.con原创 2015-03-27 00:00:41 · 864 阅读 · 0 评论 -
红黑树
参照:http://daoluan.net/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/%E7%AE%97%E6%B3%95/2013/09/25/rbtree-is-not-difficult.htmlhttp://daoluan.net/%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/%E6%95%B0%E6%8D%AE%E7%BB%93...原创 2018-03-04 15:39:50 · 451 阅读 · 0 评论 -
HashMap笔记-JDK1.8
之前写过一篇HashMap笔记,不过是JDK1.7(含)之前HashMap,JDK在8后对HashMap做了很多的优化,在key冲突情况下的HashMap中的元素会形成一条链表,如果冲突key过多,则链表会越长,查询会变成线性时间复杂度O(log(n)),JDK8加入了红黑树来优化这种情况,所以也进行了再次研究下源码。我们先从put方法入手。JDK8的HashMap在插入元素时final V pu...原创 2018-04-07 22:31:00 · 284 阅读 · 0 评论 -
Java的类装载体系
在Java的沙箱中,类装载器体系结构的第一道防线。因为java的字节码是由类装载器装载入Java虚拟机的。不同的类装载器提供不同的命名空间,命名空间可以隔离不同的类装载喊之间装载的类,有助于安全的实现。一、class文件检验器class文件检验器保证装载的class文件内容有正确的结构,而且这些class文件相互协调一致。class文件检验器只是在字节码执行之前对class文件进行一次分析检验它的...原创 2018-04-18 00:21:42 · 307 阅读 · 0 评论 -
MapStruct
一般java web开发的程序员,都有一个共同的体会,接受请求参数都会使用一个vo类,这个vo类里封装了所有需要接受的参数,然后对参数进行业务逻辑处理,处理完后会持久化处理,通常每个业务表都会对应一个bean类,然后就需要将vo对象转化为bean对象再持久化,这个过程中,就需要new bean对象,给bean对象里的每个属性赋值;请求处理完,还需要有返回,通常返回也会封装一个vo类,...原创 2018-11-24 23:08:04 · 790 阅读 · 0 评论 -
ReentrantLock笔记
最近看了java的并发包concurrent的ReentrantLock类源码,做下笔记。//在java的concurrent包中有个Lock接口,用来规范定义锁的行为public interface Lock{ /** * 获得锁,如果锁不可用,当前线程会一直休眠(即使当前线程被其他线程中断的情况也会一直休眠)直到锁可获得。 */ void lock原创 2016-12-18 22:35:07 · 396 阅读 · 0 评论 -
CLH队列
NUMA与SMPSMP(Symmetric Multi-Processor),即对称多处理器结构,指服务器中多个CPU对称工作,每个CPU访问内存地址所需时间相同。其主要特征是共享,包含对CPU,内存,I/O等进行共享。SMP的优点是能够保证内存一致性,缺点是这些共享的资源很可能成为性能瓶颈,随着CPU数量的增加,每个CPU都要访问相同的内存资源,可能导致内存访问冲突,可能会导致CPU资源的浪转载 2017-11-22 14:42:16 · 6069 阅读 · 0 评论 -
slf4j和log4j的源码及异步日志
我们在项目中,一般这样使用slf4j来记录日志:org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(Test.class);从这个日志Logger创建入手来看看源码:org.slf4j.LoggerFactory.getLogger(String name){ ILoggerFactory iLoggerFacto原创 2017-08-23 10:31:27 · 3783 阅读 · 0 评论 -
HashMap笔记
前序 HashMap是Map的主要实现类,Map可查看点击打开链接 HashMap中保存着key-value的映射关系对元素,简称为mapping,即是HashMap.Entry。 mapping的key是不能重复的,即HashMap里不能包含两个相同的key,而mapping的value是可以重复相同,即不同的key可以映射相同的value。key和value的规则...原创 2015-01-18 23:11:54 · 1277 阅读 · 0 评论 -
Thread笔记
1.yield();静态方法Thread.yield()的调用是对线程调度器(java线程机制的一部分,可以将CPU从一个线程转移给另一个线程)的一种建议,原创 2015-03-29 00:00:03 · 710 阅读 · 0 评论 -
JAVA CAS原理深度分析
CASCAS:Compare and Swap, 翻译成比较并交换。 java.util.concurrent包中借助CAS实现了区别于synchronouse同步锁的一种乐观锁。 本文先从CAS的应用说起,再深入原理解析。CAS应用CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。非阻塞算转载 2016-12-08 17:54:42 · 803 阅读 · 0 评论 -
线上服务CPU100%问题快速定位实战
题目某服务器上部署了若干tomcat实例,即若干垂直切分的Java站点服务,以及若干Java微服务,突然收到运维的CPU异常告警。问:如何定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码导致CPU过载? 步骤一、找到最耗CPU的进程工具:top方法:执行top -c,显示进程运行信息列表键入P (大写p),进程按照CPU使用率排序图示:如上图,最耗CPU的进程PID为10765 ...转载 2017-09-01 13:13:20 · 1343 阅读 · 2 评论 -
线上服务内存OOM问题定位三板斧
相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的原因:本身资源不够申请的太多资源耗尽58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问题排查实战演练,将内存OOM问题定位三板斧分享出来,希望对大家也有帮助。 题目某服务器上部署了Java服务一枚,出现了OutOfMemoryError,请问有可能是什么原因,问题应该如何定位?不妨设服务进程P...转载 2017-09-01 15:34:02 · 3825 阅读 · 1 评论 -
ReentrantReadWriteLock
一、原理read write lock 读写锁程序对一个资源的访问,一般可分为两种目标,一种是读取资源的信息,另一种是修改资源的信息,两种操作分为:读操作和写操作。在程序对一个资源进行读操作时,是允许其他程序也可以对资源进行读操作的,也可以另一种说法,读操作是共享的,因此,读写锁中的读锁也叫共享锁;在程序对一个资源进行写操作时,是不允许其他程序也去访问资源的,不管是写还是读操作原创 2017-11-18 21:59:33 · 229 阅读 · 0 评论 -
ThreadLocal笔记
线程类Thread包含了属性threadLocals,如下:/* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ThreadLocal.ThreadLocalMap threadLocals = null;我们看下Th原创 2017-04-25 18:07:06 · 403 阅读 · 0 评论 -
Java的随机数原理
Java生成随机数时,可以会使用以下方法final int i = new Random().nextInt(int bound);或者final double v = Math.random();初一看,以为是两种方式,其实第二种的底层也是使用了Random的方法nextDouble(),所以我们主要看Random的方法即可。原理计算机生成随机数,有几种方式1.物理方式正在意义上...原创 2019-07-07 13:08:46 · 2744 阅读 · 0 评论