java内存区域模型和详解
一,概述
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内存区域模型和详解的更多相关文章
- 19、java内存分配 常量池详解
在class文件中,“常量池”是最复杂也最值得关注的内容. Java是一种动态连接的语言,常量池的作用非常重要,常量池中除了包含代码中所定义的各种基本类型(如int.long等等)和对象型(如Stri ...
- java内存分配 常量池详解
http://www.cnblogs.com/qinqinmeiren/archive/2011/07/19/2151683.html
- 总结Java虚拟机内存区域模型
本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下Java运行时的数据区域,Java虚拟机在执行Java程序 ...
- 一文解析总结Java虚拟机内存区域模型
最近抽空看了一点<深入理解Java虚拟机>,本篇文章主要来总结一下Java虚拟机内存的各个区域,以及这些区域的作用.服务对象以及其中可能产生的问题,作为大家的面试宝典. 首先我们来看一下J ...
- Java内存模型(JMM)详解
在Java JVM系列文章中有朋友问为什么要JVM,Java虚拟机不是已经帮我们处理好了么?同样,学习Java内存模型也有同样的问题,为什么要学习Java内存模型.它们的答案是一致的:能够让我们更好的 ...
- 大杂烩 -- Java内存布局【图】以及java各种存储区【详解】
基础大杂烩 -- 目录 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 一.Java内存布局浅谈 1. 总述 我们知道,线 ...
- Java网络编程和NIO详解3:IO模型与Java网络编程模型
Java网络编程和NIO详解3:IO模型与Java网络编程模型 基本概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32 ...
- Java网络编程和NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型
Java网络编程与NIO详解2:JAVA NIO一步步构建IO多路复用的请求模型 知识点 nio 下 I/O 阻塞与非阻塞实现 SocketChannel 介绍 I/O 多路复用的原理 事件选择器与 ...
- 事件驱动模型实例详解(Java篇)
或许每个软件从业者都有从学习控制台应用程序到学习可视化编程的转变过程,控制台应用程序的优点在于可以方便的练习某个语言的语法和开发习惯(如.net和java),而可视化编程的学习又可以非常方便开发出各类 ...
随机推荐
- coredns 安装
coredns简介 CoreDNS是一个DNS服务器,和Caddy Server具有相同的模型:它链接插件.CoreDNS是云本土计算基金会启动阶段项目.CoreDNS是SkyDNS的继任者. Sky ...
- 利用 Python 进行数据分析(Python 数据分析)· 第 2 版
译者:SeanCheney 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远. ApacheCN 机器学习交流群 629470233 ApacheCN 学习资源 Sklearn 与 ...
- X000100
P3172 [CQOI2015]选数 gcd 为 \(K\) 不太好办,所以我们先把它转化成 gcd 为 1 的问题: scanf("%d%d%d%d",&n,&k ...
- Redis为什么是单线程,高并发快的3大原因详解
出处知乎:https://zhuanlan.zhihu.com/p/58038188 Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快: 2.redis是单线程的,省去了 ...
- Windows系统禁止自动更新
Windows + R键 输入services.msc(服务管理窗口) 找到Windows Update 停止且禁用 恢复->第一次失败 无操作 Windows + r 输入gpedit.msc ...
- opencv笔记--ORB
ORB detector 使用 FAST detector 和 BRIEF descriptor 基本思路.在介绍 ORB 之前,首先对 FAST 与 BRIEF 进行说明. 1 FAST FAST( ...
- 封装及其作用Java
封装 该露的露,该藏的藏 我们程序设计要求"高内聚,低耦合".高内聚就是类的内部数据操作细节自己完成,不允许外部干涉:低耦合:仅暴漏少量的方法给外部使用 封装(数据的隐藏): ...
- 阿里云K8S节点NotReady状态
开发部署pod的时候在wayne平台上部署不上去,删除也删除不了 先删除 kubectl delete pod pod-name --grace-period=0 --force 删除之后然后部署新的 ...
- 攻防世界之Web_php_include
题目: 解题思路: 直接给出源码,由代码可知此题应该为文件包含,而且应该利用php伪协议 strstr() 函数搜索字符串在另一字符串中是否存在,如果是,返回该字符串及剩余部分,否则返回FALSE 可 ...
- NSSCTF-easyupload1.0
2.0和3.0已经说过,这个1.0上传也可以使用那两个题目的做法,就是使用htaccess的方式进行定义上传文件的类型来进行连接shell,1.0肯定是没有2.0和3.0难的,所以说,也不要将这个题目 ...