jvm常见面试题

  1. GC垃圾回收中的垃圾指的是什么?

    • 简单的来说是内存中已经不再使用到的空间就是垃圾
  2. 如何判断一个对象是否应该回收?

    • 引用计数法
    • 枚举根节点可达性分析(GCRoots)
  3. java中可以作为GCRoots的对象有哪些?

    • 虚拟机栈中引用的对象(局部变量)
    • 方法区的静态属性引用的对象
    • 方法区中常量引用的对象
    • 本地方法栈中native方法引用的对象
  • JVM的参数类型

  • 标配参数

    • java -version
    • java -help
  • x参数(了解)

    • -Xcomp:第一次使用就编译成本地代码
    • -Xint:解释执行
  • xx参数

    • Boolean类型
      - [ ] -XX:+或者-某个属性值 +表示开启 -表示关闭 -XX:-PrintGCDetails / -XX: +PrintGCDetails
    • KV设值类型
      • -XX:属性key=属性值value -XX:MetaspaceSize=128m/-XX:MaxTenuringThreadhold=15
    • jinfo举例,如何查看当前运行程序的配置
  • 你说你做过jvm优化和参数配置,请问如何盘点查看jvm系统默认值?

    • java -XX:+PrintFlagsInitial
E:\spring-boot\spring-boot-quickstart>java -XX:+PrintFlagsInitial
[Global flags]
    intx ActiveProcessorCount                      = -1                                  {product}
   uintx AdaptiveSizeDecrementScaleFactor          = 4                                   {product}
   uintx AdaptiveSizeMajorGCDecayTimeScale         = 10                                  {product}
   uintx AdaptiveSizePausePolicy                   = 0                                   {product}
   uintx AdaptiveSizePolicyCollectionCostMargin    = 50                                  {product}
   uintx AdaptiveSizePolicyInitializingSteps       = 20                                  {product}
   uintx AdaptiveSizePolicyOutputInterval          = 0                                   {product}
   AllocatePrefetchStepSize                  = 16                                  {product}
    .......
  • java -XX:+PrintFlagsFinal -version
     .......
    intx WorkAroundNPTLTimedWaitHang               = 1                                   {product}
    uintx YoungGenerationSizeIncrement              = 20                                  {product}
    uintx YoungGenerationSizeSupplement             = 80                                  {product}
    uintx YoungGenerationSizeSupplementDecay        = 8                                   {product}
    uintx YoungPLABSize                             = 4096                                {product}
     bool ZeroTLAB                                  = false                               {product}
     intx hashCode                                  = 5                                   {product}
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

另外说明下:= 代表修改过

  • 查看默认的垃圾回收器
    java -XX:+PrintCommandLineFlags -version
E:\spring-boot\spring-boot-quickstart>java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=132843328 -XX:MaxHeapSize=2125493248 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

jps -l

    E:\spring-boot\spring-boot-quickstart>jps -l
    10016 org.jetbrains.jps.cmdline.Launcher
    11504 sun.tools.jps.Jps
    1572 org.jetbrains.jps.cmdline.Launcher
    7252 org.jetbrains.idea.maven.server.RemoteMavenServer
    10680 org.jetbrains.jps.cmdline.Launcher
    2488 com.demo.springbootquickstart.SpringBootQuickstartApplication
    2920
  jinfo -flag
   ````java
E:\spring-boot\spring-boot-quickstart>jinfo -flag MetaspaceSize 2488
-XX:MetaspaceSize=134217728
E:\spring-boot\spring-boot-quickstart>jinfo -flag MaxTenuringThreshold 2488
-XX:MaxTenuringThreshold=15

jinfo -flags

Attaching to process ID 2488, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.201-b09
Non-default VM flags: -XX:-BytecodeVerificationLocal -XX:-BytecodeVerificationRemote -XX:CICompilerCount=3 -XX:InitialHeapSize=134217728 -XX:+ManagementServer -XX:MaxHeapSize=2126512128 -XX:MaxNewSize=708837376 -XX:MetaspaceSize
=134217728 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=44564480 -XX:OldSize=89653248 -XX:TieredStopAtLevel=1 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargePagesIndividualAllocat
ion -XX:+UseParallelGC
Command line:  -XX:MetaspaceSize=128m -XX:TieredStopAtLevel=1 -Xverify:none -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=51823 -Dcom.sun.management.jmxremote.authenticate
=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=localhost -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true -javaagent:E:\Idea\IntelliJ IDEA 2018.2.3\lib\idea_rt.jar=51824:E:\I
dea\IntelliJ IDEA 2018.2.3\bin -Dfile.encoding=UTF-8
  • 美团的一个坑题
    -Xms,-Xmx属于jvm参数类型的哪种?x?orXX?
    其实-Xms,-Xmx类似数据库的别名一样,-Xms为:InitialHeapSize -Xmx为:MaxHeapSize

  • 你工作中用的jvm常用基本配置参数有哪些?
    (-Xmx与与-Xms配成一致)

    • -Xms 初始大小内存,默认为物理内存的1/64 等价于 -XX:InitialHeapSize
    • -Xmx 最大分配内存,默认为物理内存的1/4 等价于 -XX:MaxHeapSize
    • -Xss 设置单个线程栈的大小,一般为512k~1024k 等价于 -XX:ThreadStackSize
    • -Xmn 设置新生代大小
    • -XX 设计元空间大小
      元空间和永久代类似,都是jvm规范方法区的是实现。不过元空间和永久代最大的区别在于:元空间并不在虚拟机中而是使用本地内存。因此,默认情况下,元空间的大小受到 本地内存的限制
  • -XX:+PrintGCDetails
    -Xms10m -Xmx10m -XX:+PrintGCDetails

    byte[] b = new byte[50*1024*1024];  //创建一个超大对象  模拟OutOfMemoryError
    

运行上述代码直接OutOfMemoryError,如下报错细信息
[GC (Allocation Failure) [PSYoungGen: 1657K->488K(2560K)] 1657K->680K(9728K), 0.0015944 secs] [Times: user=0.02 sys=0.00, real=0.00 secs]
[GC (Allocation Failure) [PSYoungGen: 488K->456K(2560K)] 680K->648K(9728K), 0.0009643 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Allocation Failure) [PSYoungGen: 456K->0K(2560K)] [ParOldGen: 192K->623K(7168K)] 648K->623K(9728K), [Metaspace: 3213K->3213K(1056768K)], 0.0049357 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
[GC (Allocation Failure) [PSYoungGen: 0K->0K(2560K)] 623K->623K(9728K), 0.0044222 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (Allocation Failure) Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
at java8.T.main(T.java:17)
说明:
jvm常见面试题_第1张图片
jvm常见面试题_第2张图片

  • -XX:SurvivorRatio 默认 -XX:SurvivorRatio=8,Eden:SO1:SO2=8:1:1 美[ˈreɪʃioʊ]
  • -XX:NewRatio 新生代与老年代的比例 默认-XX:NewRatio =2 新生代1 老年代2 一般不用调
  • -XX:MaxTenuringThreshold 设置垃圾最大年龄 默认-XX:MaxTenuringThreshold=15 是有范围的我们修改只能在0-15之间

请你谈谈强引用 弱引用 软引用 虚引用分别是什么?

你可能感兴趣的:(jvm)