一,概述

java虚拟机运行时数据区模型图:

主要包括:程序计数器,java虚拟机栈,本地方法栈,java 堆,方法区(元空间)。

其中堆和方法区由所有线程共享的数据区;程序计数器,java虚拟机栈,本地方法栈是线程隔离的数据区。

二,程序计数器

程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。在java概念模型中,字节码解释器就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

每条线程的计数器都是独立的,互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。

通俗来讲,例如:就是一个A方法(线程)运行到第10行代码,这个时候有一个B线程获取了CPU资源,这个时候在A的字节码处做一个标记,下次再轮到A的时候就不需要再重复执行之前的代码。不过这些都是在字节码(.class文件)层面,在此处只是通俗打个比方。

三,栈

栈是线程私有的,在每个方法执行的时候,会同步创建一个栈帧,用于存储局部变量表,操作数栈,动态连接,方法出口等信息。

在大部分的情况下,我们说的“栈”指的是就是局部变量表部分。局部变量表存放了编译前的java基本数据类型,对象引用和returnAddress 类型

栈区域出现异常的情况:

1.如果线程请求的栈深度大于虚拟机所应许的深度,将抛出StackOverflowError 异常。

2.如果java虚拟机栈容量可以动态扩展,当栈扩展时无法申请到足够的内存会抛出OutOfMemoryError 异常。

四,本地方法栈

本地方法栈与栈发挥的作用差不多,栈是为 java方法(字节码) 服务,而本地方法栈是为虚拟机使用到的本地(Native)方法服务。

本地方法栈区域出现异常的情况:本地方法栈也会在栈深度和栈扩展失败的时候分别抛出:StackOverflowError 和 OutOfMemoryError 异常。

五,java 堆

1,java堆是内存共享的,也是虚拟机所管理内存最大的一块。java世界里 “几乎”  所有的对象实例都是在这内存中进行分配

2, java 堆是垃圾收集器管理的内存区域,因此也被称为 “GC堆”

3,从分配内存的角度看,所有的线程共享的java 堆 可以划分为许多线程私有分配缓冲区,以提高对象分配时的效率。

4,java 堆可以在物理上内存空间是不连续的,但在逻辑上应该是被视为连续的。

5,java 堆可以被固定为现成大小,也可以进行扩展

栈区域出现异常的情况:

1.如果在 java 堆中没有内存完成实例的分配,并且堆也无法进行扩展时,java 虚拟机会抛出 OutOfMemoryError 异常。

六,方法区

概念:方法区也是线程共享的内存区域,它用于存储被虚拟机加载的类型信息,常量,静态变量,即时编译器编译后的代码缓存等数据。

方法区可以像堆一样,可以进行扩展和在物理上不连续,还可以选择不实现垃圾收集。

方法区出现异常的情况:

1.如果方法区无法满足新的内存分配需求时,将抛出 OutOfMemoryError 异常。

java内存区域模型和详解的更多相关文章

  1. 19、java内存分配 常量池详解

    在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...

  2. java内存分配 常量池详解

    http://www.cnblogs.com/qinqinmeiren/archive/2011/07/19/2151683.html

  3. 总结Java虚拟机内存区域模型

    本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序 ...

  4. 一文解析总结Java虚拟机内存区域模型

    最近抽空看了一点<深入理解Java虚拟机>,本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下J ...

  5. Java内存模型(JMM)详解

    在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型.它们的答案是一致的:能够让我们更好的 ...

  6. 大杂烩 -- Java内存布局【图】以及java各种存储区【详解】

    基础大杂烩 -- 目录 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 一.Java内存布局浅谈 1. 总述 我们知道,线 ...

  7. Java网络编程和NIO详解3:IO模型与Java网络编程模型

    Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...

  8. Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型

    Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...

  9. 事件驱动模型实例详解(Java篇)

    或许每个软件从业者都有从学习控制台应用程序到学习可视化编程的转变过程,控制台应用程序的优点在于可以方便的练习某个语言的语法和开发习惯(如.net和java),而可视化编程的学习又可以非常方便开发出各类 ...

随机推荐

  1. Java多线程专题1: 并发与并行的基础概念

    合集目录 Java多线程专题1: 并发与并行的基础概念 什么是多线程并发和并行? 并发: Concurrency 特指单核可以处理多任务, 这种机制主要实现于操作系统层面, 用于充分利用单CPU的性能 ...

  2. 服务器+nextcloud搭建自己的私有云盘

    简介 Nextcloud是一款开源免费的私有云存储网盘项目,可以让你快速便捷地搭建一套属于自己或团队的云同步网盘,从而实现跨平台跨设备文件同步.共享.版本控制.团队协作等功能.它的客户端覆盖了Wind ...

  3. Spring @Cacheable 缓存不生效的问题

    最近在项目中使用了Ehcache缓存,使用方式是用Spring提供的 @Cacheable 注解的方式,这种方式简单.快速.方便,推荐使用. 在使用的过程中,遇到了缓存不生效的情况,经过分析处理,总结 ...

  4. Swift 类的构造函数

    构造函数的介绍 构造函数类似于OC中的初始化方法:init方法 默认情况下载创建一个类时,必然会调用一个构造函数 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数. 如果是继承自NSObj ...

  5. Android App发布遇到的问题总结【转】

    感谢大佬:https://www.cnblogs.com/jeffen/p/6824722.html   问题描述(v1和v2) Android 7.0中引入了APK Signature Scheme ...

  6. RPC原理及RPC实例分析(转)

    出处:https://my.oschina.net/hosee/blog/711632 在学校期间大家都写过不少程序,比如写个hello world服务类,然后本地调用下,如下所示.这些程序的特点是服 ...

  7. 使用python实现冒泡排序和快速排序

    1 def bubble(arr): 2 """冒泡排序""" 3 loop = len(arr) - 1 4 if loop > 0 ...

  8. java多线程编程(二)

    1. wait 和 sleep 区别? 1.wait可以指定时间也可以不指定,sleep必须指定时间. 2.在同步中时,对cpu的执行权和锁的处理不同.  wait:释放执行权,释放锁.  sleep ...

  9. k8s之Pod基础概念

    1. 资源限制 Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象.一个Pod代表着集群中运行的一个进程.kubernetes中其他大多数组件都是围绕着Pod来 ...

  10. 部署YUM仓库 (最近睡眠质量很差,你什么时候搬过来住)

    部署YUM仓库 1.YUM概述 YUM(Yellow dog Updater Modified) 基于RPM包构建的软件更新机制 可以自动解决依赖关系 所有软件由集中的YUM软件仓库提供 2.主备安装 ...