什么状况下会产生栈内存溢出 形容栈定义,再形容为什么会溢出,再阐明一下相干配置参数,OK的话能够给面试官手写是一个栈溢出的demo。 栈是线程公有的,他的生命周期与线程雷同,每个办法在执行的时候都会创立一个栈帧,用来存储局部变量表,操作数栈,动静链接,办法进口等信息。局部变量表又蕴含根本数据类型,对象援用类型 如果线程申请的栈深度大于虚拟机所容许的最大深度,将抛出StackOverflowError异样,办法递归调用产生这种后果 如果Java虚拟机栈能够动静扩大,并且扩大的动作曾经尝试过,然而无奈申请到足够的内存去实现扩大,或者在新建设线程的时候没有足够的内存去创立对应的虚拟机栈,那么Java虚拟机将抛出一个OutOfMemory 异样。(线程启动过多) 参数 -Xss 去调整JVM栈的大小 详解JVM内存模型 思路: 给面试官画一下JVM内存模型图,并形容每个模块的定义,作用,以及可能会存在的问题,如栈溢出等。
程序计数器:以后线程所执行的字节码的行号指示器,用于记录正在执行的虚拟机字节指令地址,线程公有。 Java虚构栈:寄存根本数据类型、对象的援用、办法进口等,线程公有。 Native办法栈:和虚构栈类似,只不过它服务于Native办法,线程公有。 Java堆:java内存最大的一块,所有对象实例、数组都寄存在java堆,GC回收的中央,线程共享。 办法区:寄存已被加载的类信息、常量、动态变量、即时编译器编译后的代码数据等。(即永恒带),回收指标次要是常量池的回收和类型的卸载,各线程共享 JVM内存为什么要分成新生代,老年代,长久代。新生代中为什么要分为Eden和Survivor。 思路: 先讲一下JAVA堆,新生代的划分,再谈谈它们之间的转化,相互之间一些参数的配置(如: –XX:NewRatio,–XX:SurvivorRatio等),再解释为什么要这样划分,最好加一点本人的了解 共享内存区划分 共享内存区 = 长久带 + 堆 长久带 = 办法区 + 其余 Java堆 = 老年代 + 新生代 新生代 = Eden + S0 + S1 一些参数的配置 默认,新生代与老年代的比例的值是1:2,能够通过参数-XX:NewRatio配置。 默认,Edem:from:to=8:1:1(能够通过参数-XX:SurvivorRatio来设定) Survivor区中的对象被复制次数(对应虚拟机参数-XX:+MaxTenuringThreshold) 为什么要分为Eden和Survivor?为什么要设置两个Survivor区? 如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被填满,触发Major GC.老年代的内存空间远大于新生代,进行一次Full GC耗费的工夫比Minor GC长得多,所以须要分为Eden和Survivor。 Survivor的存在意义,就是缩小被送到老年代的对象,进而缩小Full GC的产生,Survivor的预筛选保障,只有尽力了16次Minor GC还能在新生代中存活的对象,才会被送到老年代。 设置两个Survior区最大的益处就是解决了碎片化,刚刚新建的对象在Eden中,经验一次Minor GC,Eden中的存活对象就会被移到到第一块survivor space S0,Eden被清空;等Eden区在满了,就再触发一次Minor GC,Eden和S0中的存活对象又被复制送入第二块survivor space S1(这个过程十分重要,因为这种复制算法保障了s1中来自S0和Eden两局部的存活对象占有间断的内存空间,防止了碎片化的产生。) JVM中一次残缺的GC流程是怎么的,对象如何降职到老年代 思路:先形容一下Java堆内存划分,再解释Minor GC、Major GC、full GC、以及他们之间的转化流程 Java堆 = 老年代 + 新生代 新生代 = Eden + S0 + S1 当Eden区的空间满了,Java虚构机会触发一次Minor GC,以收集新生代的垃圾,存活下来的对象,则会转移到Survivor区。 大对象(须要大量间断内存空间的Java对象,如那种很长的字符串)则间接进入老年态。 如果对象在Eden出世,并通过第一次Minor GC后依然存活,并且被Survivor包容的话,年龄设为1,每熬过一次Minor GC,年龄+1,若年龄超过肯定限度(15),则被降职到老年态。即上期存活的指向进入老年态。 老年代满了而无奈包容更多的对象,Minor GC之后通常就进行Full GC,Full GC清理整个内存堆-包含年老代和年轻代。 Major Gc产生在老年代的GC,清理老年区,常常会随同至多一次Minor GC,比Minor GC慢10倍以上。 你晓得哪几种垃圾收集器,各自的优缺点,重点讲下CMS和G1,包含原理,流程,优缺点 思路: 肯定要记住典型的垃圾收集器,尤其cms和G1,它们的原理与区别,波及的垃圾回收算法。 几种垃圾收集器 Serial收集器: 单线程的收集器,收集垃圾时,必须stop the world,应用复制算法。 ParNew收集器: Serial收集器的多线程版本,也须要stop the world,复制算法 Parallel Scavenge收集器: 新生代收集器,复制算法的收集器,并发的多线程收集器,指标是达到一个可控的吞吐量。如果虚拟机总共运行100分钟,其中垃圾花掉1分钟,吞吐量就是99%。