JVM学习

一、JVM是什么

二、JVM组成部分

三、各组成部分介绍

1.程序计数器

2.堆

jdk7和jdk8堆的区别

3.栈

垃圾回收是否涉及栈内存

局部变量是否线程安全

栈内存溢出

4.堆栈的区别

1.堆和栈是两种不同的数据结构

栈是一种先进后出的数据结构,堆的数据结构是二叉树

5.方法区

四、类加载器

一般用前三种,自定义加载器用的较少

1.双亲委派机制

2.为什么采用双亲委派机制

3.类加载的全过程

加载

验证

准备

解析

初始化

使用

卸载

五、垃圾回收

1.什么时候被回收

2.定位垃圾两种方式

引用计数法

循环引用,内存泄漏

可达性分析算法

3.垃圾回收算法

4.分代回收

5.垃圾回收器(4种)

6.强引用、软引用、弱引用、虚引用

六、JVM实践

1.什么情况使用JVM调优

内存使用率过高,出现OOM溢出,首先排除代码问题(1.创建了大量的对象,比如死循环创建对象;2.有一些大对象(sql查询未做分页,都放到list中);3.出现内存泄漏,对象不能被GC回收),其次可以调整堆或原空间的大小

stw时间太长,可以考虑换一个垃圾回收器

频繁的full gc,1.可以考虑调整老年代大小;2.调整年轻代大小:系统一次加载过多数据到内存(比如sql查询未做分页),导致大对象进入了老年代;3.内存泄漏导致

2.调优设置

3.参数设置

垃圾回收器

4.调优命令、工具

jmap -heap pid查看堆内存信息

jmap -histo pid查看堆中对象的统计信息:对象数量、占用内存大小

jmap -histo:live pid只计算活动的对象

jmap -dump:[live,]format=b,file=

生成Java虚拟机的堆转储快照dump文件。具体说明如下:

live参数是可选的,如果指定,则只转储堆中的活动对象;

format=b表示以hprof二进制格式转储Java堆的内存。

file=<filename>用于指定快照dump文件的文件名。

jstat -gc pid 5000(5秒查看一次)用于查看JVM中堆的垃圾收集情况的统计

5.内存泄漏排查(内存飙高)

内存泄漏产生原因

像数据库连接,IO,Socket等连接,需要调用close方法关闭连接,只有连接被关闭后,GC才会回收对应的对象。

怎么排除

jstat查看垃圾回收情况

GC之后垃圾正常回收,可能就是别的一些原因(比如并发量突然高了),如果没有回收掉老年代的垃圾,可能产生内存泄漏。

jmap命令查看占用内存大的对象

dump文件

6.CPU飙高排查

死循环会导致CPU飙高

7.OOM后程序是否挂了

OOM程序没有挂,只是当前线程挂了,其他线程还能不能运行,取决于OOM的进程内存有没有回收,比如:全局变量是bean所持有的,程序不关就一直存在,内存就不会释放

如果是成员变量,OOM后则会释放内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值