当前位置: 首页 > news >正文

第二章 Java内存区域与内存溢出异常

  • 运行时数据区域:

JVM

    • 程序计数器(Program Counter Register):
      当前线程执行码行号指示器,属于线程私有内存。字节码解释器工作时就是通过调整这个计数器的值来选取下一条需要执行
      字节码指令。当执行Java代码时,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果是本地Native方法时为空,
      该区域不会出现OutOfMemmoryError错误的区域。
    • Java虚拟机栈(Java VM Stack):
      线程私有,生命周期与线程一致。其描述了Java方法执行的内存模型:每个方法执行时都会创建一个对应的栈帧(Stack Frame)
      用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机
      栈中从入栈到出栈的过程。局部变量中存放了编译期可知的各种基本数据类型(64位long、double占用2个局部变量空间Slot)、
      对象引用、returnAddress类型。局部变量表所需内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大
      的局部变量表空间是完全确定的,在方法运行期不会改变局部变量表的大小。
      可能出现的异常:1.线程请求的栈深度大于虚拟机所允许的深度,StackOverflowError异常。2.如果虚拟机栈可以动态扩展,当扩展
      时无法申请足够的内存时,OutOfMemoryError异常。
    • 本地方法栈(Native Method Stack):
      与Java虚拟机栈相似,只是其描述的执行本地方法时内存区域,也是线程私有。
    • Java堆(Heap):线程共享,随虚拟机启动而创建,用途为存放对象实例,几乎所有的对象实例均在此处存放,是垃圾收集器工作
      的主要区域。现代收集器大都采用分代收集算法,故Java堆还可细分为:新生代和老年代,再细分为:Eden空间、From Survivor空
      间、To Survivor空间等。-Xmx -Xms调整其大小。
    • 方法区(Method Area):线程共享,存储虚拟机加载的类信息、常量、静态常量、即时编译器编译的代码等信息。
    • 运行时常量池(Runtime Constant Pool):是方法区一部分
    • 直接内存(Direct Memory):NIO直接分配堆外内存。
  • 虚拟机对象
    • 对象的创建:
      内存分配:虚拟机遇到一条new指令时,首先先去检查指令参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用
      代表的类是否已被加载、解析、初始化。如果没有,则执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新对象分配内
      存,对象所需内存的大小在类加载完成后便可完全确定。虚拟机为对象分配内存空间策略有两种:1.若果内存空间绝对规整,则采用“指
      针碰撞(Bump The Pointer)”,使用过的内存放在一侧,未使用过的内存放在另一侧,中间放着一个指针作为分界点的指示器,分配时
      只需将指针想空闲区域移动所需大小的区域即可完成分配。2.若果内存空间是不规整的,则需要采用“空闲列表(Free List)”,将空闲内
      存空间记录下来,每次分配时需要检查空闲列表来分配所需内存大小。选择哪种分配策略需要根据内存时否规整决定,而Java堆是否规
      整又由所采用的垃圾收集器是否带有压缩整理功能所决定的。防止内存分配过程中的并发问题:1.同步,CAS失败重试方案。2.本地线程
      缓冲(TLAB),线程分配内存隔离。
      内存初始化:内存分配完成后,将内存初始化为零值。
      对象设置:对象头(Object Head)
    • 对象的内存布局:对象头(Object Head)、实例数据(Instance Data)、对齐填充(Padding)
      对象头:1.存储对象自身运行时数据,哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳。
                       2.类型指针,指向该对象属于哪个类。
    • 对象的访问:栈上reference来操作堆上的具体对象。访问方式有两种:1.句柄 2.直接引用

转载于:https://www.cnblogs.com/jdktomcat/p/10241129.html

相关文章:

  • java 用进程调用外部命令并获取返回结果
  • 购物狂欢节的背后,是谁在让你在吃土?
  • Hadoop之HDFS中NameNode的工作机制
  • 目录操作常用命令
  • 史上最全的Python开发秘籍,学完这些年薪百万不是问题
  • 设计模式编写表单验证
  • spark hive python依赖第三方包
  • Asp 输出编码为UTF-8格式的XML内容的注意事项
  • [Leetcode] Permutations II
  • Acticles about Interface!
  • 【Camera专题】你应该熟悉的Camera驱动框架一(Hal层-kernel层)
  • HanLP分词命名实体提取详解
  • 染陌足迹——SeeConf2019
  • MyBatis-Plus 代码生成器
  • 归并排序(python)
  • C++类的相互关联
  • eclipse(luna)创建web工程
  • in typeof instanceof ===这些运算符有什么作用
  • PAT A1092
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SSH 免密登录
  • 飞驰在Mesos的涡轮引擎上
  • 极限编程 (Extreme Programming) - 发布计划 (Release Planning)
  • 计算机在识别图像时“看到”了什么?
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 扑朔迷离的属性和特性【彻底弄清】
  • 一、python与pycharm的安装
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 在Mac OS X上安装 Ruby运行环境
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​queue --- 一个同步的队列类​
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $L^p$ 调和函数恒为零
  • (02)vite环境变量配置
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (简单) HDU 2612 Find a way,BFS。
  • (三)Honghu Cloud云架构一定时调度平台
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .Net 路由处理厉害了
  • .net 验证控件和javaScript的冲突问题
  • .NET大文件上传知识整理
  • .NET中GET与SET的用法
  • @Autowired和@Resource装配
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [Asp.net MVC]Bundle合并,压缩js、css文件
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [BZOJ2850]巧克力王国
  • [EFI]ASUS EX-B365M-V5 Gold G5400 CPU电脑 Hackintosh 黑苹果引导文件
  • [element-ui] el-dialog 中的内容没有预先加载,因此无法获得内部元素的ref 的解决方案
  • [HDU 3555] Bomb [数位DP]
  • [iOS]-NSTimer与循环引用的理解