本章主要介绍了Java的内存区域以及会触发对应区域内存溢出的触发条件及表现结果。同时还对java对象的内存布局进行了简单的讲解。

2.2 运行时数据区域:

比较直观的一张图来表示:

Java虚拟机运行时数据区

然后分别介绍了各个区域存储的主要对象及工作原理:

2.2.1 程序计数器

概念:程序计数器又叫PC或者PCG(Program Counter Register),是一块很小的内存空间,它可以看作是当前线程所执行的字节码行号的指示器。在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取吓一跳需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都是依赖这个计数器来完成的。

2.2.2 Java虚拟机栈(JVM Stacks)

与程序计数器一样,Java虚拟机栈也是线程私有的,它的生命周期和线程是相同的。虚拟机栈描述的是Java方法执行的内存模型:每一个方法在执行时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法的调用与完成的过程,就对应着一个栈帧在虚拟机栈中的入栈到出栈的过程。

在Java虚拟机闺房中,做了如下规定:当线程请求的栈深度大于虚拟机所允许的深度,则会抛出StackOverFlowError异常;而当虚拟机栈可以动态扩展,并且当扩展时无法申请到足够的内存时,就会抛出OutOfMemeryError异常。

2.2.4 Java堆

对于大多数应用来说,Java堆(Java heap)是Java虚拟机所管理的内存中最大的一块。Java堆内存在虚拟时启动时创建,这块内存区域被所有线程共享。此内存区域的唯一目的就是存放对象示例,几乎所有的对象实例都在这里分配内存。

Java堆是垃圾收集器管理的主要区域。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

2.2.5 方法区

方法区和Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

2.2.7 直接内存(direct memory)

在JDK1.4中新进入了NIO类,引入了一招能够基于通道(channel)与缓冲区(Buffer)的I/O方式,它可以使用native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。如果我没记错的话,Netty中NIO是虚饮用的一种应用场景。

2.3.2 对象的内存模型

在Hotspot虚拟机中,对象在内存中的存储布局可以分为3块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。

1.对象头

对象头包含两部分信息:

1.1 Mark Word

主要用于存储以下信息:如HashCode、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。在Hotspot中的实现见下图:

Mark Word

1.2 类型指针

即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。如果对象是一个Java数据,那在对象头中还必须有一块用于记录数组长度的数据。

java docx 内存溢出_第2章 Java内存区域与内存溢出异常相关推荐

  1. 写java线程导致电脑内存不足_如何写出让java虚拟机发生内存溢出异常OutOfMemoryError的代码...

    程序小白在写代码的过程中,经常会不经意间写出发生内存溢出异常的代码.很多时候这类异常如何产生的都傻傻弄不清楚,如果能故意写出让jvm发生内存溢出的代码,有时候看来也并非一件容易的事.最近通过学习< ...

  2. java 以一个最高有效位为1的二进制数字开始_第02章 Java编程基础

    ·本章学习目标 熟悉Java编程的基础知识 掌握Java语言的基本数据类型.操作符.表达式 掌握Java程序的流程控制语句 熟悉并学会初步使用Java编程环境 ·本章学习内容 数据类型 常量.变量与表 ...

  3. java 可以直接当自定义标示符_第2章 Java基本语法.ppt

    <第2章 Java基本语法.ppt>由会员分享,可在线阅读,更多相关<第2章 Java基本语法.ppt(55页珍藏版)>请在人人文库网上搜索. 1.第2章了解Java基本语法, ...

  4. java基础案例教程第二章_第2章Java编程基础_补充案例教程.doc

    第2章Java编程基础_补充案例教程 博学谷--让IT教学更简单,让IT学习更有效博学谷--让IT教学更简单,让IT学习更有效 PAGE \* MERGEFORMAT34PAGE \* MERGEFO ...

  5. java获取内存基址_安卓逆向|菜鸟的FRIDA学习笔记:内存读写

    假设你的手机已经root,并已开启frida服务,电脑端已安装好Python,frida,IDA,GDA. 样本地址: 链接: https://pan.baidu.com/s/1y3kIXcBv25Q ...

  6. java C语言内存占用_使用Cgroup限制Java使用的内存量-思路

    1.      对一个正在运行着的进程来说,在不到达其内存使用量边界的情况下,扩大/缩小其cgroup分配的内存不会对它产生任何影响. 2.      在进程已经使用了一定量的内存的情况下,缩小其cg ...

  7. java虚拟机手动内存分配_《深入理解java虚拟机》-垃圾收集器与内存分配策略

    如何判断对象已死? 引用计数算法 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器减1:其中计数器为0的对象是不可能再被使用的已死对象. 引用计数算法的实现很简单 ...

  8. java 加法 溢出_关于数字:Java 8 Unsigned Integer加法和潜在的溢出

    我正在从Cay S. Horstmann的"真正不耐烦的Java SE 8"一书中进行练习. 基于Number类的改进的一项练习要求: Write a program that a ...

  9. java 虚拟机的存储_《深入理解java虚拟机》之内存模型与安全

    不同的平台,内存模型是不一样的,但是jvm的内存模型规范是统一的.其实java的多线程并发问题最终都会反映在java的内存模型上,所谓线程安全无非是要控制多个线程对某个资源的有序访问或修改.总结jav ...

最新文章

  1. 赤兔四足机器人的作用_跑得快,打不死!清华大学开发“小强”机器人,壮汉狂踩也挡不住前进步伐...
  2. php 小数点 乘法,js小数点数字相乘、把小数点四舍五入保留两位小数
  3. 使用Nito.AsyncEx实现异步锁
  4. HH SaaS电商系统的商品关联版式功能模块设计
  5. [HDOJ]1005. Number Sequence
  6. java随机数生成三位数_Java编写一程序编写一程序,实现下面功能.(1)随机产生200个三位的正整数,按每行10个数输出.(2)统计其中偶数和...
  7. Win10屏幕自带的截图,同时保存多个截图
  8. 【刘润五分钟商学院】-163生存,还是灭亡,没有中间态
  9. 【面试:基础篇06:FailFast与FailSafe机制】
  10. 无盘服务器网卡延时高,无盘网卡优化-解决秒卡,速度慢,速度不稳定问题
  11. php加密解密文件内容,php文件加密解密 - osc_0g0vbf0z的个人空间 - OSCHINA - 中文开源技术交流社区...
  12. 人脑功能连接与相似性分析:基于Python
  13. python 柱状图折线图共用一个图例_Python数据可视化–折线图–柱状图
  14. 微信小程序开发 | 02 - 轮播图实现(swiper组件)
  15. 银行管理系统 Java语句
  16. 数据挖掘(一)频繁模式挖掘算法的实现和对比
  17. [Linux RK Debian 10] chrome浏览器开启GPU硬件加速|CSDN创作打卡
  18. 好用app开屏广告组件XHLaunchAd -支持静态/动态图片广告/mp4视频广告
  19. RPM完全安装升级另类用法
  20. 科讯CMS--将自己的ASP加进去

热门文章

  1. Craigslist模式在中国如何复制?中国特色的差异化在哪里?,互联网营销
  2. NeHe OpenGL第十九课:粒子系统
  3. JDBC--使用配置文件动态创建数据库
  4. Express 项目结构最佳实践(上)
  5. sccm 2007 r2 step by step 之十五 补丁管理
  6. 5-Java多态性理解
  7. xtrabackup 排错
  8. CentOS 6 编译安装subversion-1.8.10+Apache2.4
  9. 读取excel并将其转换为xml
  10. IBM X60/X61无光驱安装XP