jvm面试题草稿

562 阅读9分钟

什么情况下会发生栈内存溢出。什么时候发生堆溢出?你是怎么排错的?

当程序方法栈的调用深度达到最大的时候会产生栈内存溢出,多深?

堆内存溢出主要原因是当堆内存空间无法通过GC等手段为新的对象开辟存储空间的时候会产生堆内存溢出。

首先看是哪个溢出,stackoverflower 还是OOM,stackoverflow是栈溢出,oom是堆内存溢出;可以通过jmp 进程号的方式到处jump 文件,然后通过工具 ,eclipse的那个工具来分析?看哪个对象没有及时释放内存导致的内存溢出。


JVM怎么判断对象是可回收对象?有哪些方法。

JVM 会通过GC Root判断对象是否可达,GC root 不可达的时候当前对象就可以被回收了。

JVM的内存结构,新生代与老年代的比例,Eden和Survivor比例。

JVM 内存模型分为2类,一类是线程隔离的,一类是线程共享的。

线程隔离:本地方法栈、java方法栈、程序计数器

本地方法栈指的是java虚拟机调用本地方法时候使用的栈

java方法栈包含:栈帧 (方法入口信息和出口信息、局部变量表)

程序计数器:记录当前线程执行的字节码的行号

线程共享:堆、元数据区

堆内存空间主要分为 新生代、老年代、永久代(JDK1.8以后变成了元数据区,使用堆外内存)

新生代又分为 伊甸区、幸存区1、幸存区2;

静态常量池?在堆的哪里???

你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。

CMS并行垃圾回收器、G1垃圾回收期

原理:标记清除和整理清楚,标记清除会产生零碎的内存空间,不连续导致无法存放大对象,端整理清除会使得只能使用一半的内存空间。

流程:标记-> 清除

整理清除:把无法回收的对象整理到内存的一端,然后整理另一半的内存空间;

简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。

类加载器 classLoader ;

双亲委派????

类加载过程:编译-> 引入-> 验证 -> 连接??

JVM内存为什么要分成新生代,老年代,持久代。新生代中为什么要分为Eden和Survivor。

为了在不同的区域采用不同的回收策略、java中的大部分对象都是朝生夕死的,存活事件非常短,新生代主要接受新产生的对象,新生代内存空间满的时候就会触发 一次minor GC,新生对象出生的伊甸区,每次minor Gc的时候未被回收的对象会从幸存区1到幸存区2拷贝,minor GC 停顿事件很短,每次拷贝对象年龄+1,当对象年龄到达的一定的次数,就会转入老年代、一般老年代的对象存活时间较长,一次FullGC会导致stop the world的效果,也就是暂停所有的业务。要尽量避免FullGC。持久代一般是无法被回收的变量,比如static的共享变量。

JVM 出现 fullGC 很频繁,怎么去线上排查问题?

业务上来说 一般是因为有对象占用内存空间太多,而且长时间不释放导致的。可以采用dump的方式 ,jump 出来内存快照,然后使用分析软件查看是哪个对象占用了过多内存。

什么软件? 怎么分析?

JVM中一次完整的GC流程是怎样的,对象如何晋升到老年代,说说你知道的几种主要的JVM参数。

GC完整的流程??

首先当伊甸区无法再为新对象分配内存空间的时候,会触发Minor GC,将Form区的对象拷贝的To区,然后对象的年龄+1,当达到配置的年龄时会将对象放置到老年代,还有一种情况是内存担保,当对象的大小超过了eden区最大容量,会直接把对象存放到老年代。

-xmS -xmX 最小堆内存和最大堆内存 其他的??? -ratio 配置新生代和老年代的比例

垃圾回收算法的实现原理。

JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。

重排序:JVM编译器在优化的时候产生的字节码可能不是按照代码编写 的顺序生成的,这种情况就是重排序

内存屏障:CPU架构存在三级缓存。CPU为了加快运算速度,计算过程中数据不是事实刷新到主内存的,这样就会导致变量的可见性问题。

happen-before: A事件的发生一定在B事件之前发生,在java中使用voliate关键字可以避免重排序导致的内存可见性问题。

说一下Java对象的创建过程

创建对象-> 分配内存空间???

你们线上应用的JVM参数配置了哪些。

大多数后端项目都是IO密集型项目,我们会指定项目的最小内存和最大内存 -xms 和-xmx 并且让他们保持一致,然后会指定对应的垃圾回收器,一般是G1垃圾回收期。

G1和cms区别。

G1垃圾回收期更新一些,CMS垃圾回收期主要作用于老年代垃圾回收,他是一种并行的垃圾回收算法,吞吐量大。

G1垃圾回收期最大的特点是可预期的停顿时间,垃圾回收器的停顿事件更短。

怎么打出线程栈信息。

jstack 命令

说一下类加载的执行过程

编译-> 连接-> 验证-> 加载????

JVM垃圾回收机制,何时触发MinorGC等操作呢?

Eden区无法为新生对象分配存储空间的时候。

ZGC 垃圾收集器,了解过吗

还没有面世,0停顿时间的垃圾回收器。

对象的访问定位有哪两种方式?

值传递和引用传递,java中都是引用传递

说一下 jvm 调优的工具?

jstate pid 100 100 (重复多少次)

对象什么时候会进入老年代?

from和to来回拷贝的时候对象年龄+1,默认到15次的时候会进入老年代,可以通过??命令去改变这个值。内存担保策略会使大对象直接进入老年代。

内存泄漏和内存溢出区别?

内存泄露是某些对象引用无法被别的对象引用到,但是也无法被垃圾回收期回收。

内存溢出是堆空间无法再为新生对象分配内存空间。

什么是tomcat类加载机制?

完全不知道?????

了解逃逸分析技术吗

不清楚???

调用System.gc()会发生什么?

显示的申请垃圾回收期进行一次fullgc,但是仅仅是申请,不一定会立马触发fullgc

谈谈Minor GC条件,full GC条件

eden 无法为对象分配存储空间,老年代空间不足,不发接收年轻代转移的对象。

Stop The World 了解过吗?

JVM 在进行fullgc 的时候会停止所有的用户线程,好像世界停止一样。

谈谈你认识多少种OOM?如何避免OOM?

stackvoerflow:栈内存溢出,避免没有终止条件的递归调用,过着过深的方法层级调用,多深算深?

OutOfMemory 堆内存溢出,避免对象一直被引用而无法被回收,比如map中一直put object

了解过JVM调优没,基本思路是什么?如何确定它们的大小呢?

JVM xms 和xmx 设置为一样大,指定G1垃圾回收期,

淘宝热门商品信息在JVM哪个内存区域

堆内存区域

字节码的编译过程

加载-> 连接- 验证???

Java需要开发人员回收内存垃圾吗?

不需要,system.GC 只是申请,不会立马触发fullGC

Java中垃圾回收有什么目的?什么时候进行垃圾回收?

避免程序员需要手动回收内存。

System.gc()和Runtime.gc()会做什么事情?

只是申请、Runtime.gc() 没听说过。

主内存与工作内存

主内存是堆外内存? 工作内存是JVM 内存?

内存间交互操作

听不懂啥意思、

volatile 禁止内存重排序

CPU的三级缓存,对volatile 对象修饰的对象的修改直接刷新进主存

内存模型三大特性

不知道。。

谈谈先行发生原则

hapen-before原则,避免JVM编译器的指令重排序。

JVM 堆内存溢出后,其他线程是否可继续工作?

不可以吧。。。

说一下JVM 常用参数有哪些?

xms xmx ratio

JVM 为什么使用元空间替换了永久代?

元空间可以直接使用对外内存?为什么替换?不清楚。。。

Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?

jdk1.8之前有永久代,在老年代中无法被回收的对象。

JVM的永久代中会发生垃圾回收么?

会吧

什么是字节码?采用字节码的最大好处是什么?什么Java是虚拟机?

JVM一次编译,到处运行的保证,java代码编译后成字节码,针对不同的平台开发了不同的字节码执行器。

Java虚拟机就是JVM ,内存模型。

MinorGC 的过程

from-> to 对象拷贝一次,age +1

CPU 占用过高如何分析

jstack查看是否有大量的线程等待。

Serial与Parallel GC之间的不同之处?

serial 是单线程,作用在年轻代

ParallelGC多线程,作用在老年代

WeakHashMap 是怎么工作的?

弱引用?软引用?虚引用?忘了

你能保证 GC 执行吗?

不能。。。

JVM中哪个参数是用来控制线程的栈堆栈小的?

不知道。。