-
- JVM 常问面试题
-
1.JVM的位置
-
2.JVM的体系结构
-
3.类加载器
-
4.双亲委派机制
-
5.沙箱安全机制
-
6.Native
-
7.PC寄存器
-
8.方法区
-
9.栈
-
10.三种JVM
-
11.堆
-
12.新生区、老年区
-
13.永久区
-
14.堆内存调优
-
15.GC :垃圾回收机制
-
- 15.1**垃圾回收 = GC**
-
15.2**复制算法**
-
15.3**图解复制算法**
-
15.4**标记清除算法**
-
15.5**标记压缩**
-
15.6**总结:**
=====================================================================
请你谈谈你对JVM的理解? java—>class---->
Java8虚拟机和之前的变化更新?
什么是OOM 内存溢出
什么栈溢出StackOverFlowError? 怎么分析
JVM 的常用调优参数?
内存快照如何抓取,怎么分析Dump文件?知道吗
谈谈JVM中,类加载器你的认识?
JVM 调优百分之99都是在堆里面调优,方法区是特殊的堆。
作用:加载Class 文件,~ new Student();
类似模板,是抽象的
对象是实现,是具体的
-
虚拟机自带的加载器
-
启动类(根)加载器
-
扩展类加载器
-
应用程序加载器
只有一个模板
第一步:类加载器收到类加载的请求
第二步:将这个请求向上委托给父类加载器去完成 ,一直向上委托,直到启动类加载器(Boot)
第三步:启动类加载器检查是否能够加载当前和这个类 ,能加载就结束,使用当前的加载器,否则,抛出异常,通知子加载器进行加载。
第四步:重复 第三步 步骤。
null : java调用不到 ~C 、C++
Java = C++ : 去掉繁琐的东西,指针,内存管理。
Java = C+±-
双亲委派机制推荐阅读这篇文章
没什么东西
凡是带了native 关键字的,说明java 的作用范围达不到了,会去调用底层C 语言的库。
凡是带了native 关键字的,会进入本地方法栈。
调用本地接口:JNI
JNI作用:扩展Java的使用,融合不同的编程语言为Java 所用!最初C、C++
它在内存区域中专门开辟了一块标记区域:Native Method Stack,登记native 方法
在最终执行的时候去加载本地方法库的方法,通过JNI
本地方法接口(JNI)Java Native Interface
本地方法库
private native void start0();
调用其他接口:Scoket 、WebService~http
程序计数器:Program Counter Register
每个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区中的方法字节码(用来存储指向一条指令的地址,也即将要执行的指令代码),在执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计。
Method Area 方法区
方法区是被线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,简单说,所有定义的方法的信息都保存在该区域,此区域属于共享空间。
静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中,但是,实例变量存在堆内存中,和方法区无关
方法区里面存以下内容
1.static
2.final
3.Class 类模板
4.常量池
类加载过程(面试)
-
new 一个类的时候,先在方法区有一个类的模板
-
类模板完了 ,方法区还有个常量池
-
引用在栈内存
-
真实的 对象在堆内存
-
引用指向堆内存真实的地址
数据结构
程序 = 数据结构 +算法 : 持续学习~
程序 = 框架 + 业务逻辑 : 吃饭
栈:先进后出、后进先出
队列:先进先出(FIFO:First Input First Output)
喝多了吐就是栈,吃多了拉就是队列
为什么main 方法 先执行,最后结束!
栈:栈内存,主管程序的运行,生命周期与线程同步;
线程结束,栈内存也就释放,对于栈来说,不存在垃圾回收问题
一旦线程结束,栈就over了
栈:8大基本类型+对象引用
栈运行原理:栈帧
程序正在执行的方法,一定在栈的顶部
栈 + 堆 + 方法区:的一些交互关系
-
Sun公司 HostSpot Java HotSpot™ 64-Bit Server VM (build 25.101-b13, mixed mode)
-
BEA Jrockit
-
IBM J9 VM
Heap,一个JVM 只有一个堆内存,堆内存的大小是可以调节的。
类加载器读取了类文件后,一般会把什么东西放到堆中?
类的实例、方法、常量、变量~,保存我们所有引用类型的真实对象
堆内存中还要细分为三个区域:
-
新生区 (伊甸园区) Young/New
-
养老区 old
-
永久区 Perm
1.GC 垃圾回收主要是在伊甸园区和养老区~
2.假设内存满了,OOM ,堆内存不够!
3.在JDK 8以后,永久存储区改了个名字(元空间)
类:诞生 和 成长的地方、甚至死亡。
伊甸园区,所有的的对象都是在伊甸园区new 出来的!
幸存者区(0,1)
假设我的伊甸园区只能存储10个对象,当伊甸园区满了,就会触发一次轻GC。
这次gc有以下情况:
有的对象可以还被引用,就幸存下来了。
有的对象没有被引用了,就死了、没了。
幸存的下来的对象就移动到伊甸园区。
当伊甸园区和性幸存区都满了,就会触发一次重GC。
重gc 清理一次后,能活下来的对象就进入养老区了。
(就跟一场战争一样,不断的活下来)
真理:经过研究,99%的对象都是临时对象! new
1.jdk 1.6之前:永久代,常量池是在方法区中
2.jdk 1.7 :永久代, 但是慢慢的退化了,去 永久代,常量池在堆中
3.jdk 1.8 之后:无永久代,常量池在元空间
永久区常驻内存的,用来存放JDK自身携带的class对象,interface元数据,存储的是Java运行时的一些环境或类信息这个区域不存在垃圾回收!关闭虚拟机就会释放这个区域的内存
OOM出现条件:一个启动器,加载了大量的第三方jar包、Tomcat部署了太多应用,大量动态生成的反射类,直到内存满。
逻辑上存在,物理上不存在。
在一个项目中,突然出现OOM 故障,那么该如何排除研究为什么出错~
1.能够看到代码第几行出错:内存快照分析工具,Eclipse MAT,Jprofiler
2.Dubug,一行行分析代码~
MAT,Jprofiler作用:
1.分析Dump内存文件,快速定位内存泄漏;
2.获得堆中的数据
3.获得大的对象~
idea 安装Jprofiler
安装之后配置
idea 配置vm 参数
-Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError
windows 客户端安装
https://www.ej-technologies.com/download/jprofiler/files
Dump 内存文件分析
分析:
一眼就可以看成ArrayList 出现问题了
错误代码如下
byte[] array = new byte[110241024];//1mb
public static void main(String[] args) {
List list = new ArrayList<>();
int count = 0;
try {
while (true){
list.add(new P1());
count++;
}
}catch (Throwable e){
e.printStackTrace();
System.out.println(“count===”+count);
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
e.printStackTrace();
System.out.println(“count===”+count);
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-DQao3qfP-1715282350633)]
[外链图片转存中…(img-hmBnrEmn-1715282350633)]
[外链图片转存中…(img-w4bx3CdB-1715282350633)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!