java内存泄露的排查思路?CPU飙高排查方案与思路?

java内存泄露的排查思路?
1.通过工具, VisualVM去分析dump文件,VisualVM可以加载离线的dump文件
2.idea-->文件-->装入--->选择dump文件即可查看堆快照信息
3.通过查看堆信息的情况,可以大概定位内存溢出是哪行代码出了问题
4.找到对应的代码,通过阅读上下文的情况,进行修复即可

CPU飙高排查方案与思路?
1.使用top命令查看占用cpu的情况
2.通过top命令查看后,可以查看是哪一个进程占用cpu较高,上图所示的进程为:40941
3.查看进程中的线程信息,通过以上分析,在进程40941中的线程40950占用cpu较高

1.使用top命令查看占用cpu的情况
2.通过top命令查看后,可以查看是哪一个进程占用cpu较高
3.使用ps命令查看进程中的线程信息
4.使用jstack命令查看进程中哪些线程出现了问题,最终定位问题

怎么快速定位系统的瓶颈?

压测(性能测试),项目上线之前测评系统的压力
监控工具、链路追踪工具,项目上线之后监控
线上诊断工具Arthas(阿尔萨斯),项目上线之后监控、排查
压测(性能测试)

监控工具、链路追踪工具
线上诊断工具Arthas(阿尔萨斯)

灵活使用设计模式:单例,工厂,策略,责任链,模板方法
工厂方法模式:简单工厂,工厂方法,抽象工厂
策略
责任链

开闭原则

JVM由哪些部分组成,运行流程是什么?

虚拟机栈,本地方法栈,程序计数器,本地内存
堆:年轻代,老年代,方法区/永久区,(当堆中没有内存空间可分配时抛出oom error异常)

java源码-->java class-->类加载子系统(字节码)
运行数据区:把字节码加载到内存:method area/matespace方法区/元空间, heap,pc register
字节码翻译为底层系统指令:解释器,JIT即时编译器,GC垃圾回收

1.什么是程序计数器?
程序计数器:线程私有的,每个线程一份,内部保存的字节码的行号。用于记录正在执行的字节码指令的地址。

2.你能给我详细的介绍Java堆吗?
线程共享的区域:主要用来保存对象实例,数组等,内存不够则抛出OutOfMemoryError异常。
组成:年轻代+老年代
年轻代被划分为三部分,Eden区和两个大小严格相同的Survivor区
老年代主要保存生命周期长的对象,一般是一些老的对象
Jdk1.7和1.8的区别
1.7中有有一个永久代,存储的是类信息、静态变量、常量、编译后的代码
1.8移除了永久代,把数据存储到了本地内存的元空间中,防止内存溢出

3.什么是虚拟机栈
每个线程运行时所需要的内存,称为虚拟机栈,先进后出
每个栈由多个栈帧(frame)组成,对应着每次方法调用时所占用的内存
每个线程只能有一个活动栈帧,对应着当前正在执行的那个方法

垃圾回收主要指就是堆内存,当栈帧弹栈以后,内存就会释放

栈内存分配越大越好吗?
未必,默认的栈内存通常为1024k
栈帧过大会导致线程数变少,例如,机器总内存为512m,目前能活动的线程数则为512个,如果把栈内存改为2048k,那么能活动的栈帧就会减半

简单一句就是:如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾,如果定位了垃圾,则有可能会被垃圾回收器回收。
如果要定位什么是垃圾,有两种方式来确定,第一个是引用计数法,第二个是可达性分析算法

posted @ 2024-01-22 17:59  大树2  阅读(259)  评论(0编辑  收藏  举报