1、程序计数器

1、什么是程序计数器

当前线程所执行的字节码的行号指示器

2、特点

线程私有:每个线程都有一个独立的程序计数器,互不影响,独立存储,便于线程的切换

3、工作机制

所属的线程执行Java方法:记录虚拟机字节码指令地址

所属线程执行native方法:为空,

4、异常

不存在内存溢出等异常,例如outofMemoryErrory

2、Java虚拟机栈

1、什么是Java虚拟机栈

Java方法执行的内存模型

2、特点

线程私有:每个线程都有一个Java虚拟机栈,线程结束,栈帧也结束

3、工作机制

当Java方法被执行的时候会创建一个栈帧,存储了局部变量表、操作栈、动态连接、方法出口等消息。方法开始执行该栈帧入栈、方法结束该栈帧出栈。

4、补充

1、局部变量表:基本数据类型、对象引用类型、returnAddress类型

基本数据类型:Boolean(1)、byte(1)、char(1)、short(1)、int(1)、float(1)、long(2)、double(2)---占用的局部变量空间

对象引用类型:reference类型,指向对象起始地址的引用指针\代表对象的句柄\表示对象相关的位置

returnAddress:指向一条字节码指令的位置

2、局部变量表在编译期完成分配局部变量空间。运行期间不会再改变

3、两种异常:

stackOverflowError:线程请求的栈深度大于虚拟机所允许的深度

OutOfMemoryError:线程请求的深度超过了虚拟机动态扩展的深度

3、本地方法栈

1、什么是本地方法栈

Java native方法执行的内存模型

2、特点

同Java虚拟机栈

3、运行机制

同Java虚拟机栈(注意这里的本地方法栈仍然会抛出stackOverflowError、OutOfMemoryError两种异常。只是程序计数器不会抛出OutOfMemoryError异常)

总结:程序计数器、Java虚拟机栈、native虚拟机栈随线程而生,随线程而灭

4、Java堆

1、什么是Java堆

是Java虚拟机中存放对象实例的一块最大的内存区域。也是垃圾收集器管理的主要区域。

2、特点

  • 所有线程共享
  • 物理不连续、逻辑连续

3、运行机制

在Java虚拟机启动时创建,为所有的对象实例分配内存。当堆的内存无法完成实例分配的时候,会抛出OutofMemory异常。线程结束回收内存。

5、方法区

1、什么是方法区

存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码数据。

2、特点

  • 所有线程共享
  • 属于堆的一个逻辑部分
  • 不需要连续的内存空间
  • 同样也需要实现垃圾收集(虽然大家都把方法区当成了“永久代”)

3、运行机制

主要针对常量池的回收以及类型的卸载,无法满足内存分配需求时,抛出outofmemory异常

6、运行时常量池

1、什么是运行时常量池

存放编译期生成的各种字面量和符号引用。是方法区的一部分

2、特点

  • 存储没有任何规范,不同的提供商可以自定义
  • 动态性:运行期间还可以添加新的常量池

3、运行机制

类被加载时生成的字面量和符号引用存放在方法区的运行时常量池,超过内存的限制,抛出outofmemory异常

7、直接内存

1、什么是直接内存

native函数直接分配的堆外内存

2、特点

  • 不属于虚拟机运行时数据区
  • 不属于Java虚拟机的内存区域
  • 不受Java堆大小的限制
  • 本机总内存的限制

3、运行机制

通过channel-buffer的I/O方式,利用Java堆的directbytebuffer作为直接内存的引用。当本机总内存大于本机物理内存,会抛出outofmemory异常

转载于:https://www.cnblogs.com/flyingcr/p/10326899.html

Java运行时的数据区域相关推荐

  1. 运行时错误7内存溢出_JVM运行时内存数据区域

    阅读本文大概需要5分钟 作者:AI乔治出处:https://my.oschina.net/u/3611782/blog/4530512 1 讨论背景 周志明老师写的<深入理解Java虚拟机> ...

  2. Java虚拟机运行时的数据区域

    1.堆区(Heap) (1)Heap是被所用线程共享的区域,是虚拟机中内存最大的一块. (2)它的唯一目的就是存放对象的实例. 例如:A a=new A(100); 存放在堆中的是A(100)这个ne ...

  3. 深入理解java虚拟机一 JAVA运行时内存区域与class文件

    一 JAVA运行时内存区域 JVM在加载class文件时,会将class文件定义的数据结构转为运行时内存中的数据,那么jvm是如何安排运行时的内存区域呢? jvm将运行时内存划分为以下几个部分: 堆: ...

  4. Java运行时数据区及对象的分配

    一.Java运行时数据区 简图: 简述: 堆.方法区是线程共享的,虚拟机栈.程序计数器.本地方法栈是线程私有的,一个线程一份. 虚拟机栈的基本单位是栈帧,一个方法的开始执行意味着一个栈帧进栈,一个方法 ...

  5. JVM从入门到精通(五): Java运行时数据区和常用指令

    JVM Runtime Data Area and JVM Instructions Java运行时数据区以及JVM指令 i=i++结果为8 i=++i结果为9 一个class的生命周期 以下面的规范 ...

  6. Java 运行时的内存划分

    Java 运行时的内存划分 程序计数器 记录当前线程所执行的字节码行号,用于获取下一条执行的字节码. 当多线程运行时,每个线程切换后需要知道上一次所运行的状态.位置.由此也可以看出程序计数器是每个线程 ...

  7. JAVA运行时异常及检查式异常

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  8. 【java】Java运行时动态生成类几种方式

    1.概述 转载:Java运行时动态生成类几种方式 这里发现自己不知道的,原来Java 还能自己编译自己,学到了. 最近一个项目中利用规则引擎,提供用户拖拽式的灵活定义规则.这就要求根据数据库数据动态生 ...

  9. Java 内存管理、JVM 工作原理与 Java 运行时系统

    Java 虚拟机规范中说明:所有的对象实例(all class instances)以及数组都要在堆上分配: the heap is the runtime data area from which ...

最新文章

  1. 把qss添加进qrc文件_PDF怎么压缩?一招教你快速压缩PDF文件
  2. 代码详解 | 用Pytorch训练快速神经网络的9个技巧
  3. 闭眼入!采集 Nginx 日志的几种方式!
  4. 抛鸡蛋html5游戏,数学智力题:扔鸡蛋计算不会碎的楼层
  5. 【配置】固定资产组织结构配置
  6. PyTorch学习问题记录
  7. 中石油训练赛 - sciorz画画(区间dp)
  8. esxi 部署模板_vSphere使用模板部署虚拟机
  9. sql中if语句的用法_Python中的if条件语句
  10. Python第三方库的安装及路径查看总结
  11. RabbitMQ指南之三:发布/订阅模式(Publish/Subscribe)
  12. 软件测试记录表模版,简单软件测试报告模板.doc
  13. 计算机无法识别Gp80180,佳博Gprinter GP-L80180I 驱动
  14. 智能手环功能模块设计_基于嵌入式系统智能手环的设计开发
  15. 梦幻西游修炼金钱计算器
  16. NODEMCU学习笔记-02 esp8266 WIFI杀手 固件烧录版
  17. 腾讯微信短网址(url.cn)在线生成接口API使用详解
  18. 像素焦距与毫米焦距转换
  19. 微信小程序审核不通过的原因,这里整理了10个最常见的
  20. 华为荣耀开机停留在android,华为荣耀8变砖无法开机怎么办 华为荣耀8变砖无法开机解决方法...

热门文章

  1. 11个高效的VS调试技巧
  2. ExtJS,JQuery,Dojo的小比较
  3. AdaBoost详解
  4. 洛阳市高中学业水平计算机考试,2019年河南洛阳市高中学生学业水平考试考点及时间...
  5. STM32 - 定时器的设定 - 基础-03 - 输出波形控制 - Output compare mode
  6. QT+PCL+VTK 一个点云显示和处理软件
  7. qt给qdialog加一个滚动条_这些小程序技巧,你敢说你一个用不到?
  8. cmd运行python脚本处理其他文件_如何在cmd命令行里运行python脚本
  9. delphi7升级delphi2007可以互用马_马爹利鼎盛周末饭局暂停营业,未来再见
  10. java中math方法语句,下列有关Java中标准类Math的random()方法的说法中,正确的是。 - 上学吧学历考试...