Java性能工具汇总
从实现方式上,大致可以分为下面几类:
基于读取hsperfdata:jps,jstat,jstack、jcmd
基于JMX:VisualVM,JConsole
基于SA:VisualVM,JHsdb
基于JVMTI:async-profiler
基于Instrumentation:Arthas
基于JVM Internal:JFR
基于Sampling
JDK自带的工具总览在JDK的bin目录中,不仅存在javac,java这两个编译和运行Java程序的命令,还包含各种性能监控,故障处理的工具。这些工具大致可以分为三类:
商业授权工具
正式支持工具
实验性工具
基础性命令行工具jpsjps(JVM Process Status)是一个最基础的工具,它的名字和Unix系统中的ps命令很相似.功能也很相似。它可以列出正在运行的虚拟机进程,并显示虚拟机执行主类名称(Main Class, main函数所在的类),以及这些进程的本地虚拟机唯一 ID(LVMID,Local Virtual Machine Identifier)。jps因为其功能的特殊性,绝对是使用频率最高的JKD命令 ...
云原生时代下Java的发展
分享一个之前做的slides :)
Java类文件结构——以HelloWorld为例逐字节分析
本文旨在通过对HelloWorld代码编译后的类文件进行逐字节分析,讲解Class类文件的结构。
准备工作先准备一段 Java 代码
1234567package com.raining;public class HelloWorld { public static void main(String[] args) { System.out.println("Hello,World!"); }}
然后,用 javac 编译,得到class文件
class文件是一组以字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在文件中。注意是大端机(高位在前)的存储方式。
准备工具WinHex,WinHex可以轻松的以十六进制的格式打开文本文件,方便我们查看class文件中的二进制码。使用WinHex打开class文件,界面如下图所示:
文字版如下:
123456789101112131415161718192021222324252627282930Offset 0 1 2 ...
一文讲透网络容器(Servlet、Tomcat、Jetty、Netty)
最近在研究网关,调研了一下 Java 技术栈的网关,发现业界主流的 Java 网关基本上可以分为下面四种:
Servlet + 线程池
NIO(Tomcat / Jetty) + Servlet 3.0 异步
Spring WebFlux
NettyServer + NettyClient
在这之前,我对 Netty 是比较熟悉的,但是对于第一种与第二种比较陌生,于是打算系统整理一下Servlet、IO模型、Tomcat、Jetty的相关知识,期待有一个完整的认识。
什么是 Web 容器?早期的 Web 应用主要用于浏览新闻等静态页面,HTTP 服务器(比如 Apache、Nginx)向浏览器返回静态 HTML,浏览器负责解析 HTML,将结果呈现给用户。
随着互联网的发展,我们已经不满足于仅仅浏览静态页面,还希望通过一些交互操作,来获取动态结果,因此也就需要一些扩展机制能够让 HTTP 服务器调用服务端程序。
于是 Sun 公司推出了 Servlet 技术。我们可以把 Servlet 简单理解为运行在服务端的 Java 小程序,但是 Servlet 没有 m ...
Zuul2 原理与源码深入剖析
网关分类常见的开源网关按照语言分类有如下几类:
Nginx+Lua: OpenResty、Kong 等;
Java: Zuul1/Zuul2、Spring Cloud Gateway、gravitee-gateway、Shenyu 等;
Go: janus、GoKu API Gateway 等;
Node.js: Express Gateway、
MicroGateway 等。
我们主要考虑 Java 语言的网关。接下来调研了Zuul1、Zuul2、Spring Cloud Gateway、Dromara Soul。
业界主流的网关基本上可以分为下面四种:
Servlet + 线程池
NIO(Tomcat / Jetty) + Servlet 3.0 异步
Spring WebFlux
NettyServer + NettyClient
在进行技术选型的时候,主要考虑功能丰富度、性能、稳定性。Zuul2 是一个基于 Netty 框架的异步非阻塞的高性能网关。
Zuul2 整体概览接下来我们简要介绍一下 Zuul2 关键知识点。
Zuul2 的 ...
CyclicBarrier源码解析
本篇博客中的大部分内容并非原创,仅做整理作为学习资料使用
参考:https://www.cnblogs.com/tong-yuan/p/CyclicBarrier.html
问题(1)CyclicBarrier是什么?
(2)CyclicBarrier具有什么特性?
(3)CyclicBarrier与CountDownLatch的对比?
简介CyclicBarrier,回环栅栏,它会阻塞一组线程直到这些线程同时达到某个条件才继续执行。它与CountDownLatch很类似,但又不同,CountDownLatch需要调用countDown()方法触发事件,而CyclicBarrier不需要,它就像一个栅栏一样,当一组线程都到达了栅栏处才继续往下走。
使用方法12345678910111213141516171819public class CyclicBarrierTest { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBar ...
CountDownLatch源码解析
本篇博客中的大部分内容并非原创,仅做整理作为学习资料使用
参考:https://www.cnblogs.com/tong-yuan/p/CountDownLatch.html
问题(1)CountDownLatch是什么?
(2)CountDownLatch具有哪些特性?
(3)CountDownLatch通常运用在什么场景中?
(4)CountDownLatch的初始次数是否可以调整?
简介CountDownLatch,可以翻译为倒计时器,但是似乎不太准确,它的含义是允许一个或多个线程等待其它线程的操作执行完毕后再执行后续的操作。
CountDownLatch的通常用法和Thread.join()有点类似,等待其它线程都完成后再执行主任务。
类结构
CountDownLatch中只包含了Sync一个内部类,它没有公平/非公平模式,所以它算是一个比较简单的同步器了。
这里还要注意一点,CountDownLatch没有实现Serializable接口,所以它不是可序列化的。
源码分析内部类Sync123456789101112131415161718192021222324 ...
Semaphore源码解析
本篇博客中的大部分内容并非原创,仅做整理作为学习资料使用
参考:https://www.cnblogs.com/tong-yuan/p/Semaphore.html
PROPAGATE 还是不太懂,大概就是因为并发,head的状态处于一个中间值,导致了无法向后传播了,所以需要增加一个状态 PROPAGATE。
问题(1)Semaphore是什么?
(2)Semaphore具有哪些特性?
(3)Semaphore通常使用在什么场景中?
(4)Semaphore的许可次数是否可以动态增减?
(5)Semaphore如何实现限流?
简介Semaphore,信号量,它保存了一系列的许可(permits),每次调用acquire()都将消耗一个许可,每次调用release()都将归还一个许可。
特性Semaphore通常用于限制同一时间对共享资源的访问次数上,也就是常说的限流。
下面我们一起来学习Java中Semaphore是如何实现的。
类结构
Semaphore中包含了一个实现了AQS的同步器Sync,以及它的两个子类FairSync和NonFairSync,这说明Semaphore ...
ReentrantReadWriteLock源码解析
简介读写锁是一种特殊的锁,它把对共享资源的访问分为读访问和写访问,多个线程可以同时对共享资源进行读访问,但是同一时间只能有一个线程对共享资源进行写访问,使用读写锁可以极大地提高并发量。
特性读写锁具有以下特性:
是否互斥
读
写
读
否
是
写
是
是
可以看到,读写锁除了读读不互斥,读写、写读、写写都是互斥的。
那么,ReentrantReadWriteLock 是怎么实现读写锁的呢?
类结构在看源码之前,我们还是先来看一下 ReentrantReadWriteLock 这个类的主要结构。
ReentrantReadWriteLock中的类分成三个部分:
(1)ReentrantReadWriteLock本身实现了ReadWriteLock接口,这个接口只提供了两个方法readLock()和writeLock();
(2)同步器,包含一个继承了AQS的Sync内部类,以及其两个子类FairSync和NonfairSync;
(3)ReadLock和WriteLock两个内部类实现了Lock接口,它们具有锁的一些特性。
12345678public interf ...
ConditionObject源码解析
本篇博客中的大部分内容并非原创,仅做整理作为学习资料使用
简介条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等待某个条件的出现才可以继续处理时使用的一种锁。
比如,在阻塞队列中,当队列中没有元素的时候是无法弹出一个元素的,这时候就需要阻塞在条件notEmpty上,等待其它线程往里面放入一个元素后,唤醒这个条件notEmpty,当前线程才可以继续去做“弹出一个元素”的行为。
注意,这里的条件,必须是在获取锁之后去等待,对应到ReentrantLock的条件锁,就是获取锁之后才能调用condition.await()方法。
在java中,条件锁的实现都在AQS的ConditionObject类中,ConditionObject实现了Condition接口,下面我们通过一个例子来进入到条件锁的学习中。
使用示例1234567891011121314151617181920212223242526272829303132333435363738public class ReentrantLockTest { public static void main(St ...