java学习系列 jvm必知必会
jvm的java的关键知识点,对于线上查问题和性能调优都是必须要熟练运用jvm。
特此整理一些必须了解的JVM的知识点,大多是基于自己的基础上和网上一些资料整理的。
参考blog
https://www.cnblogs.com/shenjianjun/p/9512949.html
https://www.processon.com/special/template/5cff7021e4b0a65d8095dca3#map
https://www.cnblogs.com/lfs2640666960/p/9297176.html
然后详细解释一下一下这些问题。
1、线上部署时出现内存溢出该如何处理
第一步:top查看当前进程的内存占用情况,然后shift+M安装内存占用情况进行排序,查看占用内存比较大的进程。
第二步:利用jstat查看虚拟机的gc情况 todo
#jstat命令详解
第三步:生成dump文件,通过dump文件查看当时内存对象相关的信息
生成dump文件的两种方式
1、使用jmap命令直接生成:jmap -dump:format=b,file=heap.prof 17561
format=b 表示生成二进制类型的dump文件;
file= 后面写的四输出的dump文件路径;
1756 jvm进程ID;
详细操作请参考jmap生成dump文件
2、todo
第四步:使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码
2、Java中堆和栈的内存区别
JVM内存的划分有五个
1. 寄存器
2. 本地方法区
3. 方法区
4. 栈内存
5. 堆内存
栈内存
:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。
堆内存
:存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。
具体详情请看java中堆和栈
3、JVM 内存划分与垃圾收集算法:fullGC与youngGC
4、JVM内存溢出的几种情况
5、线上如何排查JVM内存溢出问题
6、服务器CPU占用特别高,怎么查看
7、JVM为什么要增加元空间
8、Java如何查看问题,并进行jvm调优
9、G1垃圾收集器解释和特点
10、在不同情况下怎么选取垃圾回收器
11、jvm内存模型以及详解
12、class初始化过程
13、类加载模型和双亲委派机制
14、没有使用双亲委派模型的地方
15、java的各种常量池
16、jps、jstat、jinfo、jmap、jstack、jconsole、jprofile命令详解
17、java如何实现反射
18、java如何实现lambda表达式
19、JVM的逃逸分析
20、Java的线程栈
21、类的实例化顺序
22、JVM 中一次完整的 GC 流程
23、OOM错误,*错误,permgen space错误
上一篇: Java中一个类怎么实现两个接口中相同名字的抽象方法
下一篇: Java中数组的定义与使用(一)