Java虚拟机执行Java程序的时候需要使用一定的内存,根据不同的使用场景划分不同的内存区域。有公用的区域随着Java程序的启动而创建;有线程私有的区域依赖线程的启动而创建

JVM内存模型大致可以分为:堆、方法区、虚拟机栈、本地方法栈和程序计数器 五大模块,其中方法区和堆是所有线程共有的内存区域而虚拟机栈、本地方法栈和程序计数器都是线程私有的内存区域,如下图:

1.堆内存

堆内存是Java虚拟机管理的内存中最大的一部分,Java堆是所有线程共享的内存区域,虚拟机启动的时候创建,用于存放对象的实例,几乎所有的对象的实例都在堆内存中分配内存;

同时Java的垃圾回收主要也就是对虚拟机的堆内存进行回收,当堆中没有足够的内存完成实例分配,并且堆也无法再扩展时,就会抛出OutOfMemoryError异常

2.方法区

方法区是所有线程共享的内存区域,存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

3.虚拟机栈

虚拟机栈是线程私有的,生命周期和线程一样,Java的每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接和方法出口等信息。每个方法从被调用到执行完成的过程,就对应着一个栈帧再虚拟机栈中从入栈到出栈的过程。

局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不等同于对象本身,根据不同的虚拟机实现,它可能是一个指向对象起始地址的引用指针,也可能指向一个代表对象的句柄或

者其他与此对象相关的位置)和returnAddress 类型(指向了一条字节码指令的地址)。其中64 位长度的long 和double 类型的数据会占用2 个局部变量空间(Slot),其余的数据类型只占用1 个。局部变量表所需的内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大的局部变量空间是完全确定的,在方法运行期间不会改变局部变量表的大小。

如果线程请求的栈深度大于虚拟机所允许的深度,会抛StackOverflowError异常;徐国虚拟机栈可以动态扩展,当扩展时不能申请到足够的内存时则会抛OutOfMemoryError异常

4.本地方法栈

本地方法栈和虚拟机栈作用类似,不过本地方法栈是为JVM执行本地方法(Native方法)服务的。与虚拟机栈一样,本地方法栈区域也会抛StackOverflowError和OutOfMemoryError异常

5.程序计数器

程序计数器是线程私有的,占用内存较小,作用是当前线程执行的字节码行号指示器,我们都知道Java代码执行的时候会被编译成字节码然后一行行的去执行,而程序计数器就是用来记录当前线程的要执行的字节码行号用的;

由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现,所以一个处理器同时只会执行一个线程中的指令,有了程序计数器,当线程切换只会就能够恢复到当前该线程正确位置继续执行。

最新文章

  1. Flume_初识
  2. SMON: Parallel transaction recovery tried 引发的问题--转载
  3. (转)Windows驱动编程基础教程
  4. 小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描
  5. Web---图片验证码生成教程详解-从简单到复杂-从本地到前后台
  6. rest-work-eat-study-rest-work-eat or rest-rest-work-work-eat-eat..
  7. ASP.NET MVC 使用MSBuild生成的几个注意事项
  8. [Swift]LeetCode675. 为高尔夫比赛砍树 | Cut Off Trees for Golf Event
  9. Linux PCI设备驱动的实现思路与思想
  10. Ubuntu安装WDCP遇到的无法便于错误解决方法
  11. 最新 macOS Sierra 10.12.3 安装CocoaPods及使用详解
  12. DbContextScope,A simple and flexible way to manage your Entity Framework DbContext instances,by mehdime
  13. 特殊字符导致json字符串转换成json对象出错
  14. Redis之Sorted Set 有序集合
  15. Apose.Cell导出的Excel数字格式正确显示
  16. 【EF】Entity Framework实现属性映射约定
  17. linux shell学习二
  18. java并发编程实战笔记---(第五章)基础构建模块
  19. 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)
  20. HDU 5699 二分+线性约束

热门文章

  1. try catch和spring事务
  2. 什么是Docker?(一)
  3. 萌新接触前端的第三课——JavaScript
  4. SQL语法集合
  5. c#4.0 Task.Factory.StartNew 用法
  6. CGAL4.10 / CGAL4.13编译
  7. PHP自动加载SPL的四种处理方式
  8. 银联卡中关于CVN/CVN2/ICVN的区别
  9. js 对象的_proto_属性 和函数的prototype属性分析
  10. SIP协议流程