面试题——JVM参数、引用、OOM

JVM的参数类型

1. 标配参数:
在JDK各个版本之间稳定,很少有大的变化

-version

-help

java -showversion

2. X参数:
在这里插入图片描述

-Xint  解释执行

-Xcomp  第一次使用就编译成本地代码

-Xmixed  混合模式(默认)

3. XX参数:(重点)

Boolean类型:

公式:

-XX:+或者- 某个属性值

+表示开启,-表示关闭

示例:

是否打印GC收集细节

开启:   -XX:+PrintGCDetails
关闭:   -XX:-PrintGCDetails

在这里插入图片描述

是否使用串行垃圾回收器

-XX:-UseSerialGC
-XX:+UseSerialGC

在这里插入图片描述

KV设值类型:
公式:

-XX:属性key=属性值value

示例:

设值元空间为128m
-XX:MetaspaceSize=128m

默认:接近21M
在这里插入图片描述
设值后:
在这里插入图片描述
在这里插入图片描述

示例:

设值老年代晋升年龄
-XX:MaxTenuringThreshold=15

在这里插入图片描述

jinfo举例,如何查看当前运行程序的配置:

jinfo -flags id

两个经典参数:-Xms和-Xmx:

-Xms 等价于 -XX:InitialHeapSize   初始堆内存
-Xmx 等价于 -XX:MaxHeapSize   最大堆内存

一般配置大小一致,防止堆扩展
-Xms 1024m (默认系统内存1/64)
-Xmx 1024m (默认系统内存1/4)
查看JVM参数

-XX:+PrintFlagsInitial
查看默认初始值:

java -XX:+PrintFlagsInitial -version

在这里插入图片描述

-XX:+PrintFlagsFinal
查看修改更新

java -XX:+PrintFlagsFinal -version

在这里插入图片描述

  • =为默认值
  • :=为修改后的值

运行时修改参数:

java XX:+PrintFlagsFinal -XX:MetaspaceSize=512m class文件名

-XX:PrintCommandLineFlags
打印命令行参数

java -XX:+PrintCommandLineFlags -version

在这里插入图片描述

常用JVM基本配置参数
-Xms  初始堆内存大小,默认为物理内存1/64
等价于 -XX:InitialHapSize
-Xmx 最大堆内存,默认为物理内存的1/4
等价于 -XX:MaxHeapSize
-Xss 初始栈内存,一般默认为512k~1024K
等价于 -XX:ThreadStackSize
如果为0,则使用的是系统默认值

JDK9默认值:
在这里插入图片描述

-Xmn 新生带大小
-XX:MetaspaceSize 元空间大小,使用本地内存,受本地内存限制
默认21807104,不到21M
-XX:+PrintGCDetails 打印GC细节
-XX:SurvivorRatio 设置新生代中eden和s0/s1的空间比例
默认:-XX:SurvivorRatio=8 ,Eden:s0:s1=8:1:1
假如:-XX:SurvivorRatio=4 ,Eden:s0:s1=4:1:1
-XX:NewRatio 配置年轻带与老年代在堆的结构比例
默认 -XX:newRatio=2 ,新生代占1,老年代占2,新生代占堆的1/3
假如 -XX:newRatio=4 ,新生代占1,老年代占4,新生代占堆的1/5
-XX:MaxTenuringThreshold 设置垃圾的最大年龄
默认为15
如果为0,则新生代GC后不经过Survivor,直接到老年代
强引用、软引用、弱引用、虚引用分别是什么?

整体架构:
在这里插入图片描述

强引用:
当内存不足,JM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死都不收

强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就能表明对象还“活着”,垃圾收集器不会碰这种对象。在Java中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是不可能被垃圾回收机制回收的,即使该对象以后永远都不会被用到JM也不会回收。因此强引用是造成Java内存泄漏的主要原因之一。

对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显式地将相应(强)引用赋值为null,一般认为就是可以被垃圾收集的了(当然具体回收时机还是要看垃圾收集策略)。

软引用:
软引用是一种相对强引用弱化了一些的引用,需要用java.lang.ref. SoftReference类来实现,可以让对象豁免一些垃圾收集。

对于只有软引用的对象来说,

  • 当系统内存充足时它不会 被回收
  • 当系统内存不足时它 会被回收。

软引用通常用在对内存敏感的程序中,比如高速缓存就有用到软引用,内存够用的时候就保留,不够用就回收!

弱引用:

弱引用需要用java.lang.ref.WeakReference类来实现,它比软引用的生存期更短,对于只有弱引用的对象来说,只要垃圾回收机制一运行, 不管JVM的内存空间是否足够,都会回收该对象占用的内存。

WeakHashMap:

在这里插入图片描述
虚引用:

虚引用需要java.lang.ref. PhantomReference类来实现。
顾名思义,就是形同虚设,与其他几种引用都不同,虛引用并不会决定对象的生命周期。

如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收,它不能单独使用也不能通过它访问对象,虚引用必须和引用队列(ReferenceQueue)联合使用。

虚引用的主要作用是跟踪对象被垃圾回收的状态。仅仅是提供了一种确保对象被finalize以后,做某些事情的机制。
PhantomReference的get方法总是返回null,因此无法访问对应的引用对象。其意义在于说明一个对象已经进入finalization阶段,可以被gc回收,用来实现比finalization机制更灵活的回收操作。

换句话说,设置虚引用关联的唯一目的,就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理。

Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。

总结:
在这里插入图片描述

OOM

java.lang.StackOverflowerError:
栈深度溢出,属于Error。

java.lang.OutOfMemoryError:java heap space
堆溢出,属于Error。

java.lang.OutOfMemoryError:GC overhead limit exceeded:
在这里插入图片描述
在这里插入图片描述

java.lang.OutOfMemoryError:Direct buffer memory:
在这里插入图片描述
在这里插入图片描述

java.lang.OutOfMemoryError:unable to create new native thread
在这里插入图片描述
在这里插入图片描述

java.lang.OutOfMemoryError:Metaspace
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值