zoukankan      html  css  js  c++  java
  • JVM常见面试题

    1.JVM内存模型、堆的分代模型:

    http://blog.csdn.net/u012152619/article/details/46968883

    线程私有、公有。

    启动参数、比例、一般大小。

    2.Minor、Major、Full GC触发:

    http://www.importnew.com/15820.html

     http://blog.csdn.net/lvxiangan/article/details/50549199

    3.GC算法、垃圾收集器:

    http://www.importnew.com/26383.html

    两个最基本的java回收算法:复制算法和标记清理算法
    复制算法:两个区域A和B,初始对象在A,继续存活的对象被转移到B。此为新生代最常用的算法
    标记清除:一块区域,标记要回收的对象,然后回收,一定会出现碎片,那么引出
    标记-整理算法:多了碎片整理,整理出更大的内存放更大的对象
     
    P.S:Serial New收集器是针对新生代的收集器,采用的是复制算法
    Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
    Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
    Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
    Parallel Old(并行)收集器,针对老年代,标记整理
    CMS收集器,基于标记清理
    G1收集器:整体上是基于标记 整理 ,局部采用复制
     
    综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。
     

    4.常见的jvm内存溢出原因和解决办法

    1)JVM Heap(堆)溢出:java.lang.OutOfMemoryError: Java heap space
    JVM在启动的时候会自动设置JVM Heap的值, 可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap的大小是Young Generation 和Tenured Generaion 之和。在JVM中如果98%的时间是用于GC,且可用的Heap size 不足2%的时候将抛出此异常信息。
    解决方法:手动设置JVM Heap(堆)的大小。
    2)PermGen space溢出: java.lang.OutOfMemoryError: PermGen space
    PermGen space的全称是Permanent Generation space,是指内存的永久保存区域。为什么会内存溢出,这是由于这块内存主要是被JVM存放Class和Meta信息的,Class在被Load的时候被放入PermGen space区域,它和存放Instance的Heap区域不同,sun的 GC不会在主程序运行期对PermGen space进行清理,所以如果你的APP会载入很多CLASS的话,就很可能出现PermGen space溢出。一般发生在程序的启动阶段。
    解决方法: 通过-XX:PermSize和-XX:MaxPermSize设置永久代大小即可。
    3)栈溢出: java.lang.StackOverflowError : Thread Stack space
    栈溢出了,JVM依然是采用栈式的虚拟机,这个和C和Pascal都是一样的。函数的调用过程都体现在堆栈和退栈上了。调用构造函数的 “层”太多了,以致于把栈区溢出了。 通常来讲,一般栈区远远小于堆区的,因为函数调用过程往往不会多于上千层,而即便每个函数调用需要 1K的空间(这个大约相当于在一个C函数内声明了256个int类型的变量),那么栈区也不过是需要1MB的空间。通常栈的大小是1-2MB的。通俗一点讲就是单线程的程序需要的内存太大了。 通常递归也不要递归的层次过多,很容易溢出。
    解决方法:1:修改程序。2:通过 -Xss: 来设置每个线程的Stack大小即可。
    4. 所以Server容器启动的时候我们经常关心和设置JVM的几个参数如下(详细的JVM参数请参看附录三):
    -Xms:java Heap初始大小, 默认是物理内存的1/64。
    -Xmx:ava Heap最大值,不可超过物理内存。
    -Xmn:young generation的heap大小,一般设置为Xmx的3、4分之一 。增大年轻代后,将会减小年老代大小,可以根据监控合理设置。
    -Xss:每个线程的Stack大小,而最佳值应该是128K,默认值好像是512k。
    -XX:PermSize:设定内存的永久保存区初始大小,缺省值为64M。
    -XX:MaxPermSize:设定内存的永久保存区最大大小,缺省值为64M。
    -XX:SurvivorRatio:Eden区与Survivor区的大小比值,设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10
    -XX:+UseParallelGC:F年轻代使用并发收集,而年老代仍旧使用串行收集.
    -XX:+UseParNewGC:设置年轻代为并行收集,JDK5.0以上,JVM会根据系统配置自行设置,所无需再设置此值。
    -XX:ParallelGCThreads:并行收集器的线程数,值最好配置与处理器数目相等 同样适用于CMS。
    -XX:+UseParallelOldGC:年老代垃圾收集方式为并行收集(Parallel Compacting)。
    -XX:MaxGCPauseMillis:每次年轻代垃圾回收的最长时间(最大暂停时间),如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
    -XX:+ScavengeBeforeFullGC:Full GC前调用YGC,默认是true。
    实例如:JAVA_OPTS=”-Xms4g -Xmx4g -Xmn1024m -XX:PermSize=320M -XX:MaxPermSize=320m -XX:SurvivorRatio=6″

    5.常用的JVM内存分析工具和方法。

    -打开GC日志,例如 -XX:+PrintGCDetails, -XX:+PrintGCTimeStamps , -Xloggc:/var/log/gc.log

    -打开内存溢出dump。XX:+HeapDumpOnOutOfMemoryError   可以使用MAT对dump内存进行分析:http://blog.csdn.net/rachel_luo/article/details/8992461

    -使用JDK命令行工具 jstat jinfo等

    -使用可视化工具JConsole,可以监视jvm的一些运行状态。 VisualVM  http://www.cnblogs.com/ityouknow/p/6437037.html

  • 相关阅读:
    CodeForces 797D Broken BST
    CodeForces 797C Minimal string
    CodeForces 797B Odd sum
    CodeForces 797A k-Factorization
    CodeForces 772B Volatile Kite
    OpenCV学习笔记二十:opencv_ts模块
    OpenCV学习笔记十九:opencv_gpu*模块
    OpenCV学习笔记十八:opencv_flann模块
    OpenCV学习笔记十七:opencv_bioinspired模块
    OpenCV学习笔记十六:opencv_calib3d模块
  • 原文地址:https://www.cnblogs.com/kuracola/p/7443101.html
Copyright © 2011-2022 走看看