大家好,今天和大家分享java内存区域划分知识。

通常我们把java的内存区域粗略划分为栈内存和堆内存,但是这只能说明程序员平常比较关心的是这两块内存,其实JAVA的内存划分却不止这两块内存,而要更加复杂一些。

JAVA内存划分为以下几个区域:

1.程序计数器

2.虚拟机栈

3.本地方法栈

4.方法区

5.堆

6.运行时常量池

下面我们来逐个介绍:

1.程序计数器

程序计数器是线程私有的一块内存,和线程绑定在一起,主要作用是存储当前线程所执行的字节码的行号。我们的JAVA语句,包括循环,异常处理等都要依赖这个计数器。但是需要注意的是,如果当前线程执行的JAVA方法,那么这个计数器记录的就是当前正在执行的虚拟机字节码指令的地址。如果执行的Native方法,那么这个计数器为空。

2.虚拟机栈

虚拟机栈也是线程私有的内存区域,虚拟机栈的作用主要是用来描述java方法执行的内存模型,每个方法在运行时都会在栈中创建一个栈帧,栈帧的作用主要是用来存储局部变量表,操作数栈,方法出口信息等,每个方法的执行实际就是栈帧在虚拟机栈中从入栈到入栈的过程。

而我们平常讲的栈,就是说虚拟机栈,再详细一些,是指虚拟机栈中的局部变量表。

在局部变量表中,我们存储的是编译期可知的基本数据类型和对象引用,以及returnAddress类型。

其中对象引用并不是对象本身,对象本身存在于堆内存中,这里的对象引用可能是指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与实际对象相关的位置。而returnAddress则指向了一条字节码指令的地址。

3.本地方法栈

本地方法栈与虚拟机栈作用基本一样,只不过虚拟机栈是为虚拟机执行JAVA方法而作服务,但是本地方法栈服务的对象时Native方法。

4.JAVA堆

JAVA堆是虚拟机管理的最大的一块内存,是被线程共享的内存,该区域用于存储实例对象,几乎所有的对象都在这里进行内存分配。JAVA堆是垃圾收集器的主要工作区域,但是按照内存分配年代还可以细分为老年代和新生代,新生代也可以进行具体细分,这一点请参考我们之前的文章《JAVA垃圾回收过程》。但是JAVA堆并不要求是物理连续的内存区域,只要逻辑连续即可,与磁盘空间相似。

5.方法区

方法区和堆内存一样,都是线程共享的内存区域,主要作用是用来存储被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,有一些虚拟机实现将方法区实现为“永久代”,但是这并不是通用的做法,只是因为常见的HotSpot虚拟机将方法区将垃圾回收分代机制扩展至方法区。实际上方法区与永久代的概念并不一致。

6.运行时常量池

运行时常量池属于方法区的一部分,主要作用是存储在类加载后,将Class文件中用于存储编译期生成的各种字面量和符号引用的常量池。

运行时常量池相对于Class文件中的常量池,显著的特点就是动态性,因为JAVA并不要求常量一定只有编译期才能产生,也就是并不只有Class文件中的常量池的内容才能存储在运行时常量池中,在运行期间,也可以将常量存储在池中。

好了,以上就是JAVA中简单的内存区域划分,希望大家有所收获,如果大家觉得我们的文章对您用,请关注我们的公众号,每天一篇实用文章。

JAVA内存区域划分相关推荐

  1. java内存 海子_[转]JVM的内存区域划分

    学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行 ...

  2. JVM的内存区域划分(转)

    原文链接:JVM的内存区域划分 JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内 ...

  3. JVM学习笔记(一):Java内存区域

    由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分.在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程: 首先Java源代码文件(. ...

  4. 《深入理解JVM.2nd》笔记(二):Java内存区域与内存溢出异常

    文章目录 概述 运行时数据区域 程序计数器 Java虚拟机栈 本地方法栈 Java堆 方法区 运行时常量池 直接内存 HotSpot虚拟机对象探秘 对象的创建 第一步 第二步 第三步 第四步 最后一脚 ...

  5. JVM的内存区域划分

            JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的 ...

  6. JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探

    一.JVM内存区域(Java内存区域) 首先区分一下JVM内存区域(Java内存区域)和Java内存模型(JMM)的概念.Java线程之间的通信采用的是共享内存模型,这里提到的共享内存模型指的就是Ja ...

  7. Java内存区域与Java内存模型

    Java内存区域 Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有其用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的数据区域,而绿色部分代表的是每个线程的私有数 ...

  8. 海子-JVM的内存区域划分

    学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆.栈以及静态数据区.那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行 ...

  9. Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存

    前言: 该章节知识点梳理:本文主要是入门和了解jvm,不做深入 1.Java代码是如何运行起来的? 2.类加载到使用的过程? 3.验证准备和初始化的过程? 4.类从加载到使用核心阶段:初始化.类加载器 ...

  10. 32位jdk最大内存_你了解Java 内存区域和GC机制吗?

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

最新文章

  1. 强悍!使用Flash和Silverlight制作控件
  2. 查看oracle当前消耗,查找Oracle高消耗语句的方法
  3. 文本比较算法Ⅱ——Needleman/Wunsch算法
  4. LTE Module User Documentation(翻译6)——物理误差模型、MIMO模型、天线模型
  5. VirtualBox中出现UUID have already exists 解决方法
  6. Qt SD卡 文件系统挂载、文件预览
  7. github 检查代码质量_Android(8): 代码质量检查
  8. 【计算机视觉】基于OpenCV的人脸识别
  9. Linux进阶之路————scp指令介绍与演示
  10. DFA极简化和NFA确定化
  11. Java 反射 面试题
  12. 【ETL工具】-Kettle详细教程
  13. 网络通信编程大作业--深度研究爬虫技术
  14. Combating the Repatriation Blues
  15. WPF DataGrid MVVM 绑定 SelectedCells
  16. 字节跳动启动大规模校招
  17. leetcode 21.合并有序列表(js)
  18. 基于SSM的图书馆座位预约管理系统
  19. 使用Apache Spark SQL探索标普500和石油价格
  20. JQL 高级搜索入坑

热门文章

  1. Permission is only granted to system apps解决方法
  2. 域名系统几类服务器,域名服务器可分为什么类型
  3. Ubuntu下设置开机启动项
  4. MATLAB——更换主题颜色
  5. 【示波器专题】示波器带宽对测量的影响
  6. Chia命令行P图工具
  7. Python-Locust接口压力测试
  8. Mac安装boost
  9. linux进程地址空间内核,菜鸟求问linux进程地址空间问题
  10. Linux端口被占用怎么解决