一,概述

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. JavaScript基本数据类型和引用数据类型详解

    数据类型小知识 JavaScript主要数据类型共有7种,有string.number.boolean.undefined.null.symbol.object.其余7种可以笼统的分为两大类:基本数据 ...

  2. 使用VSCode在本地电脑上对树莓派远程开发

    目的及原理 有时身边没有额外的显示器和键盘,或者有时树莓派在另一个屋子连接着路由器,那么当我们想在树莓派上做开发时就可以使用VS Code的远程开发能力.下面一张图显而易见地说明了远程开发的工作原理( ...

  3. Request与Response

    前言 request和response对象是由服务器创建的.我们来使用它们: request对象是来获取请求消息,response对象是来设置响应消息. Request 定义 服务器进行创建,通过该对 ...

  4. JSP response.setCharacterEncoding与response.setContentType的区别

    问题描述 昨天在参考别人的项目时,发现页面引用js,css等文件总是乱码,后来才发现是MIME类型统一设置为text/html,并且仅仅编码设置了浏览器端的解析编码.另外,可以先通过文本编辑器(如no ...

  5. LaunchScreen原理

    会自动加载LaunchScreen是因为在Target当中,指定了Launch Screen file 它的底层实现其实把LaunchScreen上的东西,生成了一张图片,然后把这张图片设为程序的启动 ...

  6. C++网络编程卷1、卷2概述

    转载请注明来源:https://www.cnblogs.com/hookjc/ 一:  C++NPv1主要涉及到的类: 1.1.  Logging_Server 是个抽象类,用来定义接口类型,此类不能 ...

  7. finally块

    /* finally 块: finally块的 使用前提是必须要存在try块才能使用. finally块的代码在任何情况下都会执行的,除了jvm退出的情况. finally非常适合做资源释放的工作,这 ...

  8. Solution -「JOISC 2020」「UOJ #509」迷路的猫

    \(\mathcal{Decription}\)   Link.   这是一道通信题.   给定一个 \(n\) 个点 \(m\) 条边的连通无向图与两个限制 \(A,B\).   程序 Anthon ...

  9. 自学linux(安装系统,图形化界面,安装chrome)STEP1

    1. 下载虚拟机VMware并安装 破解版: https://www.xitmi.com/2417.html 2. 下载centos7,6据说已经找不到了? 阿里云镜像: https://mirror ...

  10. Redis 源码简洁剖析 15 - AOF

    AOF 是什么 AOF 持久化的实现 命令追加 AOF 文件的写入和同步 AOF 文件的载入和数据还原 AOF 重写 为什么需要重写 什么是重写 如何重写 AOF 后台重写 为什么需要后台重写 带来的 ...