fullGC:
jdk1.8之前:jmp指令
jdk1.8以后,通过一个管理的bean,com.sun.management.type =diagnosticComman,gcClasshistory,主要用于生成堆中类的直方图,生成之前会触发一次fullGC
oom:
堆内内存溢出、堆外内存溢出bytebuffer.allocateDirect,
堆内内存溢出: manageFactory.getMeanBean();
最大堆内存,已经使用的内存,剩余的堆内存,
cpu满载:
创建一个固定数量的线程池
==========================================
=============================================
触发器:用来控制窗口什么时候触发计算
水位线:用来衡量事件时间进展的标记我们称之为水位线,Flink中的水位线,其实是流处理中对低延迟和结果正确性的一个权衡机制,而且把
控制的权力交给了程序员,我们可以在代码中定义水位线的生成策略
WatermarkStrategy.forMonotonousTimestamps()
WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(10));
在水印产生时,设置一个乱序容忍度,推迟系统时间的推进,保证窗口计算被延迟执行,
为乱序的数据争取更多的时间进入窗口。
WatermarkStrategy.forBoundedOutOfOrderness(Duration.ofSeconds(10));
数据迟到“
window(TumblingEventTimeWindows.of(Time.seconds(5)))
.allowedLateness(Time.seconds(3))
注意:
允许迟到只能运用在 event time 上
使用侧流接收迟到的数据
.windowAll(TumblingEventTimeWindows.of(Time.seconds(5)))
.allowedLateness(Time.seconds(3)) // 推迟3s关窗
.sideOutputLateData(lateWS) // 关窗后的数据放入到侧输出流
flink的容错机制和checkpoiont检查点
Flink的Watermark机制可解决哪些问题?
Flink的Watermark机制可解决乱序事件处理和延迟数据处理的问题。通过设置适当的水印来处理乱序事件和等待延迟的数据,从而使数据处理更加准确和完整
======================
作业管理器(JobManager)
JobManager是一个 Flink集群中任务管理和调度的核心,是控制应用执行的主进程。也就
是说,每个应用都应该被唯一的 JobManager 所控制执行。
(1)JobMaster
(2)资源管理器(ResourceManager)
(3)分发器(Dispatcher)
任务管理器(TaskManager)
===================================
es中存储一段文本,分词,词项,id、词项索引,doc values ->segment 段合并的操作,luncy底层存储
=======================================
倒排索引 词项字典 词项索引 列式存储(doc value)
segment 构成搜索的最小单元, 查询数据的时候并发查询多大个segment,
间隔一段时间可以进行段合并,开源搜索库luncy
es检索数据时候,数据存贮在不同的分片上,怎么查询的?
一致性算法raft
=====================
索引有什么不好的?
索引的创建和更新需要耗时,占用资源
索引占用存储资源
索引加快查询速度,降低表更新的速度
============================
leo:每个副本的最后一个offset,其实就是最新的offset+1;
hw:所有副本中最小的leo
混沌工程分3部分:
1、故障注入(场景有哪些) 爆炸半径:流量来源、流量类型、特定用户
2、自动化指标分析,app维度配置接口的响应 + 问题(柳叶刀分险治理) + 预案平台
3、混沌演练模型:测试演练、强弱依赖演练、攻防演练 、客户端演练
java应用故障:延迟、异常、篡改数据
jvm故障:内存溢出 GC Cpu满载
集群故障:es集群、redis延迟、不可用、读延迟、写延迟 hbase
http pigeonCall、pigeonService
MessageListenerConcurrent consumerMessage
MessageListenerOrder doBizConsumer
redis jedis.connection:sendCommand
mysql: prepareStatement
pigeonCall:ContextPrepareInvokeFilter
pigeonService:businessProcessFilter
空间复杂度:一般也使用大
O
O
O 表示法来衡量:一个算法执行随数据规模增大,而增长的额外空间成本
时间复杂度:是用来衡量:一个算法的执行,随数据规模增大,而增长的时间成本
数据结构:数据的组织、管理和存储格式。
二分法:1、常规的 2、right一定不是查找目标
流量录制回放:
首先需要创建一个录制模板
录制基本信息:对于哪个应用、接口采集,执行时长等
采集配置:http接口,dubbo接口,java方法,配置采样率(万分之n)
执行录制:
填写执行机器信息:ip、端口、用户名、密码
录制执行列表
执行编码,环境、执行状态,agent状态,采集总量,
若线上录制的接口有流量,那么列表中会有记录,点击详情可以
看请求参数(请求头、param) 响应体,子调用详情(插件支持的)
子调用点击:可以看自调用的入参、出餐、参数类型
流量回放:回放列表和录制执行之后操作栏,
回放选择哪条流量,回放机器(ip、端口、账号、密码)
回放列表:
回放traceId、录制traceId,回放时间、回放结果
查看回放详情:
展示回放响应和录制响应结果比对
子调用结果比对
回放失败
单条流量回放失败,主要有以下几种失败原因:
结果对比失败、子调用未匹配、子调用入参对比失败
子调用入参对比失败
指子调用参数比对存在问题,回放结果异常。
特别说明的是,回访时只对子调用参数进行比对;若参数匹配一致,则对于子调用进行mock,返回录制时记录的结果
回放结果路径忽略(JSONPATN.EVAL)
jvm调优:
性能指标: 响应时间,吞吐量和资源利用率
web原生组件的注入方式:
@webServlet @webFilter @Listener
@ServletComponentScan()
spingboot启动时候有很对容器,默认tomcat jetty 或者underTow,具体选择哪个web服务器的包是有
servletwebServerFactoryAutoConfigure中决定的
ErrorMvcAutoConfiguration 给容器中导入:defaultErrorAtrribute baseErrorControl ErrorPageCustomer
当请求是4xx或者5xx时候,请求会进入到ErrorPageCustomer处理,将请求进行转发/error请求,
baseErrorControl会进行处理,如果要自定义响应属性,可以使用defaultErrorAttribute中进行参数封装。
对于程序员自定义异常:
(1)@ControllerAdvice + @ExceptionHandle 底层支持组件是ExceptionHandleExceptionResolve
(2)写一个类 A excends Exception ,标注@ResponseStatus(value=Httpstatus.forbidden,reason=“用户数量太多”)
(3)或者public class A extends ResponseStatusException
springbootApplication
springbootConfigure
enableAutoConfigure
CompantScan
ImportResource(“classpath:bean.xml”)
@ConfigurePropertis(prefix=“demo”)
@EnableConfigurePropertis(A.class) // 让配置了ConfigurePropertis注解的propertis文件生效
垃圾收集器:CMS
初始标记 、并发标记 、重新标记、并发清除
新生代采用复制算法、老年代采用标记整理算法
单cpu或者小内存,单机程序:-XX:+UseSerialGC
多cpu,需要最大吞吐量,计算型应用 :-XX:+UseParallelGC
多cpu,追求低停顿时间,需要快速响应,如互联网应用, -XX:+UseConcMarkSweepGC
以前收集器的特点
年轻代和老年代是各自独立且连续的内存块
年轻代收集使用单eden + S0 + S1 进行复制算法
老年代收集必须扫描珍整个老年代区域
都是以尽可能少而快速地执行GC为设计原则
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是残阳的时间间隔数(单位秒),第二个参数是采样的次数
procs
r:运行和等待的CPU时间片的进程数,原则上1核的CPU的运行队列不要超过2,整个系统的运行队列不超过总核数的2倍,否则代表系统压力过大,我们看蘑菇博客测试服务器,能发现都超过了2,说明现在压力过大
b:等待资源的进程数,比如正在等待磁盘I/O、网络I/O等
cpu
us:用户进程消耗CPU时间百分比,us值高,用户进程消耗CPU时间多,如果长期大于50%,优化程序
sy:内核进程消耗的CPU时间百分比
vmstat -n 2 4 vmstat是一个用于监控虚拟内存、进程、CPU 活动等系统性能信息的工具。
us sy
用户进程消耗cpu的百分比和系统消耗cpu的百分百
mpstat -p ALL 2
mpstat是一个用于查看处理器相关统计信息的命令 mpstat是一个查看cpu相关信息的指令
-p ALL选项表示要显示所有 CPU(处理器)的统计信息。
如果不使用这个选项,默认可能只显示总的 CPU 统计信息或者第一个 CPU 的信息。
2表示采样间隔为 2 秒。也就是说,mpstat命令会每隔 2 秒收集并输出一次 CPU 的统计信息。
每个进程使用CPU的用量分解信息:pidstat -u 1 -p 进程编号
iostat -xdk 2 3
磁盘块设备分布:
rkB /s:每秒读取数据量kB;
wkB/s:每秒写入数据量kB;
svctm I/O:请求的平均服务时间,单位毫秒
await I/O:请求的平均等待时间,单位毫秒,值越小,性能越好
util:一秒钟有百分几的时间用于I/O操作。接近100%时,表示磁盘带宽跑满,需要优化程序或者增加磁盘;
rkB/s,wkB/s根据系统应用不同会有不同的值,但有规律遵循:长期、超大数据读写,肯定不正常,需要优化程序读取。
svctm的值与await的值很接近,表示几乎没有I/O等待,磁盘性能好,如果await的值远高于svctm的值,则表示I/O队列等待太长,需要优化程序或更换更快磁盘
jstak run block waitingforxx
thread nid 7788(十六进制)
===============================================================================================================================================================================================
jstack:java堆栈跟踪工具,用于生成jvm某一时刻的线程快照,定位程序死锁、死循环等。
deadlock bolck watingformonitor
jstack保存的是十六进制的pid
线程池:降低资源消耗:通过重复利用线程池中的对象,降低线程创建或者销毁时候的资源损耗
提高响应速度
如果破坏双亲委派:
集成classLoad 重新loadClass方法,
java堆区从GC角度: 年轻代(eden区 ; service0 ; service1区)
常见垃圾回收算法:
1、复制算法:GC回收的角度,新生代:eden from to
2、标记清除算法:从GCroot开始,根节点可达性分析,标记处所有可达的对象,没有标记的对象就是要被清理的对象,
清理阶段:将未被标记的对象清除,释放内存空间,产生内存碎片
3、标记压缩算法:将存活的对象往堆内存的一端移动,清除掉不在边界内的对象
4、分代收集:基于对象的存活周期将堆内存划分为不同的代,一般分为新生代(Young Generation)和老年代(Old Generation),有的还会细分出永久代(Permanent Generation,在 Java 8 及以后被元空间(Metaspace)取代)。
新生代:新创建的对象通常会分配到新生代,这里的对象生命周期短,通常采用复制算法进行垃圾回收,因为大部分新对象很快会成为垃圾,复制成本相对较低。
老年代:存活时间较长的对象会被移到老年代,这里的对象回收频率低,通常采用标记 - 整理算法,因为老年代的对象较多且存活对象比例相对较高,采用标记 - 整理算法可以更好地利用内存空间
GCroot
虚拟机栈,栈帧中的局部变量中引用的对象
方法区中的静态属性引用的对象
方法区中的常亮引用的对象
本地native方法引用的对象
jvm调优
1、参数 基本出现 java -version /help
2、xx参数,xx:±printGCdetail
3、xx参数:xx:printGcdetail=1024000
jps -l 找到java应用进程
jvm中常见的参数:
-XX:MaxTenuringThreshold
-XX:NewRatio(了解)
-XX:SurvivorRatio
-XX:PrintGCDetails
jinfo -flag MaxTenuringThreshold pid
元空间:
元空间就是我们的方法区,存放的是类模板,类信息,常量池等
Metaspace是方法区HotSpot中的实现,它与持久代最大的区别在于:Metaspace并不在虚拟内存中,而是使用本地内存,也即在java8中,class metadata(the virtual machines internal presentation of Java class),被存储在叫做Matespace的native memory
永久代(java8后背元空间Metaspace取代了)存放了以下信息:
虚拟机加载的类信息
常量池
静态变量
即时编译后的代码
模拟Metaspace空间溢出,我们不断生成类 往元空间里灌输,类占据的空间总会超过Metaspace指定的空间大小
cpu使用率过高
top
top -Hp pid
线程是十进制的,需要转成十六进制
jstack pid
github
cc starts:>5000
乐观锁通过版本号机制
set user version = version + 1, where version = #{version}
volatile保证可见性:总线嗅探技术,各个cpu通过嗅探总线上的数据,来更新工作内存中的缓存数据,大量的嗅探会导致带宽占满。 不保证原子性 、禁止指令重排
jmm内存模型本身是一种抽象的概念,并不真实存在,它描述的是一组规则或者规范,通过这个规范定义了程序中各个变量的访问方式
禁止指重排:通过插入内存屏障又称内存栅栏,它是一个cpu指令,保证特定草的禁止内存屏障前后的指令进行重排序
编译器优化 内存系统 并行指令的重拍
CAS:compare and swaper: cpu并发源语,标识的是判断内存中某个位置的值是否为预期值,如果是预期值就替换为新值,否则不替换,比较和替换过程是原子性的
底层接触unsafe类,:java无法操作内存数据,unsafe相当于一个后门,操作特定的内存数据,
threadlocal是用来提供线程的内部的一个局部变量,在多线程情况下,保证各个线程内部的变量的相互独立性,侧重的是各线程之间变量的隔离
thredlocald.get()
<Thread,Value> thredlocal
从Java官方文档中的描述:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get和set方法访问)时能保证各个线程的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程上下文。
我们可以得知 ThreadLocal 的作用是:提供线程内的局部变量,不同的线程之间不会相互干扰,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或组件之间一些公共变量传递的复杂度。
==========================================================================================================================================
java -javaagent:myagent.jar -jar AgentTest.jar
改变字节码、新增jar包、替换class
ClassfileTransform
ClassDefinition
retransformClasses
javassist是一个分析编辑和创建字节码的类库
混沌工程:分3部分
chaosblade-exec-jvm
1、理论,简易->复杂迭代 阿里、
2、如何落地:
1、故障注入,注入故障有哪些?多个故障怎么编排,会不会误伤(爆炸半径)
2、自动化指标分析怎么做的(通过自动结果验证和稳定性验证推动业务解决分险,落地 ,
- 解决方法:
故障简述,故障回放,根因分析,后续action
3、抽象出的混沌演练模型(强弱依赖演练、核心链路演练、客户端演练、攻防演练
netfix 系统稳定性之道
混沌工程主动制造故障,并根据系统在各种压力下的情况,确定优化策略的一种系统稳定性保障手段。
简单来说就是制造故障,发现问题,版本优化、规避分险
redis为什么快: io多路复用和非阻塞式io,瓶颈:内存和网络,不是cpu
将用户socket对应的文件描述符注册进epoll函数,epoll函数会监听哪些socket上面有消息到达
helploglog
bitmap:位图,setbit key offset value
geo :经纬度 8 公里内的数据,前10名
geoRadius
nextTick中的代码会在DOM更新后执行。
nextTick,setInterval,
v-enter
v-enter-active
v-enter-active
v-leave
v-leave-active
v-leave-to
vuex
vueComponent—>dispatch —》actions --》commit 》mutations —>mutate ----》state
jvm调优:
调优:响应时长、吞吐量、资源利用率
jstat:查看jvm各种内存运行情况,堆内存使用情况,gc情况等。
jmap:生成堆内存快照,用于分析内存使用情况和对象分布