单机限流(限流算法及隔离策略视频
4.5.2 低入侵限流框架设计与实现视频
代码:
【技术分享】OOM问题解决与优化回放6月28日 20:00—22:00
JVM调优方向: 内存、CPU资源
1.内存大小 (经验:70%~80%)
最大 == 最小
-XX:+AlwaysPreTouch 启动时候让操作系统 真正分配给JVM
性能测试 – 预热
2.内存使用和回收
内存 = 二进制数组 = INT = 4byte = 32bit
[00000000 00000000 00000000 00000000]
GC-->STW【JVM角度理解】-->GC线程--我们的JVM用户线程有暂停
运行时数据区 -【线程栈(方法栈针,本地变量表)-堆】
优化--->**减少GC次数!!!**--- 【新生代eden没空间、老年代满了】--
主要参数:ParallelGC、G1
【单次最大STW时间】-XX:MaxGCPauseMillis=
减少GC的STW耗时--比较困难--JVM研发去做---垃圾回收器 选型
3.逃逸分析 && 栈上分配
逃逸分析(-XX:-DoEscapeAnalysis)不生效时:655毫秒
生效时:10毫秒
逃逸分析:多线程下,变量是否可以被其他线程用
对象创建:
1.堆stack --> 多线程环境下,线程去创建对象时,怎么能保证JVM创建的对象在堆内存地址不冲突?
[TLAB]thread local allocation buffer:每个线程,都可以自己分配堆空间
2.线程栈【线程独享】
逃逸分析失效:
1.如果返回的VO对象中,包含ArrayList。失效!因为JVM不清楚ArrayList需要占用多少内存
2…需要百度
优化点:创建对象 占用内存–线程栈–注意:对象里边能不能分配到栈上(对象有动态调整大小的集合是,不会进行栈上分配)
4.防止GC产生 高并发、低延迟(不同维度)
新生代GC 回收范围比较小—>减少FullGC
案例:
网易---->云课堂后端运营系统---->监控系统---->时不时出现大量FullGC
代码:
jxl处理execl
***哪里触发?***–>代码 预防 system.gc显示调用
如何定位–open jdk 工具 Btrace
1.btrace工具
2.编写脚本
3.执行脚本 监测
搞定!
5.堆外内存
1.堆外-XX:MaxDirectMemorySize 和元数据空间 无关(虽然都会放在堆外)
日志太少,很难分析
代码实例:
OOM分析、处理
1.【最常见最需要预防】java.lang.OutOfMemoryError: Java heap spacd
场景:【堆空间放大石头,放不下】
内存泄漏—导致内存溢出的原因
生产环境必须配置:
-XX:+HeapDump0nOutOfMemoryError
-XX:HeapDumpPath=/temp.2020.hprof
【定位】–>根据大对象 -->找到GC引用关系【GCRoot】–> 找到存储的容器集合【线程】
定位方法:
2.java.lang.OutOfMemoryError: GC overhead limit exceeded
场景:【堆空间放沙子,放不进,导致GC,但是GC效率低,就抛出】
当GC花费了程序运行总时间的98%以上,而回收不到2%的堆,则抛出该异常。
3.java.lang.OutOfMemoryError: Metaspace
场景:【热加载,JAR包很多】
元数据空间class信息–>报错调大,如果是动态创建类,注意不需要的类有没有卸载掉。
4.java.lang.OutOfMemoryError; unable to create new native thread
线程 也是操作系统的资源
JAVA —>JVM---->OS---->创建本地线程(内存、进程线程的数量限制)
不同的操作系统,不同的表现
5.java.lang.OutOfMemoryError. Requested array size exceeds VM limit
超过数组的最大长度限制
6.java.lang OutOfMemoryerror: Direc buffer memory
堆外-XX:MaxDirectMemorySize 和元数据空间
【结合业务场景定位:文件操作、网络操作】
1.找到谁在用对外内存–btrace工具 跟踪 ByteBuffer.allocateDirect
2.具体的占用情况【spring解析jar包、nio File、netty、tomcat…】泄露 慢慢的占满---->谁占用的比较多
默认JVM---->操作系统 内存分配 函数
谷歌有一个工具—>偷天换日 换掉 OS内存分配工具[gperftools]
7.Out of swap space
JAVA总内存大于可用物理内存
交换空间-操作系统 内存 交换到硬盘
8.操作系统OOM Killer
来自网易内部wiki记录 --考拉?严选?
如果发现JVM进程突然不见了,没有任何应用日志,请排查操作系统日志里边是否有 kill关键字
操作系统的保护机制,在操作系统内存申请的函数说明里面有写:*** man malloc***
liunx内存分配默认策略:
1.申请后不代表真正的分配,导致程序申请到的内存大于可用内存
2.当使用的时候,采取分配。如果出现不够用,选择一个或者多个进程kill
【重点】在哪里可以看见–这种情况会记录在操作系统日志 *** /var/log/messages***
导致OS kill java process