什么情况下会发生栈内存溢出。什么时候发生堆溢出?你是怎么排错的?
当程序方法栈的调用深度达到最大的时候会产生栈内存溢出,多深?
堆内存溢出主要原因是当堆内存空间无法通过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中哪个参数是用来控制线程的栈堆栈小的?
不知道。。