Java 进阶
Java 高级特性 笔记
-
转
Java ZGC: A Scalable Low-Latency Garbage Collector
Summary The Z Garbage Collector, also known as ZGC, is a scalable low-latency garbage collector. Goals GC pause times should not exceed 10ms Handle heaps ranging from relatively small (a few hundreds...2018-12-26 17:42:40 阅读数:77 评论数:1 -
原
Netty Reactor 模型
一、Reactor单线程模型 Reactor单线程模型,指的是所有的I/O操作都在同一个NIO线程上面完成,NIO线程的职责如下: 作为NIO服务端,接收客户端的TCP连接; 作为NIO客户端,向服务端发起TCP连接; 读取通信对端的请求或者应答消息; 向通信对端发送消息请求或者应答消息; 单线程模型如图18-1所示: 由于Reactor模式使用的是异步非阻塞I/O,所有的I/O操作都不会导...2018-12-09 18:09:00 阅读数:60 评论数:0 -
原
Java JDK 11 ReentrantReadWriteLock 原理分析
今天本来是想去户外穿越看枫叶的,但报名晚了又加上今天天气不太好,未去成。 无所事事,于是,就想把之前未曾细看过的读写锁看一下。 1、前言 希望在阅读本文之前,建议先看一下以下两篇文章: 1、《Java AQS 梳理》 2、《Java volatile的内存语义与AQS锁内存可见性》 读完了以上两篇文章,先看一下ReentrantReadWriteLock的代码路径: package java.ut...2018-11-11 10:57:29 阅读数:812 评论数:3 -
原
Java并发编程的艺术:Condition的实现分析
ConditionObject是同步器AbstractQueuedSynchronizer的内部类,因为Condition的操作需要获取相关联的锁,所以作为同步器的内部类也较为合理。每个Condition对象都包含着一个队列(以下称为等待队列),该队列是Condition对象实现等待/通知功能的关键。 下面将分析Condition的实现,主要包括:等待队列、等待和通知,下面提到的Condition...2018-10-27 09:35:36 阅读数:2398 评论数:5 -
原
Java JVM常用命令 笔记
1、查看磁盘的IO负载 jiankunking@ubuntu:~$ iostat --man Usage: iostat [ options ] [ <interval> [ <count> ] ] Options are: [ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]...2018-03-25 19:48:32 阅读数:507 评论数:0 -
原
实战JAVA虚拟机:在TLAB上分配对象
TLAB全称是Thread Local Allocation Buffer 即线程本地分配缓存,从名字上看是一个线程专用的内存分配区域。 为什么需要TLAB这个区域呢?这是为了加速对象分配而生的。由于对象一般会分配在堆上,而堆是全局共享的。所以存在多个线程在堆上申请空间。因此,每一次对象分配都必须要进行同步(虚拟机采用CAS配上失败重试的方式保证更新操作的原子性),而在竞争激烈的场合分配的效率又会...2018-10-24 08:09:26 阅读数:74 评论数:1 -
原
使用JMC(Java Mission Control )监控docker中的java应用
JMC:Java Mission Control dockerfile如下: FROM openjdk:10.0.2 ADD log-search-0.0.1-SNAPSHOT.jar /application.jar WORKDIR / RUN echo "Asia/Shanghai" > /etc/timezone CMD ["java","-Dcom.sun.management.jm...2018-10-23 13:24:31 阅读数:98 评论数:0 -
转
Java NIO 浅析
在阅读本文前,强烈建议阅读一下:《Java NIO AIO 基本概念》 如何结合事件模型使用NIO同步非阻塞特性 回忆BIO模型,之所以需要多线程,是因为在进行I/O操作的时候,一是没有办法知道到底能不能写、能不能读,只能"傻等",即使通过各种估算,算出来操作系统没有能力进行读写,也没法在socket.read()和socket.write()函数中返回,这两个函数无法进行有效的中断。所以除了多开...2018-10-02 09:38:40 阅读数:67 评论数:0 -
原
NIO零拷贝与操作系统零拷贝
零拷贝的定义 Zero-copy, 就是在操作数据时, 不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域. 因为少了一次内存的拷贝, 因此 CPU 的效率就得到的提升. 在 OS 层面上的 Zero-copy 通常指避免在 用户态(User-space) 与 内核态(Kernel-space) 之间来回拷贝数据。 Netty 中的 Zero-copy 与 OS 的 Zero-cop...2018-10-02 09:24:17 阅读数:163 评论数:0 -
原
Java NIO AIO 基本概念
一、NIO 在介绍NIO编程之前,我们首先需要澄清一个概念:NIO到底是什么的简称?有人称之为New I/O,因为它相对于之前的I/O类库是新增的,所以被称为New I/O,这是它的官方叫法。但是,由于之前老的I/O类库是阻塞I/O,New I/O类库的目标就是要让Java支持非阻塞I/O,所以,更多的人喜欢称之为非阻塞I/O(Non-block I/O),由于非阻塞I/O更能够体现NIO的特点,...2018-10-02 09:01:50 阅读数:162 评论数:0 -
原
Java volatile的内存语义与AQS锁内存可见性
提到volatile首先想到就是: 保证此变量对所有线程的可见性,这里的 “可见性” 是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。 禁止指令重排序优化。   &2018-05-23 19:51:00 阅读数:1292 评论数:4 -
原
Java并发编程的艺术-final域的内存语义
final域的重排序规则       对于final域,编译器和处理器要遵守两个重排序规则。 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。 写final域的重排序规...2018-05-16 07:35:47 阅读数:178 评论数:0 -
原
Java sleep和wait的区别
sleep() 方法 wait() 方法 sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会; wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(l...2018-04-05 10:44:18 阅读数:672 评论数:0 -
原
Java Lambda表达式 实现原理分析
本文分析基于JDK 9 一、目标 本文主要解决两个问题: 1、函数式接口 到底是什么? 2、Lambda表达式是怎么实现的? 先介绍一个jdk的bin目录下的一个字节码查看工具及反编译工具:javap 二、函数式接口 @FunctionalInterface interface IFunctionTest<T> { public void prin...2018-04-06 07:39:10 阅读数:2380 评论数:1 -
原
Java AQS 梳理
AQS:AbstractQueuedSynchronizer 1、设计简介 AQS的实现是基于一个FIFO的等待队列。 使用单个原子变量来表示获取、释放锁状态(final int)改变该int值使用的是CAS。 子类应该定义一个非公开的内部类继承AQS,并实现其中方法。 AQS支持exclusive与shared两种模式。 内部类ConditionObject用于支持子类实现exclus...2018-03-03 20:01:45 阅读数:721 评论数:0 -
转
JVM 堆与栈
Java Heap Memory       堆内存(heap memory)是被用来在runtime的时候给对象和jre的那些class分配内存的。注意是runtime的时候。不管你何时创建对象,创建任何一个对象,这些对象都是被创建在了heap空间里的。那个我们熟悉的gc(垃圾回收站)负责把那些不再被引用(reference)...2018-02-27 19:11:41 阅读数:276 评论数:0 -
原
Java 枚举实现原理
枚举 反编译 示意枚举类如下: package com.jiankunking.test; public enum ApplicationInterfaceTypeEnum { dubbo("dubbo", 1), webapp("webapp", 2), custom("custom", 3); private String name; private int...2018-02-23 20:26:17 阅读数:1064 评论数:0 -
转
一次Java线程池误用引发的血案和总结
这是一个十分严重的问题自从最近的某年某月某天起,线上服务开始变得不那么稳定。在高峰期,时常有几台机器的内存持续飙升,并且无法回收,导致服务不可用。例如GC时间采样曲线:和内存使用曲线:图中所示,18:50-19:00的阶段,已经处于服务不可用的状态了。上游服务的超时异常会增加,该台机器会触发熔断。熔断触发后,改台机器的流量会打到其他机器,其他机器发生类似的情况的可能性会提高,极端情况会引起所有服务2018-02-04 15:59:02 阅读数:1973 评论数:0 -
原
Java并发编程实战--笔记四
第13章 显式锁 为什么要创建一种与内置锁如此现实的加锁机制?在大多数情况下,内置锁能很好地工作,但在功能上存在一些局限性,例如,无法中断一个正在等待获取锁的线程,或者无法再请求一个锁时无限地等待下去。内置锁必须在获取该锁的代码块中释放,这就简化了编码工作,并且与异常处理操作实现了很好地交互,但却无法实现非阻塞结构的加锁规则。这些都是使用synchronized的原因,但在某些情况下,一种更2017-10-13 14:50:13 阅读数:346 评论数:0 -
原
Java并发编程实战--笔记三
第8章:线程池的使用 // 在单线程Executor中任务发生死锁(不要这么做) public class ThreadDeadlock { ExecutorService exec = Executors.newSingleThreadExecutor(); public class RenderPageTask implements Callable<String> {2017-10-13 14:49:24 阅读数:365 评论数:0