图解 | 你管这破玩意儿叫TCP?
你是一台电脑,你的名字叫 A
经过《如果让你来设计网络》这篇文章中的一番折腾,只要你知道另一位伙伴 B 的 IP 地址,且你们之间的网络是通的,无论多远,你都可以将一个数据包发送给你的伙伴 B
这就是物理层、数据链路层、网络层这三层所做的事情。
站在第四层的你,就可以不要脸地利用下三层所做的铺垫,随心所欲地发送数据,而不必担心找不到对方了。
虽然你此时还什么都没干,但你还是给自己这一层起了个响亮的名字,叫做传输层。
你本以为自己所在的第四层万事大吉,啥事没有,但很快问题就接踵而至。
问题来了
前三层协议只能把数据包从一个主机搬到另外一台主机,但是,到了目的地以后,数据包具体交给哪个程序(进程)呢?
所以,你需要把通信的进程区分开来,于是就给每个进程分配一个数字编号,你给它起了一个响亮的名字:端口号。
然后你在要发送的数据包上,增加了传输层的头部,源端口号与目标端口号。
OK,这样你将原本主机到主机的通信,升级为了进程和进程之间的通信。
你没有意识到,你不知不觉实现了 UDP 协议!
(当然 UDP 协议中不光有源端口和目标端口,还有数据包长度和校验值,我们暂且略过)
就这 ...
图解 | 你管这破玩意叫线程池?
小宇:闪客,我最近看到线程池,被里边乱七八槽的参数给搞晕了,你能不能给我讲讲呀?
闪客:没问题,这个我擅长,咱们从一个最简单的情况开始,假设有一段代码,你希望异步执行它,是不是要写出这样的代码?
1new Thread(r).start();
小宇:嗯嗯,最简单的写法似乎就是这样呢。
闪客:这种写法当然可以完成功能,可是你这样写,老王这样写,老张也这样写,程序中到处都是这样创建线程的方法,能不能写一个统一的工具类让大家调用呢?
小宇:可以的,感觉有一个统一的工具类,更优雅一些。
闪客:那如果让你来设计这个工具类,你会怎么写呢?我先给你定一个接口,你来实现。
123public interface Executor { public void execute(Runnable r);}
小宇:emmm,我可能先定义几个成员变量,比如核心线程数、最大线程数 …反正就是那些乱七八糟的参数。
闪客:STOP!小宇呀,你现在深受面试手册的毒害,你先把这些全部的概念忘掉,就说让你写一个最简单的工具类,第一反应,你会怎么写?
第一版
小宇:那我可能会这样
123456/ ...
如果让你来设计网络
你是一台电脑,你的名字叫 A
很久很久之前,你不与任何其他电脑相连接,孤苦伶仃。
直到有一天,你希望与另一台电脑 B 建立通信,于是你们各开了一个网口,用一根网线连接了起来。
用一根网线连接起来怎么就能"通信"了呢?我可以给你讲 IO、讲中断、讲缓冲区,但这不是研究网络时该关心的问题。
如果你纠结,要么去研究一下操作系统是如何处理网络 IO 的,要么去研究一下包是如何被网卡转换成电信号发送出去的,要么就仅仅把它当做电脑里有个小人在开枪吧~
反正,你们就是连起来了,并且可以通信。
第一层
有一天,一个新伙伴 C 加入了,但聪明的你们很快发现,可以每个人开两个网口,用一共三根网线,彼此相连。
随着越来越多的人加入,你发现身上开的网口实在太多了,而且网线密密麻麻,混乱不堪。(而实际上一台电脑根本开不了这么多网口,所以这种连线只在理论上可行,所以连不上的我就用红色虚线表示了,就是这么严谨哈哈~)
于是你们发明了一个中间设备,你们将网线都插到这个设备上,由这个设备做转发,就可以彼此之间通信了,本质上和原来一样,只不过网口的数量和网线的数量减少了,不再那么混乱。
...
Arthas 初探(6)——火焰图
一、前言
profiler 命令支持生成应用热点的火焰图。本质上是通过不断的采样,然后把收集到的采样结果生成火焰图。
目前 profiler 命令还不支持在 Windows 下执行。
12[arthas@18132]$ profiler listAsyncProfiler error: Current OS do not support AsyncProfiler, Only support Linux/Mac.
二、基本使用
profiler 命令基本运行结构是 profiler action [actionArg]
2.1 参数说明
参数名称
参数说明
action
要执行的操作
actionArg
属性名模式
[i:]
采样间隔(单位:ns)(默认值:10’000’000,即10 ms)
[f:]
将输出转储到指定路径
[d:]
运行评测指定秒
[e:]
要跟踪哪个事件(cpu, alloc, lock, cache-misses等),默认是 cpu
2.2 采样
(1)启动 profiler
12[arthas@44]$ prof ...
Arthas 初探(5)——核心命令
一、前言
在本章节中,将学习以下 Arthas 的核心命令,同时我也会附上官方文档的链接,方便大家查阅:
monitor 方法执行监控
watch 方法执行数据观测
trace 方法内部调用路径,并输出方法路径上的每个节点上耗时
stack 输出当前方法被调用的调用路径
tt 记录下指定方法每次调用的入参和返回信息,并能对这些不同时间下调用的信息进行观测
watch/trace/monitor/stack/tt 命令都支持 -v 参数。当命令执行之后,没有输出结果。有两种可能:
匹配到的函数没有被执行
条件表达式结果是 false
但用户区分不出是哪种情况。使用 -v 选项,则会打印 Condition express 的具体值和执行结果,方便确认。
二、monitor
对匹配 class-pattern/method-pattern/condition-express的类、方法的调用进行监控。
monitor 命令是一个非实时返回命令。
实时返回命令是输入之后立即返回,而非实时返回的命令,则是不断的等待目标 Java 进程返回信息,直到用户输入 Ct ...
Arthas 初探(4)——Class 命令
一、前言
在本章节中,将学习以下 Arthas 的 Class 相关命令,同时我也会附上官方文档的链接,方便大家查阅:
sc Search Class 查看运行中的类信息
sm Search Method 查看类中方法的信息
jad 反编译字节码为源代码
mc Memory Compile 将源代码编译成字节码
redefine 将编译好的字节码文件加载到 JVM 中运行
dump 将已加载类的 bytecode 下载到特定目录
classloader 查看 classloader 的继承树,urls,类加载信息
二、sc
sc 是 Search-Class 的缩写,用于查看 JVM 已加载的类信息,这个命令能搜索出所有已经加载到 JVM 中的 Class 信息。
class-pattern支持全限定名,如com.taobao.test.AAA,也支持com/taobao/test/AAA 这样的格式,这样,我们从异常堆栈里面把类名拷贝过来的时候,不需要在手动把 / 替换为 .
sc 默认开启了子类匹配功能,也就是说所有当前类的子类也会被搜索出来,想要精确的匹配,请打开 op ...
Arthas 初探(3)——JVM 命令
一、前言
在本章节中,将学习以下 Arthas 的 JVM 相关命令,同时我也会附上官方文档的链接,方便大家查阅:
dashboard 仪表板,可以显示:线程,内存,堆栈,GC,Runtime 等信息
thread 显示线程的堆栈
jvm 显示 JAVA 虚拟机信息
sysprop 显示 JVM 中系统属性,也可以修改某个属性
sysenv 显示 JVM 中系统环境变量配置信息
vmoption 显示 JVM 中选项信息
getstatic 获取类中静态成员变量
ognl 执行一条 ognl 表达式,对象图导航语言
二、dashboard
显示当前系统的实时数据面板,按 q 或 ctrl+c 退出。
2.1 数据说明
列名
描述
ID
Java 级别的线程ID,注意这个 ID 不能跟 jstack 中的 nativeID 一一对应
NAME
线程名
GROUP
线程组名
PRIORITY
线程优先级, 1~10之间的数字,越大表示优先级越高
STATE
线程的状态
%CPU
线程消耗的 CPU 占比,采样 100ms,将所有线程在这 100 ...
Arthas 初探(2)——基础命令
一、前言
在本章节中,将学习以下 Arthas 的基础命令,同时我也会附上官方文档的链接,方便大家查阅:
help、cls、session、version、history、quit、stop
cat 显示文本文件内容
grep 对内容进行过滤,只显示关心的行
pwd 显示当前的工作路径
reset 重置 arthas 增强的类
keymap 显示所有的快捷键
二、基础命令
2.1 help、cls、session、version、quit、stop
(1)help
查看命令帮助信息。
(2)cls
清空当前屏幕区域。
(3)session
查看当前会话的信息。
12345[arthas@8452]$ session Name Value-------------------------------------------------- JAVA_PID 8452 SESSION_ID 1434a3fe-8bbe-44ad-90d8-1a0bf2c7e461
(4)version
输出当前目标 Java 进程所加载的 Arthas 版本号。
12[art ...
Arthas 初探(1)——快速入门
一、前言
早就听闻阿里开源的 Arthas 在做 Java 应用诊断上十分牛逼,身边也有很多同事在使用,因此决定开一个坑,自己从零学习下这个工具的使用,本系列使用的版本是当前最新版 3.4.5。
由于 Arthas 经过这么长时间的发展,本身文档、在线教程已经十分健全了,同时还有第三方的 IDEA 插件、许多教学视频去帮助我们入门使用,因此这个系列的文章定位是个人笔记,而并非教程,希望不要误人子弟。
二、概述
https://arthas.aliyun.com
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
是否有一个全局视角来查看系统的运行状况?
有什么办法可以监控到JVM的实时运行状态?
怎么快速定位应用的热点,生成火焰图?
使用 Arthas 需要 JDK 版本在 1 ...
详解 JDK 常用监控工具
一、JVM 参数
JVM 参数类型主要分为标准参数、X 参数、XX 参数三类。
(1)对于标准参数,在 JVM 的各个版本中基本是不变的,相对是比较稳定的。例如 -help、-version、-server、-client 等。
(2)X 参数是非标准化参数,在不同的 JVM 版本中可能会发生变化。例如:
-Xint:完全解释执行,不编译成本地代码
-Xcomp:第一次使用就编译成本地代码
-Xmixed:混合模式,JVM自行决定是否编译成本地代码(默认模式)
(3)XX 参数是我们使用最为经常的参数,它也是非标准化参数,主要用于 JVM 调优和 Debug。它分为 Boolean 类型和键值对类型。
123Boolean 类型格式:-XX:[+-]<name> 表示启用或禁用 name 属性例如:-XX:+UseConcMarkSweepGC
123键值对类型格式:-XX:<name>=<value> 表示 name 属性的值是 value例如:-XX:MaxGCPauseMillis=500
各大 JVM 的相关参数可以到这个网站去查询: ...