Java堆溢出

JVM运行时分区的堆区是占比最大的,它用来存储对象的,每当我们new一个对象,而且要保证这个对象到GC Roots 那些对象是有路径可达的(不可达就有很大可能性被清除),那么当对象的数量超过最大堆容量后就会产生内存溢出异常(Out Of Memory)。

我们可以自己设置JVM的相关参数:
-Xms:用来设置堆的最小值;
-Xms:用来设置堆的最大值。

Java堆内存出现的OOM异常其实是我们实际开发中最常见的内存溢出的一种情况。Java堆内存溢出时,Java异常堆栈信息“java.lang.Out Of Memory”会进一步提示"java heap space"这就很清楚的告诉我们溢出发生在堆上。

下面补充两个知识点内存泄漏和内存溢出:
内存泄漏:泄露对象不能被GC;
内存溢出:此时内存对象应该存活。就有两种方式可以解决:1.根据JVM堆参数与物理内存相比较检查是否应该把JVM堆内存调大;2.或者检查对象的生命周期是否过长。

虚拟机栈和本地方法栈溢出

现在都在用的HotSpot把虚拟机栈和本地方法栈合在一起实现,所以对于HotSpot这个虚拟机来说,栈容量只需要由Xss一个参数就能设置。我们都知道每当有一个线程出现,JVM就会给他分配固定大小的栈空间供他使用,在这个线程调用方法的同时,栈内部会创建一个个栈帧来描述方法的执行过程,随着一个个栈帧的创建,当这个空间超过刚开始分配给这个线程的空间时,就会抛出StackOverFlow异常;还有一种情况就是当要为一个线程创建栈空间时发现已经没有足够的空间去分配时就会抛出OOM异常。

两种异常对应的解决方法:

  1. 因为出现StackOverFlowError这个异常时我们有错误堆栈可以去追溯,问题出现在哪里会被找到。虚拟机默认参数其实够我们日常的调用(包括递归)。
  2. 如果是因为多线程导致的内存不够用而出现的内存溢出问题,在不能再少线程数的情况下,减少最大堆和减少栈的容量来能给更多线程创分配栈空间。

Java堆溢出,虚拟机栈和本地方法栈溢出相关推荐

  1. 46栈内存溢出、内存区域(程序计数器、Java 虚拟机栈、本地方法栈、Java 堆、方法区、直接内存、内存溢出)与内存溢出(对象实例化分析)

    46.什么情况下会发生栈内存溢出 46.1.Java 内存区域与内存溢出 46.1.1.内存区域 46.1.1.1.程序计数器 46.1.1.2.Java 虚拟机栈 46.1.1.3.本地方法栈 46 ...

  2. 11.JDK8内存模型、本地方法栈、虚拟机栈、栈帧结构(局部变量表、操作数栈、方法出口、虚拟机栈与本地方法栈的关系、寄存器、方法区、堆(Heap)、jvm中的常量池、Metaspace(元空间))

    11.JDK8内存模型 11.1.本地方法栈(Native Method Stacks) 11.2.虚拟机栈(Java Virtual Machine Stacks) 11.3.栈帧结构 11.3.1 ...

  3. java 本地方法栈_Java虚拟机栈和本地方法栈

    Java虚拟机栈的特征 线程私有 后进先出(LIFO)栈 存储栈帧,支持Java方法的调用.执行和退出 可能出现OutOfMemoryError异常和StackOverflowError异常 Java ...

  4. 12.JDK1.8 JVM运行时数据区域概览、各区域介绍、程序计数器、Java虚拟机栈、本地方法栈、堆、堆空间内存分配(默认情况下)、字符串常量池、元数据区、jvm参数配置

    12.JDK1.8 JVM运行时数据区域概览 12.1.JDK1.8 JVM运行时数据区域概览 12.2.各区域介绍 12.3.各区域介绍 12.3.1.程序计数器 12.3.2.Java虚拟机栈 1 ...

  5. 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)

    前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会 ...

  6. 从几个sample来学习Java堆,方法区,Java栈和本地方法栈

    2019独角兽企业重金招聘Python工程师标准>>> 最近在看<深入理解Java虚拟机>,书中给了几个例子,比较好的说明了几种OOM(OutOfMemory)产生的过程 ...

  7. 五种内存溢出案例总结:涵盖栈深度溢出、永久代内存溢出、本地方法栈溢出、JVM栈内存溢出和堆溢出

    大家好,我是冰河~~ 相信小伙伴们在平时工作的过程中,或多或少都会遇到一个场景:内存溢出.如果你没有遇到过这个场景,那就说明你是个假的程序员.哈哈,开个玩笑,平时工作过程中,我们确实会遇到这个问题.今 ...

  8. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )(转发)

    这两天看了一下深入浅出JVM这本书,推荐给高级的java程序员去看,对你了解JAVA的底层和运行机制有 比较大的帮助. 废话不想讲了.入主题: 先了解具体的概念: JAVA的JVM的内存可分为3个区: ...

  9. JVM 内存初学 (堆(heap)、栈(stack)和方法区(method) )

    JAVA的JVM的内存可分为3个区:堆(heap).栈(stack)和方法区(method) 堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指 ...

最新文章

  1. C#用 SendKyes 结合 Process 或 API FindWindow、SendMessage(PostMessage) 等控制外部程序
  2. vagrant box php开发环境配置 -- 重新打包发布vagrant box
  3. UA MATH571B 试验设计 QE练习题1
  4. 【Java线程】线程同步—synchronized Lock
  5. 如何使用Sublime Text 3作为Markdown编辑器
  6. easyui datagrid url不请求请求_Go Web编程--深入学习解析HTTP请求
  7. css base64 图片背景
  8. 电工模拟接线软件 app_超全的电工接线方法口诀
  9. 和丰钢结构企业erp管理软件
  10. Python就业指导
  11. 条码打印机打印出白纸怎么回事
  12. QQ微信营销软件防封操作秘籍
  13. 基于Arduino IDE开发的ESP8266(ESP-12F)项目4 ——中断及高级输入输出
  14. 被大公司“圈养”的年轻人
  15. C语言程序设计(第四版,建议复习用,无死角)
  16. 【Tanzu 社区版=TCE】 Mac 笔记本快速部署安装体验-(二)
  17. CSDN 有人通过用户推荐关注了你 到底是什么意思?
  18. EasyDSS高性能流媒体服务器开发RTMP直播同步输出HLS(m3u8)录像功能实现时移回放的方案
  19. uniapp小程序,实现每次进入页面时自动开启 30 秒的倒计时。
  20. 机器人开发实践源码编译报错问题解决方法

热门文章

  1. strace命令(收集整理,常看常新)
  2. ping通网关 ping不通dns
  3. linux多线程编程之互斥锁
  4. Regex.Match 方法
  5. vue-seamless-scroll在小米手机上显示不正常 显示出两行的问题
  6. LeetCode--11.盛最多的水(双指针,暴力)
  7. Tips--解决安装matplotlib无法使用pyplot的问题
  8. 下列类型不是mysql_下列( )类型不是MySQL中常用的的数据类型。
  9. 【进阶技术】一篇文章搞掂:OAuth2
  10. 【Docker系列教程之三】Docker容器是如何工作的