
Java
衣舞晨风
微信公众号【衣舞晨风】
-
原创 深入理解JVM读书笔记一: Java内存区域与内存溢出异常
Java虚拟机管理的内存包括几个运行时数据内存:方法区、虚拟机栈、本地方法栈、堆、程序计数器,其中方法区和堆是由线程共享的数据区,其他几个是线程隔离的数据区。2.2 运行时数据区域2.2.1程序计数器程序计数器是一块较小的内存,他可以看做是当前线程所执行的行号指示器。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码的指令,分支、循环、跳转、异常处2016-10-09 21:49:111683
0
-
原创 Java JVM常用命令 笔记
1、查看磁盘的IO负载jiankunking@ubuntu:~$ iostat --manUsage: iostat [ options ] [ <interval> [ <count> ] ]Options are:[ -c ] [ -d ] [ -h ] [ -k | -m ] [ -N ] [ -t ] [ -V ] [ -x ] [ -y ] [ -z ]...2018-03-25 19:48:321022
0
-
原创 Java sleep和wait的区别
sleep() 方法 wait() 方法 sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会; wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(l...2018-04-05 10:44:186749
0
-
原创 Java Lambda表达式 实现原理分析
本文分析基于JDK 9一、目标本文主要解决两个问题: 1、函数式接口 到底是什么? 2、Lambda表达式是怎么实现的?先介绍一个jdk的bin目录下的一个字节码查看工具及反编译工具:javap 二、函数式接口@FunctionalInterfaceinterface IFunctionTest<T> { public void prin...2018-04-06 07:39:1015377
7
-
原创 Java Fork/Join与协程
一、概览Fork/Join并行方式是获取良好的并行计算性能的一种最简单同时也是最有效的设计技术。Fork/Join并行算法是我们所熟悉的分治算法的并行版本,典型的用法如下:Result solve(Problem problem) { if (probl2018-04-22 17:52:341255
0
-
原创 Java并发编程的艺术--volatile的定义与实现原理
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保2018-04-25 21:51:08571
0
-
原创 排查Java的CPU性能问题
最近在github上看到了一个很实用一些脚本,github地址: https://github.com/oldratlee/useful-scripts其中有一个(show-busy-java-threads)用于快速排查Java的CPU性能问题(top us值过高),自动查出运行的Java进程中消耗CPU多的线程,并打印出其线程栈,从而确定导致性能问题的方法调用。于是尝试了一把,具体案...2018-05-13 10:21:321336
0
-
原创 Java并发编程的艺术-final域的内存语义
final域的重排序规则 对于final域,编译器和处理器要遵守两个重排序规则。在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。写final域的重排序规...2018-05-16 07:35:47483
0
-
原创 Java volatile的内存语义与AQS锁内存可见性
提到volatile首先想到就是:保证此变量对所有线程的可见性,这里的 “可见性” 是指当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的。禁止指令重排序优化。&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;amp;2018-05-23 19:51:002652
5
-
原创 Java Runnable和Thread
刚才刷知乎的之后,突然刷到一个问题:Thread与Runnable区别?然后我看了一下源码,发现Runnable是一个接口:@FunctionalInterfacepublic interface Runnable { public abstract void run();}而Thread是实现了Runnable接口的一个类 我有点好奇的就是这两个有啥好纠结的?...2018-04-07 16:46:17608
0
-
原创 Java CPU 占用高 模拟及排查
模拟线上排查CPU占用高的问题 1、模拟代码如下package com.jiankunking.cpu;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;/** * Created by jiankunking on 2018/3/29. */@Co...2018-03-29 22:12:062135
0
-
原创 Java并发编程实战--FutureTask
FutureTask也可以用作闭锁。(FutureTask实现了Future语义,表示一种抽象的可生成结果的计算。FutureTask表示的计算是通过Callable来实现的,相当于一种可生成结果的Runnable,并且可以处于以下3种状态:等待运行(Waiting to run),正在运行(Running)和运行完成(Completed)。”执行完成”表示计算的所有可能结束方式,包括正常结束、由2017-05-24 13:04:21782
0
-
原创 Java并发编程实战--笔记一
第1-3章(线程安全性、对象的共享、对象的组合) 无状态对象一定是线程安全的。 要保持状态的一致性,就需要在单个原子操作中更新所有相关的状态变量。 synchronized修饰方法表示:在同一时刻,只有一个线程可以执行该方法。 “重入”意味着获取锁的操作的粒度是”线程”,而不是调用。重入的一种实现方法是,为每一个锁关联一个获取计数值和一个所有者线程。2017-06-04 08:50:391433
1
-
原创 Java并发编程实战--读书笔记(目录)
一、重点章节摘录1、 闭锁 CountDownLatch 2、FutureTask 3、计数信号量(Semaphore) 4、 事实不可变对象 5、协作对象间的死锁与开放调用 6、通过线程转储信息来分析死锁 7、Amdahl定律 8、this引用逸出 9、显式的Condition对象 10、双重检查加锁( double check lock)与延迟初始化占位二、每章笔2017-06-08 08:04:372709
3
-
转载 一次Java线程池误用引发的血案和总结
这是一个十分严重的问题自从最近的某年某月某天起,线上服务开始变得不那么稳定。在高峰期,时常有几台机器的内存持续飙升,并且无法回收,导致服务不可用。例如GC时间采样曲线:和内存使用曲线:图中所示,18:50-19:00的阶段,已经处于服务不可用的状态了。上游服务的超时异常会增加,该台机器会触发熔断。熔断触发后,改台机器的流量会打到其他机器,其他机器发生类似的情况的可能性会提高,极端情况会引起所有服务2018-02-04 15:59:028548
0
-
转载 JVM 堆与栈
Java Heap Memory堆内存(heap memory)是被用来在runtime的时候给对象和jre的那些class分配内存的。注意是runtime的时候。不管你何时创建对象,创建任何一个对象,这些对象都是被创建在了heap空间里的。那个我们熟悉的gc(垃圾回收站)负责把那些不再被引用(reference)...2018-02-27 19:11:41667
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:174782
1
-
原创 Java AQS 梳理
AQS:AbstractQueuedSynchronizer1、设计简介AQS的实现是基于一个FIFO的等待队列。使用单个原子变量来表示获取、释放锁状态(final int)改变该int值使用的是CAS。子类应该定义一个非公开的内部类继承AQS,并实现其中方法。AQS支持exclusive与shared两种模式。内部类ConditionObject用于支持子类实现exclus...2018-03-03 20:01:454520
0
-
原创 Java 内存 占用高 模拟及排查
模拟线上排查内存占用高的问题1、模拟代码如下package com.jiankunking.memory;import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;import java.util.ArrayList;import java.util.HashM...2018-03-29 21:36:472189
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:504551
1
-
原创 NIO零拷贝与操作系统零拷贝
零拷贝的定义Zero-copy, 就是在操作数据时, 不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域. 因为少了一次内存的拷贝, 因此 CPU 的效率就得到的提升.在 OS 层面上的 Zero-copy 通常指避免在 用户态(User-space) 与 内核态(Kernel-space) 之间来回拷贝数据。Netty 中的 Zero-copy 与 OS 的 Zero-cop...2018-10-02 09:24:171411
1
-
转载 Java NIO 浅析
在阅读本文前,强烈建议阅读一下:《Java NIO AIO 基本概念》如何结合事件模型使用NIO同步非阻塞特性回忆BIO模型,之所以需要多线程,是因为在进行I/O操作的时候,一是没有办法知道到底能不能写、能不能读,只能"傻等",即使通过各种估算,算出来操作系统没有能力进行读写,也没法在socket.read()和socket.write()函数中返回,这两个函数无法进行有效的中断。所以除了多开...2018-10-02 09:38:40319
0
-
原创 Java 12 Shenandoah GC
Shenandoah: An open-source concurrent compacting garbage collector forOpenJDKABSTRACTShenandoah is an open-source region-based low-pause paral-lel and concurrent garbage collection (GC) algorithm...2019-01-10 20:39:042330
3
-
原创 Java GC G1 详解
G1(Garbage-First)回收器是在JDK1.7中正式使用的全新垃圾回收器,G1拥有独特的垃圾回收策略,从分代上看,G1依然属于分代垃圾回收器,它会区分年代和老年代,依然有eden和survivor区,但从堆的结构上看,它并不要求整个eden区、年清代或者老年代都连续。它使用了全新的分区算法。其特点如下:并行性:G1在回收期间,可以由多个GC线程同时工作,有效利用多核计算能力。...2019-01-02 18:09:506940
0
-
原创 Boxing and Unboxing
C#It is best to avoid using value types in situations where they must be boxed a high number of times, for example in non-generic collections classes such as System.Collections.ArrayList. You can avo...2019-02-18 12:22:55299
0
-
原创 Java 原子操作的实现原理
原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。让我们一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。1.术语定义在了解原子操作的实现原理前,先要了解一下相关的术语,如表2-7所示。2.处理器如何实现原子操作32位IA-32处理器使用基于对...2019-03-27 20:01:57611
0
-
原创 linux 查看java的安装路径
在linux下,如何找java的安装路径jiankunking@ubuntu:/etc$ whereis javajava: /usr/bin/java /usr/share/java /usr/lib/jvm/java-8-openjdk-amd64/bin/java /usr/share/man/man1/java.1.gzjiankunking@ubuntu:/etc$ ls -lrt...2019-07-19 21:05:03237
1
-
原创 面试必备:Java JUC AtomicLong 实现解析
基于OpenJDK12本文的目的是为后续文章解析LongAdder做一个引子,以便两者对比。Atomic Package解析参考(比如lazySet原理解析):[译]Java Concurrent Atomic Package详解AtomicLong的常用方法如下: long addAndGet(long delta):以原子方式将输入的数值与实例中的值(Atom...2019-08-07 20:42:24497
0
-
原创 [译]Java Concurrent Atomic Package详解
翻译自:Package java.util.concurrent.atomic地址:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html#package.description翻译JDK8而不是12的原因是JDK8对与内存语义部分讲解更加详细。Pack...2019-08-07 11:28:07262
0
-
原创 [译]ZGC: 一个可伸缩的低延迟垃圾收集器
翻译自:JEP 333地址:https://openjdk.java.net/jeps/333一、摘要Z垃圾收集器,也称为ZGC,是一个可伸缩的低延迟垃圾收集器。二、目标 GC暂停时间不超过10ms 能处理大小从相对较小(几百MB)到非常大(TB级)的堆 与使用G1相比,应用程序吞吐量减少不超过15% 方便日后在此基础上利用彩色指针和内存屏障...2019-07-31 07:48:20348
0
-
转载 Java ZGC: A Scalable Low-Latency Garbage Collector
SummaryThe Z Garbage Collector, also known as ZGC, is a scalable low-latency garbage collector.GoalsGC pause times should not exceed 10msHandle heaps ranging from relatively small (a few hundreds...2018-12-26 17:42:40718
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:00278
0
-
原创 Golang 协程 跟Java NIO
《Java NIO AIO 基本概念》《goroutine 调度器(scheduler)》有没有发现Golang协程的schedule跟Java NIO的selector很像?都是依赖epoll(linux)来判断事情有没有完成JDK 7 引入了NIO 2,NIO2用的就是epoll,因此判断一个网络包会不会出现BIO那种情况,就可以看他代码网络部分用的是不是NIO 2。个人微信公众号:...2018-10-02 10:44:032917
0
-
原创 kubernates java client 连接api server
kubernates java client 官方包地址:https://github.com/kubernetes-client/java1、根据官方文档引入pom2、登陆kubernates集群master节点找到kubectl.kubeconfig文件3、将kubectl.kubeconfig放到代码resources相应的位置Spring boot 读取jar包中resource...2018-10-13 09:45:533657
0
-
原创 使用JMC(Java Mission Control )监控docker中的java应用
JMC:Java Mission Controldockerfile如下:FROM openjdk:10.0.2ADD log-search-0.0.1-SNAPSHOT.jar /application.jarWORKDIR /RUN echo "Asia/Shanghai" > /etc/timezoneCMD ["java","-Dcom.sun.management.jm...2018-10-23 13:24:31775
0
-
原创 实战JAVA虚拟机:在TLAB上分配对象
TLAB全称是Thread Local Allocation Buffer 即线程本地分配缓存,从名字上看是一个线程专用的内存分配区域。为什么需要TLAB这个区域呢?这是为了加速对象分配而生的。由于对象一般会分配在堆上,而堆是全局共享的。所以存在多个线程在堆上申请空间。因此,每一次对象分配都必须要进行同步(虚拟机采用CAS配上失败重试的方式保证更新操作的原子性),而在竞争激烈的场合分配的效率又会...2018-10-24 08:09:26394
1
-
原创 Java并发编程的艺术:Condition的实现分析
ConditionObject是同步器AbstractQueuedSynchronizer的内部类,因为Condition的操作需要获取相关联的锁,所以作为同步器的内部类也较为合理。每个Condition对象都包含着一个队列(以下称为等待队列),该队列是Condition对象实现等待/通知功能的关键。下面将分析Condition的实现,主要包括:等待队列、等待和通知,下面提到的Condition...2018-10-27 09:35:362977
4
-
原创 念念不忘的ReentrantReadWriteLock
来先猜一下ReentrantReadWriteLock会如何实现?都在java.util.concurrent包下,那么可以明确一点,那就是关于锁的实现,应该用的就是AQS,那么,读锁、写锁会不会对应的就是AQS中的共享模式与独占模式?2019-05-16 07:55:031356
7
-
转载 MEMORY TUNING: KEY PERFORMANCE INDICATORS
When you are tuning the application’s memory &amp;amp; Garbage Collection settings, you should take well-informed decisions based on the key performance indicators. But there are overwhelming amount of m...2018-11-21 12:22:32245
0
-
原创 面试必备:Java JUC Atomic LongAdder 详解
基于OpenJDK12阅读本文前,推荐先阅读以下两篇文章,以便能更好的对比理解:[译]Java Concurrent Atomic Package详解面试必备:Java JUC AtomicLong 实现解析LongAdder是JDK 1.8 新增的原子类,基于Striped64实现。从官方文档看,LongAdder在高并发的场景下会比AtomicLong ...2019-08-09 07:23:461379
0