常见的JAVA虚拟机HotSpot虚拟机运行时数据库由5部分构成:方法区,堆,虚拟机栈,本地方法栈,程序计数器。下面列举各个部分可能出现的异常及其出现原因。

1.方法区存放的已被虚拟机加载的类型信息,常量、静态变量、即时编译器编译后的代码缓存等数据。可能出现的异常有OutOfMemoryError,原因可能是创建了过多的常量(不太可能,因为自JDK7起,原本存放在永久代中的字符串常量池被移至Java堆中,故JDK7前的运行池常量溢出报错由OOM:PerGem space变为了OOM:Java heap space),生成大量动态类,大量JSP或动态产生JSP文件的应用(JSP第一次运行时需要编译为Java类)、使用了CGLib字节码增强和动态语言,基于OSGi的应用(即使是同一个类,被不同的加载器加载也会视为不同的类)等。

2.堆是虚拟机所管理的内存中最大的一块,唯一目的是存放对象实例。可能出现的异常有OutOfMemoryError,原因是Java堆中没有内存能够完成实例分配,并且堆也无法再扩展。解决办法:使用参数-Xmx提高最大堆容量。检查是否存在某些对象生命周期过长、持有状态时间过长、存储结构设计不合理等情况。

3.虚拟机栈和本地方法栈发挥的作用非常相似,在HotSpot虚拟机两者合二为一,存储局部变量表、操作数栈、动态连接、方法出口等信息。如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常;出现StackOverflowError的原因可能时本地变量过多或者栈内存容量太小,解决办法:使用-Xss提高栈容量最小值。

如果虚拟机的栈内存允许动态扩展,当扩展栈容量无法申请到足够的内存时,将抛出OutOfMemoryError异常(HotSpot虚拟机不支持扩展,所以只有创建线程申请内存时就因为无法获得足够的内存而出现OutOfMemoryError异常)。出现的原因可能是创建的线程过多,解决办法:减少线程数量,减少最大堆和减少栈容量换取更多的线程(总的内存有限,减去堆和方法区的容量,剩余的内存会多些)。

4.程序计数器不会出现异常。

以上是通过周志明老师的《深入理解Java虚拟机》得到的小结。

sas java 虚拟机异常_深入理解JAVA虚拟机之异常诊断相关推荐

  1. java 准备 解析_深入理解JAVA虚拟机学习笔记24——类加载的准备和解析

    每天进步一点点! 今天我们一起看一下类加载的准备阶段和解析阶段. 先看一下准备阶段:主要任务是在方法区中为类变量(仅static修饰变量,不包含实例变量)分配内存并设置类变量初始化的阶段. 这里面的区 ...

  2. java虚拟机编程_深入理解Java虚拟机(一)

    一.运行时数据区域 1.程序计数器: 当前线程执行字节码的行号指示器(通过改变计数器的值来选择下条需要执行的字节码指令) 每个线程有独立的程序计数器(线程私有,为了切换线程时能恢复到挣钱的执行位置) ...

  3. java 常量折叠_深入理解Java虚拟机之早期编译器优化

    Javac编译器 Javac编译器是一个由Java语言编写的程序 Javac的源码与调试 从Sun Javac的代码来看,编译器大致分为3个过程: 解析与填充符号表的过程 插入式注解处理器的注解处理过 ...

  4. 深入理解java虚拟机 新生代_深入理解java虚拟机:笔记

    1.运行时数据区域 1.程序计数器 当前线程执行字节码的行号指示器,字节码解释器工作通过改变这个计数器的值来选取下一条需要执行的字节码指令,每一个线程拥有独立的程序计数器,线程私有的内存 2.虚拟机栈 ...

  5. java虚拟机现状_深入理解java虚拟机的故障处理工具

    前言 本文主要给大家介绍的是java虚拟机的故障处理工具,文中提到这些工具包括: 名称 主要作用 jps JVM process Status Tool, 显示指定系统内所有的HotSpot虚拟机进程 ...

  6. java class教程_深入理解Java Class文件格式(七)

    本专栏列前面的一系列博客, 对Class文件中的一部分数据项进行了介绍. 本文将会继续介绍class文件中未讲解的信息. 先回顾一下上面一篇文章. 在上一篇博客中, 我们介绍了: this_class ...

  7. java事件处理模型_从零开始理解JAVA事件处理机制(3)

    我们连续写了两小节的教师-学生的例子,必然觉得无聊死了,这样的例子我们就是玩上100遍,还是不知道该怎么写真实的代码.那从本节开始,我们开始往真实代码上面去靠拢. 事件最容易理解的例子是鼠标事件:我们 ...

  8. java对象实例_深入理解Java对象实例生成的例子!(转)

    深入理解Java对象实例生成的例子!(转)[@more@]代码如下: class A { public int Avar; public A() { System.out.println(" ...

  9. 如何理解Java自动装箱_如何理解Java中的自动拆箱和自动装箱?

    如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这...这..知识盲区... 回到家后小伟赶紧查资料,我透,这不就是问基本类型跟封装类型吗,面试官整啥名词呢... ...

最新文章

  1. 值得深思的问题——分库分表就能无限扩容吗?
  2. Inno Setup使用教程大全
  3. 文件流习题8.3 8.4
  4. sed文本数据流处理命令
  5. 声谱图,梅尔语谱,倒谱,梅尔倒谱系数
  6. oracle with as用法_关于Oracle with语句用法说明
  7. 面试官:说说什么是 Java 内存模型(JMM)?
  8. 谷歌翻译器 6.2.620 电脑版
  9. MongoDB课堂笔记
  10. 空城计课件软件测试,空城计课件参考
  11. unshift() 方法php,unshift方法怎么使用
  12. QT C2220: 警告被视为错误 - 没有生成“object”文件
  13. 设计人工智能产品:技术可能性、用户合意性、商业可行性
  14. 微软电脑管家V2.1公测版正式发布
  15. Ubuntu 16.04 安装Java jdk-8u171-linux-x64.tar.gz 教程
  16. 校园跑腿小程序毕业设计毕设作品开题报告答辩PPT
  17. SVN 学习笔记-高级操作
  18. 苹果手机以旧换新活动_苹果中国宣布以旧换新活动延期至3月25日
  19. JS中预处理是一种好无节操的机制
  20. java—面向对象【学习笔记2】

热门文章

  1. Linux下的设计模式——委派模式(Delegate Pattern)深入浅出【建议新手收藏】
  2. 计算机网络OSI模型、TCP/IP模型与5G协议
  3. C++字符串操作总结
  4. mysql左连接_面试考MySQL性能优化,一个问题就干趴下了!
  5. pythonisnan_python - 在NumPy中快速检查NaN
  6. Firebase可监控网页应用程序效能 更新其Analytics受众系统
  7. 如何实现登录、URL和页面按钮的访问控制?
  8. 关于CSS与HTML知识点总结(二)
  9. Kotlin开发细节
  10. Hacker-基础学习(1)