学习《深入理解Java虚拟机 JVM高级特性域最佳实践》,学习到了JVM中常见的OutOfMemory和StackOverFlow产生的机理,感觉非常有用。

1.平时代码运行时遇到这两种错误后就可以根据具体情况去适时地调整JVM参数来处理问题

2.平时写代码的时候也会多加注意,不要让代码产生这两种异常

下面就记录下,当作学习笔记。

首先必须了解JVM运行时数据区域

方法区 

用于存储已被JVM加载的类信息,常量,静态变量,即时编译器编译后的代码,线程共享。

运行时常量池

方法区一部分。存放编译期生成的各种字面量和符号引用。

虚拟机栈

内部创建栈帧,来存放局部变量表,操作数栈,动态链接,方法出口等,线程私有。

本地方法栈(HotSpot不区分虚拟机栈和本地方法栈)

类似虚拟机栈,但是只为Native方法服务。

存放实例对象和数组,线程共享。

程序计数器

存放当前线程执行的字节码的行号。

1.产生堆溢出

堆是存放实例对象和数组的地方,当对象多过设置的堆大小,同时避免GC回收即可。最大内存块Xmx和最小内存块Xms一样,堆就不可扩展了。将new出的对象放到List中可防止GC回收。

/** VM args: -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * Xms equals Xmx lead to head value can't extend*/
import java.util.ArrayList;
import java.util.List;
public class HeapOOM {static class OOMObject {}public static void main(String[] args) {List<OOMObject> list = new ArrayList<OOMObject>();while (true) {list.add(new OOMObject());}}
}

2.产生虚拟机栈或本地方法栈StackOverFlow

当请求的栈深度超过JVM允许最大深度即可,用Xss设置

/**VM args: -Xss128K*/
public class JavaVMStackSOF {private int stackLength = 1;public void stackLeak() {stackLength++;stackLeak();}public static void main(String[] args) throws Throwable {JavaVMStackSOF oom = new JavaVMStackSOF();try {oom.stackLeak();} catch(Throwable e) {System.out.println("stack length:" + oom.stackLength);throw e;}}
}

3.产生虚拟机栈或方法栈OutOfMemory

不断创建线程

/** VM args: -Xss2M*/
public class JavaVMStackOOM {private void dontStop() {while (true) {}}public void stackLeakByThread() {while (true) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {dontStop();}});thread.start();}}public static void main(String[] args) {JavaVMStackOOM oom = new JavaVMStackOOM();oom.stackLeakByThread();}
}

4.运行时常量池异常

使用String.interm()填充常量池。intern的左右是如果该常量不再常量池中,则添加到常量池,否则返回该常量引用。常量池是方法区一部分,运行时可限制方法区PermSize和最大方法区MaxPermSize大小

/** VM args: -XX:PermSize=10M -XX:MaxPermSize=10M*/import java.util.List;
import java.util.ArrayList;public class RuntimeConstantPoolOOM {public static void main(String[] args) {//keep reference,avoid GC collectList<String> list = new ArrayList<String>();//10M PermSize in integer range enough to lead to OOMint i = 0;while (true) {list.add(String.valueOf(i++).intern());}}
}

5.方法区溢出

通过CGLib将大量信息放到方法区

/** VM args: -XX:PermSize=10M -XX:MaxPermSize=10M*/
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;public class JavaMethodAreaOOM {public static void main(String[] args) {while (true) {Enhancer enhancer = new Enhancer();enhancer.setSuperclass(OOMObject.class);enhancer.setUseCache(false);enhancer.setCallback(new MethodInterceptor() {public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {return proxy.invokeSuper(obj, args);}});enhancer.create();}}static class OOMObject() {}
}

JVM中OOM和SOF的产生相关推荐

  1. 【重难点】【JVM 01】OOM 出现的原因、方法区、类加载机制、JVM 中的对象

    [重难点][JVM 01]OOM 出现的原因.方法区.类加载机制.JVM 中的对象 文章目录 [重难点][JVM 01]OOM 出现的原因.方法区.类加载机制.JVM 中的对象 一.OOM 出现的原因 ...

  2. 蚂蚁面试:字符串在JVM中如何存放?

    字符串对象在JVM中可能有两个存放的位置:字符串常量池或堆内存. 使用常量字符串初始化的字符串对象,它的值存放在字符串常量池中: 使用字符串构造方法创建的字符串对象,它的值存放在堆内存中: Strin ...

  3. JVM发生OOM的 8 种原因、及解决办法

    转载自  JVM发生OOM的 8 种原因.及解决办法 1.Java 堆空间 发生频率:5颗星 造成原因 无法在 Java 堆中分配对象 吞吐量增加 应用程序无意中保存了对象引用,对象无法被 GC 回收 ...

  4. hotspot jvm_在Hotspot JVM中跟踪过多的垃圾收集

    hotspot jvm 由于内存泄漏或其他内存问题,经常导致应用程序冻结,仅使垃圾收集器(GC)进程运行失败,试图释放一些空间. 直到看门狗(或沮丧的管理员)重新启动应用程序并且问题从未解决之前,这种 ...

  5. 在Hotspot JVM中跟踪过多的垃圾回收

    由于内存泄漏或其他内存问题,经常导致应用程序冻结,仅使垃圾收集器(GC)进程运行失败,试图释放一些空间. 直到看门狗(或沮丧的管理员)重新启动应用程序并且问题从未解决之前,这种情况一直发生. 本文的目 ...

  6. 【java】JVM中Perm区持续上涨问题

    1.概述 转载:JVM中Perm区持续上涨问题 Java应用Perm区一直呈上涨趋势的原因可以用一个简单的办法排查,就是用btrace去跟踪下是什么地方在调用ClassLoader.defineCla ...

  7. 字符串在JVM中如何存放 及常量池技术

    字符串对象在JVM中可能有两个存放的位置:字符串常量池或堆内存. 使用常量字符串初始化的字符串对象,它的值存放在字符串常量池中: 使用字符串构造方法创建的字符串对象,它的值存放在堆内存中: Strin ...

  8. 什么情况下java会出现堆溢出_【Java面试题第三期】JVM中哪些地方会出现内存溢出?出现的原因是什么?...

    内存溢出(Out Of Memory)经常简称为OOM,在jvm中主要分为方法区.堆.栈.本地方法栈.程序计数器这几部分,其中程序计数器是唯一不会出现OOM的,也就是说其他区域都会出现OOM.下面来分 ...

  9. 7. 重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用

    重磅硬核 | 一文聊透对象在JVM中的内存布局,以及内存对齐和压缩指针的原理及应用 大家好,我是bin,又到了每周我们见面的时刻了,我的公众号在1月10号那天发布了第一篇文章?<从内核角度看IO ...

最新文章

  1. Android studio第一次使用配置(三)gradle项目构建
  2. CentOS 安装与优化
  3. linux 网络连接未知,ubuntu – 网络问题. Ifup说未知界面
  4. Unity间隔或延迟固定的时间让物体移动一下,绘制线条
  5. 电脑主板资料库 03【转至www.ongood.com.tw】【FreeXploiT收集整理】
  6. 动态服务器值 回放报错 没有关联到_LR关联(带附件) - 缺1份淡定ㄣ - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  7. oracle用nas还是本地存储,为什么大家都在用NAS网络存储?
  8. 领导含泪叮嘱我:MySQL 建表字段记得用 not null,不然就收拾包袱滚蛋
  9. 高质量程序设计指南(笔记)
  10. linux 添加系统启动,怎样把这个linux系统添加到启动选项?
  11. 高德导航过程中实时获取道路信息
  12. 达人评测 i7 12700H和R7 6800H选哪个好
  13. JAVA 计算圆的面积和周长: 创建一个圆Circle类。为该类提供一个变量r表示半径,一个常量PI表示圆周率; * 同时为该类提供两个方法:方法一用于求圆的面积,方法二用于求圆的周长;
  14. 柏林是哪个系统的服务器,柏林系统其实很“佛系”,明白了这些你也能玩好海缸!...
  15. 百度人脸识别实现方法
  16. 分布式计算模式:MapReduce
  17. 富士康服务器linux运维,【2019IT运维十大样板工程】富士康云桌面及智能运维项目...
  18. 堡垒之夜 服务器显示离线,堡垒之夜怎么是离线状态 | 手游网游页游攻略大全...
  19. opencv读图的坐标系转换问题
  20. Java复习打卡day40

热门文章

  1. 未来教育的趋势:线上网校和线下教育相结合
  2. 趣拿整合线上线下营销,解决新品推广痛点
  3. 老程序员吐槽,今天面试了一个被培训班坑了的学生
  4. 力扣刷题记录-回溯算法相关题目
  5. 计算机毕设Python+Vue音乐鉴赏网站前端开发(程序+LW+部署)
  6. 《从零开始搭建游戏服务器》Linux开发环境配置
  7. 2022美赛F题题目及思路--人人为我,我(空间)为人人
  8. 爱,不留——陈光标裸捐之后
  9. 小方块上升组成背景特效 html+css+js
  10. apmserv mysql5.1启动失败,win10系统无法正常运行apmserv显示apache和mysql启动失败怎么办...