- 请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新?
- 什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?
- JVM的常用调优参数
- 内存快照如何抓取,怎么分析Dump文件?知道吗?
- 谈谈JVm中,类加载器你的认识?
1.虚拟机自带的加载器
2.启动类(根)加载器
3.扩展类加载器
4.应用程序加载器
- 启动类加载器(Bootstrap Class Loader)
- 扩展类加载器(Extension Class Loader)
- 应用类加载器(Application Class Loader)
APP–>EXC–>BOOT
1.类加载器收到类加载请求
2.将这个请求向上委托给父类加载器区完成,一直向上委托,直到启动加载器
3.启动加载器检查是否能够加载这个类,能加载就使用当前加载器,否则,抛出异常,通知子类加载器
4.重复步骤 null :java 调用不到 C,C++
5.沙箱安全机制-
类装载器(loader class)
- 防止恶意代码去干扰善意代码 //双亲委派机制
-
字节码校验器(bytecode verifier) :确保遵循java语言
-
安全管理器
- native:凡是带了native的关键字 说明java的作用范围达不到了,回去调用底层C语言的库
- 会进入本地方法栈
- 调用本地方法接口 JNI
- JNI作用:扩展java的使用,融合不同的编程语言为java所用! 最初:C C++
- java之前要想立足 必须调用C C++的程序
- 它在内存区域专门开辟了一块标记区域:Native Methon Stack 登记 native方法
- 最终执行的时候,加载本地库中的方法通过JNI
- java程序驱动打印机 ,管理系统,在企业级应用少见
程序计数器:Program Counter Register
每一个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区的方法字节码(用来存储指向像一条指令的地址,也将要执行的指令代码),在执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计
8.方法区Methon Area方法区
方法区是所有线程共享的,所有字段和字节码,以及一些特殊的方法,比如构造函数,接口代码页在此定义,简单的说,所有定义的方法信息都保存在该区域,此区域属于共享区间
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中、但是 实例变量存在堆内存中、和方法区无关
static final Class 常量池 // java内存基础章节
9.栈栈:数据结构
程序=数据结构+算法:持续学习~
程序=框架+业务逻辑 必须要的
栈:先进后出 后进后出
队列:先进先出(FIFO:First Input First Output)
栈:栈内存 主管程序的运行 生命周期和线程同步
线程结束,栈内存也就释放 对于栈来说 不存在垃圾回收
一旦结束 栈就Over
栈:8大类型 +对象引用+实例方法
栈满了:StackOverflowError
栈+堆+方法区:交互关系 具体博客:(22条消息) Java对象在内存中实例化的过程_Tony__Jaa的博客-CSDN博客_画出一个对象实例化过程在内存中
栈运行原理:正在执行的方法一定在栈的顶部 执行完就抛弃 直到全部执行完成
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KRk7Xt5C-1656671526706)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624111214467.png)]
10.三种JVM- Sun公司 HotSpot
- BEA JRockit 最快的JVM 不适合学习 适合其他
- IBM J9 vm
Heap 一个JVM只有一个堆内存 堆内存是可以调节的
类加载器读取了类文件后,一般会把什么东西放到堆中?类,方法,常量,变量保存我们所有引用类型的真实对象
堆内存分为三个区域:
- 新生区(伊甸园)Eden
- 养老区
- 永久区
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLBn7DjK-1656671526707)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624113643822.png)]
Heap满了:OutOfMemoryError (OOM)
JDK8以后永久区改成了元空间
GC回收主要在伊甸园区 养老区
12.新生区 老年区- 类:诞生和成长的地方
- 伊甸园区:所有的对象都是在这New出来的
- 幸存者区
- 幸存者0区
- 幸存者1区
经过研究99%的对象都是临时对象
13.永久区用来存放jdk自身携带的Class对象 interface元数据 存储是java运行的一些环境 不存在垃圾回收 关闭虚拟机会释放这个区域
一个启动类 加载了大量的jar包 Tomca部署了大量的应用 大量动态生成的反射类 不断被加载
直到内存满了 就会出现 OOM
- jdk1.6 之前:永久代,常量池是在方法区;
- jdk1.7:永久代,慢慢的退化了,常量池在堆中
- jdk1.8之后 :无永久代 常量池在元空间
//返回虚拟机试图使用最大内存
long max=Runtime.getRuntime().maxMemory();
//返回jvm的初始化总内存
long total=Runtime.getRuntime().totalMemory();
System.out.println("max="+max+"字节/t"+(max/(double)1024/1024)+"MB")
System.out.println("mtotal="+max+"字节/t"+(total/(double)1024/1024)+"MB")
//默认情况下 :分配的总内存是电脑内存的1/4 而初始化的内存是1/64
出现OOM调优:尝试扩大堆内存
-Xms1024m -Xmx1024m -XX:PrintGCDetails (JVM设置里面填写)
一个项目中出现了OOM
- 测试工具 内存快照分析工具 MAT Jprofiler.
MAT Jprofiler作用
- 分析Dump内存文件 快速定位内存泄漏
- 获得堆中的数据
- 获得大的对象
Jprofier 下载:Download and installation help (softonic.com)
14.堆内存调优-Xms 设置初始化内存分配大小
-Xmx 设置最大分配内存
-XX +PrintGCDetails 打印GC垃圾回收信息
-Xms1m -Xx8m -XX:HeapDumpOnOutOfMeoryError 打印堆溢出的问题
15.GC- 新生代
- 幸存区(from ,to)
- 老年区
GC两种类 :轻GC(普通的GC) 重GC (全局GC)
1.GC题目(面试题目)-
JVM的内存模型和分区 详细到每个区放什么?
-
堆里面的分区有哪些?Eden,from to 老年区他们的特点
-
GC的算法有哪些,标记清除法,标记压缩,复制算法,引用计数器,怎么用的
引用计数法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SM3qbMT2-1656671526708)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624142219348.png)]
年轻代的GC 主要用的复制算法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5GCescVa-1656671526710)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624143646153.png)]
- 好处:没有内存碎片
- 坏处:浪费了一个内存空间 to区保证是空的
复制算法最佳使用场景:对对象较低的时候;新生区
1.每次GC都会将Eden活的对象转移到幸存区中;一旦Eden区被Gc后,就是空的!
2.谁空谁是to 幸存0和1区一直在改变
3.当一个对象经历了15次GC都没有被消除 就进老年区
4.-XXMaxTenuring Theshold=15 通过这个设置进入老年区的时间
3.标记清楚算法[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G3P3RX4M-1656671526711)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624144307332.png)]
-
优点:不需要额外的空间
-
缺点:两次扫描 严重浪费时间 会产生内存碎片 hash
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L8OqdY9l-1656671526712)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624144740646.png)]
16.JMM
17.总结
内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)
内存整齐度:复制算法=标记压缩法>标记清楚法
内存利用率:标记压缩算法=标记清楚算法>复制算法
没有最好的算法 只有最合适的算法
年轻代:
- 存活率低
- 复制算法!
老年代:
- 区域大 :存活率
- 标记清楚(内存碎片不是很多)+标记压缩混合 实现
面试题多看 书看《深入理解JVM》
16JMMJava Memory Model java 内存模型
JMM:抽象的概念
- 可以去下面的这个blog进行深层次的探究JVM
(22条消息) 详解什么是JMM!_阿里官方架构师的博客-CSDN博客_jmm
17.来源1.狂神视频学习
2.如果错误请指出改正
3.本人刚刚入门有些知识不是很专业望理解



