jvm内存溢出实战解析-java

直接上代码

第一种内存溢出情况,堆溢出1.0(OOM)

jvm配置如下图

jvm内存溢出实战解析-java

说明:配置1:堆最大和最小设置成5M:。配置2:打印jvm,GC情况

jvm内存溢出实战解析-java

运行结果

jvm内存溢出实战解析-java

说明 :报错OOM 之   GC overhead limit exceeded

出现原因:某个循环在不断的分配对象,但是分配的太多,把堆撑爆了。(就行温水煮青蛙一样,不停分配对象,达到临界值了,GC开始不停的回收,GC发现我再怎么回收也没用,就放弃治疗了。)

 

第二种内存溢出情况,堆溢出2.0(OOM)

jvm配置如下图

jvm内存溢出实战解析-java

说明:同情况1

jvm内存溢出实战解析-java

运行结果

jvm内存溢出实战解析-java

说明 :报错OOM 之   Java heap space

出现原因:在分配的时候,有巨型对象在分配(类似一个5L的水桶,一上来你就要导进去6L的水,一下子就溢出了,GC尝试了几次,就放弃挣扎了)。

 

第三种内存溢出情况,堆溢出3.0(OOM)

jvm配置如下图

jvm内存溢出实战解析-java

说明:配置1:堆设置为3M:。(这边说明一下,这是设置jdk1.8元空间

jvm内存溢出实战解析-java

运行结果

jvm内存溢出实战解析-java

说明 :报错OOM 之   thrown from the UncaughtExceptionHandler in thread "main"

出现原因:内存空间小的不足以运行起项目了。

第四种内存溢出情况,栈溢出1.0(StackOverflowError)

jvm配置如下图

jvm内存溢出实战解析-java

jvm内存溢出实战解析-java

运行结果

jvm内存溢出实战解析-java

说明 :报错StackOverflowError 之  java.lang.StackOverflowError

出现原因:由于调用方法需要栈产生栈帧,无限递归产生栈帧又不释放栈帧,导致栈帧溢出。(这里要说明一下,如果将调用的方法复杂程度变高,这样能够产生的栈帧层数就越少。在现实过程中,树的结构 有递归 和  非递归 算法 ,非递归的算法优化处就在于减少栈帧,所带来的开销。)