JVM 栈堆

Java虚拟机栈-栈内存溢出

  • Java虚拟机栈如果栈帧过多,占用内存超过栈内存可以分配的最大大小就会出现内存溢出
  • Java虚拟机栈内存溢出时会出现StackOverFlowError的错误

本地方法栈

  • Java虚拟机栈存储了Java方法调用时的栈帧,而本地方法栈存储的是native本地方法的栈帧
  • 在Hotspot虚拟机中,Java虚拟机和本地方法栈实现上使用了同一个栈空间。本地方法栈会在栈内存上生成一个栈帧,临时保存方法的参数同时方便出现异常时把本地方法的栈信息打印出来

  • 一般Java程序中堆内存是空间最大的一块内存区域,创建出来的对象都存在与堆上
  • 栈上的局部变量表中,可以存放堆上对象的引用,静态变量也可以存放堆对象的引用,通过静态变量就可以实现对象在线程之间共享
  • 堆空间有三个需要关注的值,used、total、max
  • used指的是当前已使用的堆内存,total是java虚拟机已经分配的可用堆内存,max是java虚拟机可以分配的最大堆内存
  • 随着堆内存的对象增多,当total可以使用的内存即将不足时,java虚拟机会继续分配内存给total
  • 如果堆内存不足,java虚拟机就会不断的分配内存,total值会变大。total最多只能与max相等
  • 如果不设置任何的虚拟机参数,max默认是系统内存的1/4,total默认是系统的1/64。在实际应用中一般都需要设置total和max的值
  • -Xms设置total -Xmx设置max,Xmx必须大于2MB,Xms必须大于1M

问题:是不是当used=max=total的时候,堆内存就溢出了呢?

  • 不是,堆内存溢出的判断条件比较复杂,跟垃圾回收器有关。
相关推荐
落魄大学生之流水线上谋生计11 小时前
JVM程序计数器详解
jvm
嘻哈baby1 天前
Go 函数中的参数为什么不支持默认值?
java·开发语言·jvm
wuminyu1 天前
Linux内核线程调度与虚拟线程调度机制系统级深度剖析
java·linux·c语言·jvm·c++
hfywmsj1 天前
广州餐饮铺位招租的选址架构:流量入口与成本函数分析
java·大数据·jvm·广州餐饮铺位招租
Tingjct2 天前
线程详细讲解---聚焦linux
linux·服务器·jvm
myy-learn2 天前
32 SQLITE数据库
jvm·数据库·sqlite
wuminyu2 天前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
郝学胜-神的一滴2 天前
C++11 工程级应用 08:Lambda表达式与Tuple元组
开发语言·jvm·c++·python·程序人生·开源
袋鼠云数栈3 天前
整库迁移与分库分表同步:批量数据搬迁的配置简化思路
jvm·数据库·oracle
Mr. zhihao3 天前
JVM 偏向锁 4 秒延迟:从源码动机到 JEP-374 废弃全链路
jvm·并发·偏向锁