新鲜出炉!花了三天整理的JVM复习知识点,面试突击必备!
此次JVM知识点包含以下几个部分
1.类加载机制
2.jvm运行时数据区
3.java对象内存布局
4.jvm内存模型
5.垃圾回收机制
6.垃圾收集器
7.问题排查
一 类加载机制
主要说的部分是这一块

那么如何装载呢,这就谈到了咱们的双亲委派机制,简单来说就是类,向上递交,向下加载,源码和图如下
if (parent != null) {
c = parent.loadClass(name, false);
} else {
//由于BootstrapClassLoader是C++写的,在java中被视为null
c = findBootstrapClassOrNull(name);
}

那么装载的过程是什么呢,如图

装载干了啥呢,大白话说就是一个你把一个java文件转换成二进制给jvm处理,官方一点的语言就是:
①通过一个类的全限定名获取这个类的二进制字节流。
②将这个字节流的静态存储结构转换为方法区的运行时数据结构。
③在堆中生成一个这个二进制字节流的Class对象作为访问入口。
那么链接呢,验证:字面意思,准备:赋默认值,解析:符号引用转换为直接引用
二 运行时数据区
话不多说,看法宝,上图

方法区
存放:静态变量,常量,即时编译的class文件,类信息。
区别:1.8之前叫Perm Space 永久代,现在叫Meta Space 元空间
虚拟机栈
存放:栈帧;即方法的调用,-Xss可以设置栈大小,默认1M;使栈溢出的使递归。
构成:局部变量表;方法中定义的变量与方法的参数,
操作数栈;压栈出栈存放数据的地方,
动态链接;这个的作用就是知道谁调用的,比方说java中的多态,最后会知道具体是哪个类,
方法返回地址;字面意思
堆
存放:对象及数组
接下来咱们看一下这个指针指向问题
栈指向堆; 栈帧(方法中有一个变量)即 Object obj = new Object();
方法区指向堆;静态变量,private static Object obj = new Object();
堆指向方法区;由于方法区中存放的类信息,所以对于多态如何识别,这一点,就说明堆中有指向方法区的指针。
三 java对象内存布局

四 jvm内存模型

内存模型可以认为是运行时数据区的落地,那么当一个对象来的时候,如何分配内存空间呢
首先放入Eden区,看够不够,不够,minorGC,再试试Survivor是否足够,如果不够;
放入老年代看看够不够,不够就来一次Full GC(minorGC+MajorGC);
如果还不够就OOM了。
那么对象进入老年代的条件是什么呢
新生代中年龄大于15;
大对象(-XX:PretenureSizeThreshold 配置这个,大于这个数的就成为大对象)
动态年龄:即survivor区中 同一年龄的超过了该区一半,那么大于等于该年龄的对象直接进入老年代
minorGC,新生代放不下的时候
那么这里边放了这么对象,该如何回收呢
五 垃圾回收机制
什么是垃圾,如何确定垃圾呢
引用计数法
没有任何指针指向的就是垃圾,但是无法解决循环引用的问题
可达性分析
由GCRoot(静态成员,Thread线程,虚拟机栈的变量表,本地方法栈中的变量,类加载器,常量)作为头,向下顺藤摸瓜,能摸得到的就是好瓜,摸不到的就回收扔了。
既然已经确定了垃圾,那么如何回收呢
四种垃圾回收算法
标记-清除:将标记的清除掉,弊端就是内存不连续,容易产生内存碎片;
复制:内存分两块,将一端复制到另一端,解决了内存不连续,弊端就是内存有效区只由一半;
标记-整理:将垃圾回收后压缩整理一下,解决了内存有效区只有一半的问题;
分代算法:个人认为这个属于一种思想,即对前三种的一种总结;老年代用标记清除,标记整理,新生代用复制
算法说完了,那么算法的落地,如何实现的呢,这就要说到垃圾收集器了
六.垃圾收集器

可以看到从刚开始的Serial到现在的G1乃至ZGC的最多10ms停顿可以看到java一直在寻找最短的停顿时间,这个也是一直优化的方向。
并行收集:多个线程一起收集
并发收集:跟用户线程一起跑
CMS和G1的区别有哪些呢?
CMS,四个步骤为,初始标记-并发标记-重新标记-并发清理
G1,四个步骤,初始标记-并发标记-最终标记-筛选回收(对各个Region的回收价值进行排序根据用户期望的GC停顿时间制定回收计划)
G1可以设置停顿时间(-XX:MaxGCPauseMillis=20),就是因为他的Region,可以理解为一面墙分成了多个砖头,一些砖头的集合称为老年代,一些称为新生代。
这些都知道了,那么出现错误该如何排查呢
七 问题排查
1.频繁FullGC
导致频繁FullGC的原因有
System.gc()
jmap -dump:format=b,fifile=heap.hprof PID
老年代内存不够
步骤
打印FullGC前后的日志 -XX:+HeapDumpBeforFullGC -XX:+HeapDumpAfterFullGC -XX:+HeapDumpPath=a.prof
使用MAT工具进行分析,可以看堆中占用情况,以及class的新建情况。
2.线上CPU负载过高排查
采用TOP命令,查出占用cpu最高的java应用
top -Hp PID查询出占用cpu最高的线程
找出该线程ID,转换成16进制 printf "%x\n" tid
jstack PID > d.txt
打开d.txt,查询该16进制的tid就能找到了
3.吞吐量调优
使用命令打印出gc.log -XX:+PrintGCDetails -Xloggc:gc.log
使用gcviewer来分析日志
根据具体情况调整堆栈大小,停顿时间等参数,再看gcviewer分析出来的数据如何。
4.死锁排查
使用 java bin目录下自带的visualVM工具,可远程链接可本地链接
连接之后,点击线程一栏,便会出现红字 发现死锁
点击旁边的Dump按钮即可进入dump文件中,往下翻即可看到提示的哪一行出现了死锁,然后定位到代码
新鲜出炉!花了三天整理的JVM复习知识点,面试突击必备!的更多相关文章
- 新鲜出炉!2020年最新java面试题大全,面试突击必备!
前言 发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了一套Java面试题,希望对大家有帮助哈~ 打算这几天每天更新15~20题.(这样有助于你们阅读和理解!)我们先从简单的开始 1 ...
- 新鲜出炉的30个精美的 jQuery & CSS3 效果【附演示和教程】
新鲜出炉的30个精美的 jQuery & CSS3 效果[附演示和教程] 作为最流行的 JavaScript 开发框架,jQuery 在现在的 Web 开发项目中扮演着重要角色,它简化了 ...
- 微信小程序开发视频教程新鲜出炉
微信小程序开发公测了,可是对于新手来说,不同的框架不同的开发机制,如何快速适应呢?微信小程序开发视频教程新鲜出炉了,从零开始一步一步搭建微信小程序,每个章节都会涉及到不同的知识点,等教程学习完你不但掌 ...
- 刚写完的商城erp + 这个商城前台,新鲜出炉。自己1个人写, 包括php框架和前端html页面.
刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面. 刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面.
- 23套新鲜出炉的网站和手机界面 PSD 素材
Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这些套件让他们使用快速和有效的方式复制用户界面.这些类型的工具包提供了一个基本的用户界面元素,用于它们需要制作的网站或软件模型. 在这篇文章 ...
- 22套新鲜出炉的 Web & Mobile PSD 用户界面素材
在这篇文章中,我们展示的是自由和清新的 UI 设计素材套件.这些线框图和 UI 设计工具包让设计师在设计用户界面原型的时候能够非常便利. Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这 ...
- 20个新鲜出炉的网站模板【HTML & PSD】
这里给大家分享20 个新鲜出炉的免费网站模板.这些设计元素将成为你下一个项目的重要素材,可以帮你节省很多的时间.与往常一样,我们经常漫游网络,寻找最好的资源, HTML.CSS 和 PSD 等等,记得 ...
- 分享25个新鲜出炉的 Photoshop 高级教程
网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享25个新鲜出炉的 Photoshop 高级教程,提高你的设计技巧,制作时尚的图片效果.这 ...
- PS教程:20个新鲜出炉的 Photoshop 中级教程
Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享最新20个 Photoshop 进阶教程,提高你的图片处理技巧,制作时尚的效果.这些教程可以帮助把你的想法 ...
随机推荐
- Java接口的初始化
背景 接口与类真正有所区别的是前面讲述的四种"有且仅有"需要开始初始化场景中的第三种:当一个类在初始化时,要求其父类全部都已经初始化过了,但是一个接口在初始化时,并不要求其父接口全 ...
- java面试题:多线程交替输出偶数和奇数
一个面试题:实现两个线程A,B交替输出偶数和奇数 问题:创建两个线程A和B,让他们交替打印0到100的所有整数,其中A线程打印偶数,B线程打印奇数 这个问题配合java的多线程,很多种实现方式 在具体 ...
- Redis基础(一)数据结构与数据类型
Redis数据结构 Redis一共有六种数据结构,分别是简单动态字符串.链表.字典.跳表.整数集合.压缩列表. 简单动态字符串(SDS) Redis只会使用C字符串作为字面量,在大多数情况下,Redi ...
- 十年老苹果(A1286)强升Catalina及Win10踩坑记(续)
背景 自上次发布十年老苹果(A1286)强升Catalina及Win10踩坑记以来,因为后半部分-----系统安装上的细节描述过于简略,一些朋友在安装过程中总是又遇到坑,由此特意详述这一过程,让园友少 ...
- Django model总结(上)
Django model是django框架中处于比较核心的一个部位,准备分三个博客从不同的方面分别进行阐述,本文为<上篇>,主要对[a]Model的基本流程,比如它的创建,迁移等:默认行为 ...
- 1. Spark Word Count
1. request: 2. scala: sc.textFile("input").flatMap(_.split(" ")).map((_,1)).redu ...
- Pycharm同步远程服务器调试
Pycharm同步远程服务器调试 1.需要准备工具 xftp:上传项目文件 xshell:连接Linux系统调试,执行命令 PyCharm:调试python代码 这些软件可以自行网上搜索下载,也可以关 ...
- C语言100题集合-ex003
系列文章<C语言经典100例>持续创作中,欢迎大家的关注和支持. 喜欢的同学记得点赞.转发.收藏哦- 后续C语言经典100例将会以pdf和代码的形式发放到公众号 欢迎关注:计算广告生态 即 ...
- 【无思路题目】Leetcode-1640. 能否连接形成数组
[JAVA]参考题解 1.思路是这样子的,先用哈希表的key存下pieces的每一行的第一个元素即p[0],然后value存放相应的一维数组: 2.然后遍历arr数组,先查看每个值是否在map中,若存 ...
- 在springmvc.xml中定义全局的异常处理
在Controller类的内部方法上使用@ExceptionHandler,则此类的方法抛出未处理的异常时,回到此方法上处理. @ExceptionHandler可以指定异常的类型,会自动进行匹配 如 ...