JVM体系结构:*

类加载器:
作用:将javac编译好的class文件装入虚拟机。
宏观来看,只有两种类加载器:启动类加载器、其他类加载器。

启动类加载器属于虚拟机的一部分,它是用C++写的,看不到源码;其他类加载器是用Java写的,说白了就是一些Java类,一会儿就可以看到了,比如扩展类加载器、应用类加载器。
启动类加载器:BootstrapClassLoader
扩展类加载器:ExtentionClassLoader
应用类加载器:AppClassLoader (也叫做“系统类加载器”)
既然只是把class文件装进虚拟机,为什么要用多种加载器呢?因为Java虚拟机启动的时候,并不会一次性加载所有的class文件(内存会爆),而是根据需要去动态加载。
不同的类加载器加载的内容:
类加载器是通过类的全限定名(或者说绝对路径)来找到一个class文件的。
启动类加载器加载的是jre和jre/lib目录下的核心库
扩展类加载器加载的是jre/lib/ext目录下的扩展包
应用类加载器加载的是java工程的bin目录
双亲委派机制:
有一个描述类加载器加载类过程的术语:双亲委派模型。然而这是一个很有误导性的术语,它应该叫做单亲委派模型(Parent-Delegation Model)。但是没有办法,大家都已经这样叫了。所谓双亲委派,这个亲就是指ClassLoader里的全局变量parent,也就是父加载器。

双亲委派的具体过程如下:

当一个类加载器接收到类加载任务时,先查缓存里有没有,如果没有,将任务委托给它的父加载器去执行。
父加载器也做同样的事情,一层一层往上委托,直到最顶层的启动类加载器为止。
如果启动类加载器没有找到所需加载的类,便将此加载任务退回给下一级类加载器去执行,而下一级的类加载器也做同样的事情。
如果最底层类加载器仍然没有找到所需要的class文件,则抛出异常。
所以是一条线传上再传下,并没有什么“双亲”。

为什么要双亲委派?
确保类的全局唯一性。

如果你自己写的一个类与核心类库中的类重名,会发现这个类可以被正常编译,但永远无法被加载运行。因为你写的这个类不会被应用类加载器加载,而是被委托到顶层,被启动类加载器在核心类库中找到了。如果没有双亲委托机制来确保类的全局唯一性,谁都可以编写一个java.lang.Object类放在classpath下,那应用程序就乱套了。

从安全的角度讲,通过双亲委托机制,Java虚拟机总是先从最可信的Java核心API查找类型,可以防止不可信的类假扮被信任的类对系统造成危害。
参考链接:

https://zhuanlan.zhihu.com/p/73359363

native:
凡是带有native关键字的,说明Java的作用范围达不到,回去调用底层C语言库,
会进入本地方法栈,调用本地方法接口JNI(JNI的作用:扩展Java的使用,融合不同编程语言为Java所用!)它在内存区域中专门开辟了一块标记区域:Native method Stock,登记native方法,在最终执行的时候,加载本地方法库中的方法通过JNI。结合JVM结构图来分析。
方法区:
方法区:静态变量,常量,类信息,运行时的常量池(static,final,Class,常量池)

栈: 栈内存主管程序运行,生命周期和线程同步;线程结束,栈内存释放。
栈:8大基本类型+对象引用+实例的方法
栈运行的原理:栈帧
栈溢出会报错:StackOverflowError
堆: 实例对象
Java对象在内存中实例化的全过程:
参考博客链接:

https://blog.csdn.net/Tony__Jaa/article/details/107612059
https://blog.csdn.net/weixin_46037153/article/details/104427109
https://www.cnblogs.com/Cerpelus/p/14654273.html

堆内存:
关于堆内存的区域的划分:
如何理解元空间(jDK8之后)逻辑上存在和物理上不存在,
逻辑上分区是新生区,老年区,元空间。但是运行程序会发现,新生区占用的内存+老年区占用的内存等于总内存。
默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存为分配总内存的1/16.

JVM调整堆内存的大小:编辑run:-Xms1024m -Xmx1024m -XX:+PrintGCDetails  //打印垃圾回收信息-Xms 设置初始化内存分配大小 ,默认电脑内存的1/64-Xmx 设置最大分配内存大小,默认电脑内存的1/4
OOM(OutOfMemoryError)问题如何解决: 1.尝试扩大堆内存2.分析内存,查看哪个地方出现了问题编辑run:-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError  //oom DUMP

IDEA中安装Jprofile插件,并且在安装桌面版的Jprofile,然后settings中设置如下。

打开生成的快照文件。查看堆遍历器中biggest Object 和 占用的线程,找出问题所在的行。

GC题目:
JVM的内存模型和分区 详细到每个分区放什么?
堆里面的分区有哪些?新生区(伊甸园(Eden),幸存区(from, to)) 老年区,以及他们的特点!(谁空谁是to区)
GC算法有哪些?标记清除法,标记压缩法,复制算法,引用计算器,怎么使用?
答案:
引用计数算法:主要是标记
复制算法:主要是复制from区到to区,保证to区为空。

优点:没有内存碎片,
缺点:浪费内存空间:多了一半的内存空间为空 to区;假设对象100%存活(极端情况)
因此复制算法应用的最佳场景:对象存活度较低,新生区。
标记清除压缩算法:

标记清除算法:
优点:不需要额外的空间 ,缺点:两次扫描严重浪费时间,会产生内存碎片。

标记压缩算法:
优点:防止压缩碎片的产生,缺点:多了一次移动成本
总结:
从内存效率:复制算法>标记清楚算法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩算法>标记清楚算法
内存利用率:标记压缩算法=标记清楚算法>复制算法
没有最优的算法只有最合适的算法 :分代收集算法
对于年轻代:存活率低,复制算法
对于老年代:区域大,存活率高,采用标记清楚+标记压缩混合算法

轻GC和重GC分别 发生在什么时候?
新生代内存不够用时候发生 MGC 也叫 YGC,JVM 内存不够的时候发生 FGC。

JVM知识点总结(待续)相关推荐

  1. 带你全面了解高级 Java 面试中需要掌握的 JVM 知识点

    对于一名高级 Java 工程师来说,JVM 可以说是面试必问的一个知识点,而大多数人可能没有对 JVM 的实际开发和使用经验,接下来这一系列文章将带你深入了解 JVM 需要掌握的各个知识点.这也将帮助 ...

  2. Jvm 系列(八):Jvm 知识点总览

    对于Java程序员来讲,spring全家桶几乎可以搞定一切,spring全家桶便是精妙的招式,jvm就是内功心法很重要的一块,线上出现性能问题,jvm调优更是不可回避的问题.因此JVM基础知识对于高级 ...

  3. jvm系列(八):jvm知识点总览-高级Java工程师面试必备

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  4. jvm系列(八):jvm知识点总览

    在江湖中要练就绝世武功必须内外兼备,精妙的招式和深厚的内功,武功的基础是内功.对于武功低(就像江南七怪)的人,招式更重要,因为他们不能靠内功直接去伤人,只能靠招式,利刃上优势来取胜了,但是练到高手之后 ...

  5. 奥利给!搞定JVM就靠它了!不看感觉错过一个亿!吐血整理两个月,原创!全网第一份超详细JVM知识点导图!!!

    一.本人原创整理,基于尚硅谷教学视频以及深入理解Java虚拟机 导图地址请查看评论 二.导图总体如下,每一章节,每一个细节点,都有超级详细的记录.以及一些图示,代码等. 1.总体概图,已经有6.8k浏 ...

  6. JVM知识点精华汇总 侵立删

    转自:https://blog.csdn.net/huyuyang6688/article/details/81490570 本文是学习了<深入理解Java虚拟机>之后的总结,主要内容都来 ...

  7. 万字吐血总结JVM知识点

    前言:这一年前前后后把<深入理解JVM>看了好几遍,最近把里面所有的知识点整理如下,供大家一起学习. 第二章 Java内存区域与内存溢出异常 一.运行时数据区域 1.程序计数器:线程私有, ...

  8. JVM知识点总览:高级Java工程师面试必备

    作者 | 郑雨迪 出处 | 极客时间<深入拆解 Java 虚拟机> 下面这篇文章汇集了阿里.美团.Oracle 等大厂的 JVM 考点,你是否能回答得上来? 什么是 Java 虚拟机?为什 ...

  9. 撸完这些JVM知识点,明天就去面试阿里P6+

    作为一名优秀的 Java 开发程序员,以及想那些想要学习 Java 更深层一点的知识的同学,对 JVM 的熟悉与熟练使用是必不可缺的核心技能了,也是每个 Java 程序员应该要做到的. 深入学习 JV ...

最新文章

  1. 如何处理大数据:微博信息流数据库设计
  2. Binder相关面试总结(一):为什么Android要采用Binder作为IPC机制?
  3. ITK:使用Canny边缘检测过滤器检测边缘
  4. 利用FindWindow和SendMessage进程通信
  5. mysql 生明变量_mysql中变量的使用
  6. react中创建一个组件_如何使用React和MomentJS创建一个Countdown组件
  7. 内核中的notification chain浅析
  8. 一级指针,二级指针,指向数组的指针
  9. 基于html5的在线教育,基于HTML5的在线学习系统的设计与实现
  10. 瑞银报告:Waymo在2030年占据全球60%无人出租车市场
  11. JAVA程序员基本功:开发实现类隐藏及应用
  12. 7-1 字符串的冒泡排序 (20 分)
  13. CentOS7与CentOS6区别及特点
  14. 广告传媒实际税负怎么计算_传媒宣传业增值税税负多少
  15. java多线程-创建线程
  16. 特大喜讯!鸿蒙项目来了:在线电子词典
  17. ENVI实验教程(3)遥感图像预处理—几何校正
  18. latex 之好看的字体格式
  19. PowerDesign 初识
  20. 操作系统与裸机的区别

热门文章

  1. 狂热至理性,2018年区块链舆情分析 | 链塔区块链产业年鉴精选
  2. 第九章、结构体与共用体
  3. Java 常用工具类(9) : 图片上传至阿里云OSS
  4. 使用idea(1)--增加内存
  5. uniapp引入微信小程序直播组件
  6. “2017CIO时代中国行-南通通州站”顺利举行
  7. 最新 Google支付 Google Play 结算库 4.0 版:从创建定价、商品到测试、支付成功等步骤
  8. 没有手机的一天是什么样的体验
  9. 餐饮界有福了,为海底捞服务的SaaS产品开始推向全行业
  10. 利用AD18绘制PCB封装的方法总结(一)