一,概述

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. libevent网络库

    1.概述 libevent是一个C语言编写的.轻量级开源高性能事件通知库.作为底层网络库,已经被广泛应用(如:memcached.Vomit.Nylon.Netchat等).主要有以下几个亮点: 事件 ...

  2. 社交网络分析的 R 基础:(四)循环与并行

    前三章中列出的大多数示例代码都很短,并没有涉及到复杂的操作.从本章开始将会把前面介绍的数据结构组合起来,构成真正的程序.大部分程序是由条件语句和循环语句控制,R 语言中的条件语句(if-else)和 ...

  3. 「CTSC 2011」幸福路径

    [「CTSC 2011」幸福路径 蚂蚁是可以无限走下去的,但是题目对于精度是有限定的,只要满足精度就行了. \({(1-1e-6)}^{2^{25}}=2.6e-15\) 考虑使用倍增的思想. 定义\ ...

  4. fastjson、jackson以及son-lib的使用

    fastjson前言 fastJson是阿里巴巴出品的一个json序列化工具. 引入依赖 <dependency> <groupId>com.alibaba</group ...

  5. cocos命令生成apk

    1. 配置好cocos命令中需要的andrid 环境命令 2. adt或许没有 zipalign.exe, 在生成 release版中需要这个文件来生成apk (路径D:\adt\sdk\tools) ...

  6. 淘大大出了composer镜像 -- 给力

    composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

  7. 利用ICMP协议的PING命令获取客户端当前网络质量 by徐文棋

    无论在windows下,linux也好,unix也好,都可以通过 Ping命令获得当前设备的网络延迟,延迟是客户端到服务端的网络响应时间.通常延迟越低,反应速度越快 这里使用了SimplePing   ...

  8. Pollard's rho algorithm和涉及到的两个循环检测算法

    0. 简单介绍 Pollard的\(\rho\)算法是John Pollard在1975年发明的,用于分解质因数[1].假定被分解的数为N,N的最小的质因数为\(p(p\ne N)\),那么该算法可以 ...

  9. Ubuntu18 用新用户登录后退格键/方向键/制表键 乱码

    Ubuntu18新建用户后,用新用户登录,此时 退格键Backspace 变成了 ^H,且方向键.制表键.Del键等均失效 这样会造成很多的麻烦,解决方式有两种: 方式1:Ctrl + Backspa ...

  10. Pandas中Series与Dataframe的初始化

    (一)Series初始化 1.通过列表,index自动生成 se = pd.Series(['Tom', 'Nancy', 'Jack', 'Tony']) print(se) 2.通过列表,指定in ...