当前位置:网站首页>JVM面试篇
JVM面试篇
2022-07-02 02:13:00 【CV工程师呀】
1.JDK、JRE、JVM关系?
答:JDK是Java标准开发包,JRE是Java运行环境,JVM是Java虚拟机。JDK中包含JRE,JRE中包含JVM。Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
2.内存结构

3.程序计数器
答:用于保存JVM中下一条所要执行的指令的地址。程序计数器是每个线程所私有的,当另一个线程的时间片用完,又返回来执行当前线程的代码时,通过程序计数器可以知道应该执行哪一句指令。不会存在内存溢出。
4.虚拟机栈
答:每个线程运行需要的内存空间,称为虚拟机栈。每个栈由多个栈帧组成,对应着每次调用方法时所占用的内存。每个线程只能有一个活动栈帧,对应着当前正在执行的方法
5.垃圾回收是否涉及栈内存?
不需要。因为虚拟机栈中是由一个个栈帧组成的,在方法执行完毕后,对应的栈帧就会被弹出栈。所以无需通过垃圾回收机制去回收内存。
6.栈内存的分配越大越好吗?
不是。因为物理内存是一定的,栈内存越大,可以支持更多的递归调用,但是可执行的线程数就会越少。
7.方法内的局部变量是否是线程安全的?
如果方法内局部变量没有逃离方法的作用范围,则是线程安全的。如果如果局部变量引用了对象,并逃离了方法的作用范围,则需要考虑线程安全问题。
8.什么时候抛出StackOverflowError?
如果线程请求的栈深度大于虚拟机所允许的深度,则抛出StackOverflowError。虚拟机栈中,栈帧过多(无限递归)或每个栈帧所占用过大。
9.本地方法栈
一些带有native关键字的方法就是需要JAVA去调用本地的C或者C++方法,因为JAVA有时候没法直接和操作系统底层交互,所以需要用到本地方法。
10.JAVA堆
是Java虚拟机所管理的内存中最大的一块。Java堆事被所有线程共享的一块内存区域,在虚拟机启动时
创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。通过new关键字创建的对象都会被放在堆内存。
11.Java7和Java8在内存模型上有什么区别?
Java8取消了永久代,用元空间(Metaspace)代替了,元空间是存在本地内存(Native memory)中。
12.常量池和运行时常量池
常量池
就是一张表,虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量信息
运行时常量池
常量池是.class文件中的,当该类被加载以后,它的常量池信息就会放入运行时常量池,并把里面的符号地址变为真实地址
13.串池
- 常量池中的字符串仅是符号,只有在被用到时才会转化为对象
- 利用串池的机制,来避免重复创建字符串对象
- 字符串变量拼接的原理是StringBuilder
- 字符串常量拼接的原理是编译器优化
- 可以使用intern方法,主动将串池中还没有的字符串对象放入串池中
- 用来放字符串对象且里面的元素不重复
public class StringTableStudy {
public static void main(String[] args) {
String a = "a"; //放入串池
String b = "b"; //放入串池
String ab = "ab"; //放入串池
String ab2 = a+b; //放入堆内存
//使用拼接字符串的方法创建字符串
String ab3 = "a" + "b"; //放入串池
System.out.println(ab == ab2);//false
System.out.println(ab == ab3);//true
}
}
14.直接内存
直接内存是操作系统和Java代码都可以访问的一块区域,无需将代码从系统内存复制到Java堆内存,从而提高了效率。直接内存的回收不是通过JVM的垃圾回收来释放的,而是通过unsafe.freeMemory来手动释放
15.如何判断对象可以回收
1.引用计数法:
比如对象a,只要任何一个对象引用了a,则a的引用计数器就加1,当引用失效时,引用计数器就减1,当计
数器为0时,就可以对其回收。
弊端:循环引用时,两个对象的计数都为1,导致两个对象都无法被释放。
2.可达性分析算法
扫描堆中的对象,看能否沿着GC Root对象为起点的引用链找到该对象,如果找不到,则表示可以回收
可以作为GC Root的对象
- 虚拟机栈(栈帧中的本地变量表)中引用的对象。
- 方法区中类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI(即一般说的Native方法)引用的对象
3.五种引用
强引用
只有GC Root都不引用该对象时,才会回收强引用对象
如上图B、C对象都不引用A1对象时,A1对象才会被回收
软引用
当GC Root指向软引用对象时,在内存不足时,会回收软引用所引用的对象
如上图如果B对象不再引用A2对象且内存不足时,软引用所引用的A2对象就会被回收
弱引用
只有弱引用引用该对象时,在垃圾回收时,无论内存是否充足,都会回收弱引用所引用的对象
虚引用
当虚引用对象所引用的对象被回收以后,虚引用对象就会被放入引用队列中,调用虚引用的方法
16.垃圾回收算法
1.标记-清除
标记清除算法顾名思义,是指在虚拟机执行垃圾回收的过程中,先采用标记算法确定可回收对象,然后垃圾收集器根据标识清除相应的内容,给堆内存腾出相应的空间
缺点:容易产生大量的内存碎片
2.标记-整理
标记-整理 会将不被GC Root引用的对象回收,清楚其占用的内存空间。然后整理剩余的对象,可以有效避免因内存碎片而导致的问题,但是因为整体需要消耗一定的时间,所以效率较低

3.复制
将内存分为等大小的两个区域,FROM和TO(TO中为空)。先将被GC Root引用的对象从FROM放入TO中,再回收不被GC Root引用的对象。然后交换FROM和TO。这样也可以避免内存碎片的问题,但是会占用双倍的内存空间。



4.分代回收
新创建的对象都被放在了新生代的伊甸园中
当伊甸园中的内存不足时,就会进行一次垃圾回收,这时的回收叫做 Minor GC
Minor GC 会将伊甸园和幸存区FROM存活的对象先复制到 幸存区 TO中, 并让其寿命加1,再交换两个幸存区
若新生代的伊甸园又满了,则会再次触发 Minor GC(会触发 stop the world, 暂停其他用户线程,只让垃圾回收线程工作),这时不仅会回收伊甸园中的垃圾,还会回收幸存区中的垃圾,再将活跃对象复制到幸存区TO中。回收以后会交换两个幸存区,并让幸存区中的对象寿命加1
如果幸存区中的对象的寿命超过某个阈值(最大为15,4bit),就会被放入老年代中
如果新生代老年代中的内存都满了,就会先触发Minor GC,再触发Full GC,扫描新生代和老年代中所有不再使用的对象并回收
当遇到一个较大的对象时,就算新生代的伊甸园为空,也无法容纳该对象时,会将该对象直接晋升为老年代
17.垃圾回收器
安全点:让其他线程都在这个点停下来,以免垃圾回收时移动对象地址,使得其他线程找不到被移动的对象
1.Serial 收集器(串行收集器)
单线程、简单高效(与其他收集器的单线程相比),采用复制算法。对于限定单个CPU的环境来说,Serial收集器由于没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程手机效率。收集器进行垃圾回收时,必须暂停其他所有的工作线程,直到它结束(Stop The World)
2.ParNew 收集器
ParNew收集器其实就是Serial收集器的多线程版本
特点:多线程、ParNew收集器默认开启的收集线程数与CPU的数量相同,在CPU非常多的环境中,可以使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数。和Serial收集器一样存在Stop The World问题
3.Serial Old 收集器
Serial Old是Serial收集器的老年代版本
特点:同样是单线程收集器,采用标记-整理算法
4.Parallel Scavenge 收集器(吞吐量优先收集器)
与吞吐量关系密切,故也称为吞吐量优先收集器
特点:属于新生代收集器也是采用复制算法的收集器(用到了新生代的幸存区),又是并行的多线程收集器(与ParNew收集器类似)
4.Parallel Old 收集器
是Parallel Scavenge收集器的老年代版本
特点:多线程,采用标记-整理算法(老年代没有幸存区)
5.CMS 收集器(响应时间优先)
Concurrent Mark Sweep,一种以获取最短回收停顿时间为目标的老年代收集器,尽可能让单次STW时间变短。
特点:基于标记-清除算法实现。并发收集、低停顿,但是会产生内存碎片
CMS收集器的运行过程分为下列4步:
初始标记:标记GC Roots能直接到的对象。速度很快但是仍存在Stop The World问题
并发标记:进行GC Roots Tracing 的过程,找出存活对象且用户线程可并发执行
重新标记:为了修正并发标记期间因用户程序继续运行而导致标记产生变动的那一部分对象的标记记录。仍然存在Stop The World问题
并发清除:对标记的对象进行清除回收
6.G1
- 同时注重吞吐量和低延迟(响应时间)
- 超大堆内存(内存大的),会将堆内存划分为多个大小相等的区域
- 整体上是标记-整理算法,两个区域之间是复制算法
边栏推荐
- If you want to rewind the video picture, what simple methods can you use?
- A quick understanding of digital electricity
- The wave of layoffs in big factories continues, but I, who was born in both non undergraduate schools, turned against the wind and entered Alibaba
- MySQL constraints and multi table query example analysis
- How to execute an SQL in MySQL
- How to solve MySQL master-slave delay problem
- 牛客网——华为题库(51~60)
- Iterative unified writing method of binary tree
- Leetcode face T10 (1-9) array, ByteDance interview sharing
- leetcode2312. Selling wood blocks (difficult, weekly race)
猜你喜欢

321. Chessboard segmentation (2D interval DP)
![[question] - why is optical flow not good for static scenes](/img/8d/2cf6f582bc58cc2985f50e3f85f334.jpg)
[question] - why is optical flow not good for static scenes

Infix expression to suffix expression (computer) code

479. Additive binary tree (interval DP on the tree)

WebGPU(一):基本概念

Leetcode face T10 (1-9) array, ByteDance interview sharing

如何远程、在线调试app?

leetcode2312. 卖木头块(困难,周赛)

leetcode373. Find and minimum k-pair numbers (medium)

Medical management system (C language course for freshmen)
随机推荐
Start from scratch - Web Host - 01
SQLite 3 of embedded database
The concept, function, characteristics, creation and deletion of MySQL constraints
Construction and maintenance of business websites [11]
Using mongodb in laravel
AR增强现实可应用的场景
正则表达式学习笔记
Which is a good Bluetooth headset of about 300? 2022 high cost performance Bluetooth headset inventory
JMeter (II) - install the custom thread groups plug-in
How to batch add background and transition effects to videos?
自动浏览拼多多商品
new和malloc的区别
leetcode2305. 公平分发饼干(中等,周赛,状压dp)
Redis环境搭建和使用的方法
mysql列转行函数指的是什么
2022 Q2 - 提升技能的技巧总结
Cesium dynamic diffusion point effect
Logging only errors to the console Set system property ‘log4j2. debug‘ to sh
How to solve MySQL master-slave delay problem
STM32F103 - two circuit PWM control motor