JVM内存区域的划分(内存结构或者内存模型)

 

运行时数据区域:

根据 JVM 规范,JVM 内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。

程序计数器(线程私有):

  是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的程序计数器,这类内存也称为“线程私有”的内存。

  正在执行java方法的话,计数器记录的是虚拟机字节码指令的地址(当前指令的地址)。如果还是Native方法,则为空

  这个内存区域是唯一一个在虚拟机中没有规定任何OutOfMemoryError情况的区域。

Java虚拟机栈(线程私有):

  也是线程私有的。

  每个方法在执行的时候会创建一个栈帧,存储了局部变量表,操作数栈,动态连接,方法返回地址等。

  每个方法从调用到执行完毕,对应一个栈帧在虚拟机栈中的入栈和出栈。

  通常所说的栈,一般是指虚拟机栈中的局部变量表部分。

  局部变量表所需的内存在编译期间完成分配。

  如果线程请求的栈深度大于虚拟机所允许的深度,则StackOverflowError。

    如果虚拟机栈可以动态扩展,扩展到无法申请足够的内存,则OutOfMemoryError。

本地方法栈(线程私有):

  和虚拟机栈类似,主要为虚拟机使用到的Native方法服务。

  也会抛出StackOverflowError和OutOfMemoryError。

Java堆(线程共享):

  被所有线程共享的一块内存区域,在虚拟机启动时创建,用于存放对象实例

  堆可以按照可扩展来实现(通过-Xmx和-Xms来控制)

  当堆中没有内存可以分配给实例,也无法再扩展时,则抛出OutOfMemoryError异常。

方法区(线程共享):

  被所有线程共享的一块内存区域。

  用于存储已被虚拟机加载的类信息,常量,静态变量等。

  这个区域的内存回收目标主要针对常量池的回收和对类型的卸载。

  当方法区无法满足内存分配需求时,则抛出OutOfMemoryError异常。

  在HotSpot虚拟机中,用永久代来实现方法区,将GC分代收集扩展至方法区,但是这样容易遇到内存溢出的问题。

  JDK1.7中,已经把放在永久代的字符串常量池移到堆中。

  JDK1.8撤销永久代,引入元空间。

运行时常量池:

  是方法区的一部分,用于存放编译期生成的各种字面量和符号引用

  当常量池无法再申请到内存时,则抛出OutOfMemoryError异常。

直接内存:

  不是运行时数据区的一部分,但也可能抛出OutOfMemoryError异常。

  在JDK1.4中新加入的NOI类,引入了一种基于通道与缓冲区的I/O方式,它可以使用Native函数直接分配堆外内存,

然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。

JVM内存区域的划分(内存结构或者内存模型)的更多相关文章

  1. 深入理解java:1.3.1 JVM内存区域的划分(运行时数据区)

    学习Java GC机制,可以帮助我们在日常工作中 排查各种内存溢出或泄露问题,解决性能瓶颈,达到更高的并发量,写出更高效的程序. 我们将从4个方面学习Java GC机制, 1,内存是如何分配的: 2, ...

  2. Java虚拟机--Java内存区域的划分和异常

    Java内存区域的划分和异常 运行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域. 程序计数器 线程私有.可看作是当前线程所执行的字节码的行号指示器,字节码解释器的工作是通 ...

  3. Java内存区域的划分和异常

    Java内存区域的划分和异常   运行时数据区域 JVM在运行Java程序时候会将内存划分为若干个不同的数据区域. 打开百度App,看更多美图 程序计数器 线程私有.可看作是当前线程所执行的字节码的行 ...

  4. 重读《深入理解Java虚拟机》一、Java虚拟机内存区域的划分

    一.Java虚拟机内存区域如何划分 1.Java虚拟机内存区域的划分 区域名称 作用(用途) 类型 特点 虚拟机规定异常情况 内存分配与回收 其他说明 1 程序计数器 指示当前正在执行的字节码指令地址 ...

  5. 谈谈JVM内存区域的划分

    我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等 ...

  6. java内存区域的划分

    前言 之前我们探讨过一个.class文件是如何被加载到jvm中的.但是jvm内又是如何划分内存的呢?这个内被加载到了那一块内存中?jvm内存划分也是面试当中必被问到的一个面试题. 什么是JVM内存区域 ...

  7. java虚拟机内存区域的划分以及作用详解

    序言 为什么有时候学着学着会突然之间觉得一切度是那么无趣,男的每个月也有那么几天难道?哈哈,不然是什么,我还是要坚持,可以做少一点,但是不能什么度不做.总会过去的,加油 --WH 一.运行时数据区 什 ...

  8. [转] Cz/C++中栈空间、堆空间,及内存区域的划分

    kevinGao, 原文地址 一个由C/C++编译的程序占用的内存分为以下几个部分: 1.栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈. 2 ...

  9. 日积月累——java虚拟机内存区域的划分

    看了博主“一杯凉茶”一篇对java内存详解的文章后,虚心学习,并记录下来 ,以便日后再来温故. 一,运行时数据区 1.程序计数器 当前线程所执行的字节码行号指示器,字节码解释器工作依赖计数器控制完成, ...

随机推荐

  1. hdu5256 二分求LIS+思维

    解题的思路很巧,为了让每个数之间都留出对应的上升空间,使a[i]=a[i]-i,然后再求LIS 另外二分求LIS是比较快的 #include<bits/stdc++.h> #define ...

  2. unittest常用的断言方法

    unittest常用的断言方法 #msg:判断不成立时需要反馈的字符串 assertEqual(self, first, second, msg=None) --判断两个参数相等:first == s ...

  3. 【HTTP】 Fiddler简介

    1.为什么是Fiddler? 抓包工具有很多,小到最常用的web调试工具firebug,达到通用的强大的抓包工具wireshark.为什么使用fiddler?原因如下: a.Firebug虽然可以抓包 ...

  4. MyEclipse10中启动出现OutOfMemoryError: PermGen space如何解决

    一篇关于技术的文档,分享给大家.在MyEclipse中启动程序运行,报错java.lang.OutOfMemoryError: PermGen space应该怎么办?这是eclipse 内存不够的原因 ...

  5. ***LANMP镜像手册(Apache&Nginx)-lanmp-oneinstack

    LANMP镜像手册(Apache&Nginx) Version PHP7.0.26  转自:http://docs.websoft9.com/xdocs/lanmp-oneinstack-im ...

  6. Python join方法

    用相应格式的字符串将序列链接起来. a = ['wo','hao','shuai'] print("".join(a)) 'wohaoshuai' print("-&qu ...

  7. vi命令修改文件及保存的使用方法

    简单点:vi文件名,按"I"进入insert模式,可以正常文本编辑,编辑好之后按“esc”退出到“命令模式”,再按“shift+:”进入“底行模式”, 按“:wq”保存退出! 还一 ...

  8. BZOJ.5404.party(树链剖分 bitset Hall定理)

    题目链接 只有指向父节点的单向道路,所以c个人肯定在LCA处汇合.那么就成了有c条到LCA的路径,求最大的x,满足能从c条路径中各选出x个数,且它们不同. 先要维护一条路径的数的种类数,可以树剖+每条 ...

  9. 在deepin中安装docker

    用往常方法安装 一般在Linux中安装docker的时候都会使用这条命令 wget -qO- https://get.docker.com/ | sh 而在deepin这么做缺不行 打开网址即可发现支 ...

  10. Python3正则表达式(4)

    正则表示式的子模式 使用()表示一个子模式,括号中的内容作为一个整体出现. (red)+  ==> redred, redredred, 等多个red重复的情况 子模式的扩展语法 案例1 tel ...