精华内容
下载资源
问答
  • JVM内存分区图文 ​ 首先看图,JVM内存里面主要干一下三件事,我们从这三件事展开,了解并掌握JVM内存分区: 方法区(元数据空间) ​jdk1.8之前叫做方法区,主要放".class"文件加载进来的类,还有一些类似的常量...

    JVM内存分区图文

    ​ 首先看图,JVM内存里面主要干一下三件事,我们从这三件事展开,了解并掌握JVM内存分区:

    在这里插入图片描述


    方法区(元数据空间)

    ​jdk1.8之前叫做方法区,主要放".class"文件加载进来的类,还有一些类似的常量池的东西。jdk1.8以后,改名为"Metaspace"-元数据空间。
    在这里插入图片描述


    程序计数器

    ​ 我们写好的java代码会编译成字节码文件,包含各种字节码指令,然后字节码才能被JVM字节码执行引擎,一条条的去执行

    ​ 我们JVM支持多个线程,我们的代码会开启多个线程并发的执行不同的代码,每个线程都有一个程序计数器,单独记录当前对应线程执行到哪一条字节码指令了。
    在这里插入图片描述


    Java虚拟机栈(栈区)

    ​ JVM必须有一块区域是来保存每个方法的局部变量的,这个区就是栈区。

    每个线程对应一个栈区,每一个线程执行了一个方法,就会创建对应方法的栈桢,压入栈底,同时,该方法里面也会存放包含在方法里面的局部变量之类的数据。以此类推,方法执行完毕则出栈。
    在这里插入图片描述


    Java堆内存(堆区)

    我们在堆区存放的一个局部变量是用来存放该变量new出来对象的地址所有new出来的对象都在堆区。
    在这里插入图片描述


    总结:

    1. 加载类进入内存,存放在方法区
    2. 然后有一个主线程执行类中的main方法,通过程序计数器关联记录。
    3. main方法执行,压入栈底,之后的方法依次压入
    4. 方法执行过程中,需要创建实例对象,栈桢中存放局部变量,堆区存放new出来的具体对象实例,局部变量存放该实例的地址。
    5. 方法执行完依次弹出栈
    展开全文
  • JVM的内存分区

    2018-01-07 20:27:00
    JVM的内存分区 这篇文章尝试讨论清楚JVM的内存分区情况。 1. JVM的内存和系统内存的关系 下是对系统内存及JVM内存的大致描绘 对大多数操作系统,内存可以分为物理内存RAM及Swap(交换区)两大部分,Swap Space...

    JVM的内存分区

    这篇文章尝试讨论清楚JVM的内存分区情况。

    1.       JVM的内存和系统内存的关系

    下图是对系统内存及JVM内存的大致描绘

     

    对大多数操作系统,内存可以分为物理内存RAM及Swap(交换区)两大部分,Swap Space在物理上是一块独立的磁盘区域,当操作系统发现内存不够使用时,便开始使用交换区。

    在系统层面,Linux系统的内存大致可以划分为:

    1. BIN,内核引导内存
    2. Kernel Space(内核内存),操作系统进行程序调度,内存分配,硬件资源管理等动作需要的内存
    3. User Space(用户内存),提供给各个进程使用

    一个JAVA程序开始运行之后,是存在于系统之上的一个进程。这个进程所占用的内存由JVM管理。

    2.       JVM内存的划分

    JVM的内存可以划分为以下几个主要部分:

     

    1. Program Counter Register,程序计数器,线程私有,是一块较小的内存空间,可以理解为当前线程执行字节码的行号指示器。
    2. Method Area,方法区,由各线程共享,用于加载类信息,常量,静态变量等数据。在HotSpot虚拟机的实现中,称这部分内存为Permanent Generation(永久代),这使得虚拟机可以像管理堆内存一样对这部分内存进行管理,可以通过参数-XX:MaxPermSize指定永久代的上限。而在其他虚拟机实现中并未使用永久代来实现方法区。当方法区无法满足内存分配需要时,便会抛出OutOfMemoryError。
    3. Java Heap,堆,线程共享,对大部分应用来说,这是JVM种最大的一块内存区域。JVM规范规定:所有的对象实例和数组都要在堆上分配。

    堆是内存回收的主战场,因此由称为Garbage Collected Heap(GC堆),在分代收集策略下,堆可以进一步划分为新生代和老年代,更细致的:

    • Eden区,对象第一次创建时,从Eden区开辟空间
    • Survivor区,当Eden区不足以进行下次内存分配时,JVM触发一次GC,经过GC但未被回收的对象,被转移到Survivor区。Survivor分为From,To两部分,多次内存回收时未被回收的对象在这两块区域中来回转移。
    • Old区,当经过一定次数的GC后仍未被回收的对象,JVM将其转移到老年代区

      4. JVM Stack,JAVA虚拟机栈,线程私有,其生命周期与对应的线程相同。当每个方法执行时,均会创建一个栈帧(Stack Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息。每个方法的执行和完成,便对应着Stack Frame在虚拟机栈中的出栈和入栈的过程。通常意义上粗糙地将JVM内存划分为堆和栈,其中的栈便指的是JVM Stack.

      5. Native Method Stack,本地方法栈,与JVM Stack类似,本地方法栈对应的是Native方法的执行管理。

    此外,程序运行所需要的内存开辟在JVM的内存空间中,也可以直接申请系统内存(Directive Memory),但是直接申请的系统内存不受JVM的垃圾回收管理,其释放由系统层面控制,因此对于不关注内存回收的JAVA程序员来说,容易导致内存溢出等问题的发生。

    转载于:https://www.cnblogs.com/luojiahu/p/8231502.html

    展开全文
  • jvm内存分区

    2018-12-21 17:33:15
    java内存是由jvm进行管理的,其内存简易模型如下: jvm管理的内存大体上可分为方法区、堆、程序计数器、线程栈、本地方法区这几部分。 方法区: 主要存放类的元信息(包括类的名称、修饰符、静态变量、final常量...

    java内存是由jvm进行管理的,其内存简易模型如下图:

    在这里插入图片描述
    jvm管理的内存大体上可分为方法区、堆、程序计数器、线程栈、本地方法区这几部分。
    方法区:
    主要存放类的元信息(包括类的名称、修饰符、静态变量、final常量、属性信息、方法信息)。
    本区域全局共享。
    会被GC管理。
    加载类过多,需要内存超出其设定内存大小时,会抛出OutOfMemory异常。
    堆区:
    该区域是GC主要管理的区域,存放内容包括Class对象、数组对象、通过new关键字创建的对象。
    本区域全局共享。
    会被GC管理。
    程序计数器:
    记录当前线程运行的指令位置。
    本区域线程私有。
    线程栈:
    存储方法栈帧。执行线程每执行一个方法,都会创建一个栈帧插入线程栈中,顾名思义,这些栈帧在线程栈中是以栈的数据结构进行维护的,执行线程从一个方法退出时会从栈顶删除一个栈帧。每一个栈帧里存储的信息包括局部变量表、操作数栈等。
    本区域线程私有。
    本地方法区:
    主要支持一些jvm内部的native方法的调用。例如java通过native方法实现了CAS的操作,并发包的原子类的相关操作就是基于此进行实现

    展开全文
  • Java 内存分区讲解

    千次阅读 多人点赞 2019-07-25 11:19:46
    本文将全面讲解Java虚拟机中的内存模型和分区。 Java虚拟机把管理的内存划分为几个不同的数据区域,如下所示。 下面就分别展开讲解一下每个区域的功能。 1. Java堆 Java堆是被所有线程共享的一块内存区域,...

    对于一个Java开发者,了解Java中的对象、变量等存放的内存区域是十分重要的。本文将全面讲解Java虚拟机中的内存分区。

    Java虚拟机把管理的内存划分为几个不同的数据区域,如下图所示。

    下面就分别展开讲解一下每个区域的功能。

    1. Java堆

    Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,所有的对象实例以及数组都要在堆上分配。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。

    从内存回收的角度看,由于现在收集器基本都采用分代收集算法,所以Java堆还可以细分为新生代老年代;再细致一点的有Eden空间、From Survivor空间和To Survivor空间等。

    从内存分配的角度看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer, TLAB)。

    根据Java虚拟机规范的规定,Java堆可以处于物理上不连续的内存空间中,只要逻辑上是连续的即可。在实现时,既可以实现成固定大小的,也可以是可扩展的,不过当前主流的虚拟机都是按照可扩展来实现的。

    如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

    2. 方法区

    方法区与Java堆一样是所有线程共享的内存区域,用于存储已被虚拟机加载的类信息常量静态变量即时编译器编译后的代码等数据。虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap非堆),目的是与Java堆区分开。

    Java虚拟机规范对方法区的限制非常宽松,除了和Java堆一样不需要连续的内存和可以选择固定大小或者可扩展外,还可以选择不实现垃圾收集。相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入了方法区就如永久代的名字一样“永久”存在了。这个区域的内存回收目标主要是针对常量池的回收和对类型的卸载,一般来说,这个区域的回收“成绩”比较难以令人满意,尤其是类型的卸载,条件相当苛刻,但是这部分区域的回收确实是有必要的。

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

    根据Java虚拟机规范的规定,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

    3. Java虚拟机栈

    Java虚拟机栈是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的时候都会同时创建一个栈帧用于存储局部变量表操作栈动态链接方法返回地址等信息。每一个方法从被调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程,如下图所示。

    局部变量表用于存放方法参数方法内部定义的局部变量,其大小在代码编译期间已经确定,在方法运行期间不会改变。局部变量表以变量槽Slot)为最小存储单位,每个Slot能够存放一个boolean、byte、char、short、int、float、reference(对象引用)和returnAddress(指向了一条字节码指令的地址)类型的32位数据,对于64位的数据类型long和double,虚拟机会以高位对齐的方式为其分配两个连续的Slot空间。

    在方法执行时,如果是实例方法,即非static方法,局部变量表中第0位Slot默认存放对象实例的引用,在方法中可以通过关键字 this 进行访问,方法参数按照参数列表顺序,从第1位Slot开始分配,方法内部变量则按照定义顺序进行分配其余的Slot。

    在Java虚拟机规范中,对这个区域规定了两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,当扩展时无法申请到足够的内存时会抛出OutOfMemoryError异常。

    4. 本地方法栈

    本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务

    虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由地实现它,甚至有的虚拟机(如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。

    与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowErrorOutOfMemoryError异常。

    5. 程序计数器

    程序计数器可以看作是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理和线程恢复等基础功能都需要依赖这个计数器来完成。

    由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储。

    如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Native方法,这个计数器值则为空(Undefined)。

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

     

    展开全文
  • 11 内存分区与分页

    2020-04-29 18:08:29
    在第10节已经说到,程序是分段载入内存的,那么不同的段就要在内存中找不同的空闲地址,即将程序的各个段载入到相应的内存分区。直接的想法是有固定分区和可变分区两种。固定分区就是将内存等分成K个分区,然后将段...
  • Java内存分区

    千次阅读 2018-08-29 13:36:35
    Java程序是交由JVM执行的,所以Java内存区域划分的时候事实上是指JVM区域划分 1、Java程序执行过程: 如所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类...
  • iOS内存分区学习浅析

    2019-01-03 22:19:11
    所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,...内存分区示意 内存分类(RAM、ROM) RAM(random access memory)运行内存 CPU可以直接访问,读写速度非常快,但是不...
  • java虚拟机内存分区

    千次阅读 2017-01-04 11:12:42
    1. 内存模型以及分区JVM内存模型如下所示: JVM内存模型此处我们集中注意中间绿色的部分,该部分为JVM的运行时内存,该部分包含了: 线程私有的(灰色): 程序计数器:记录执行到第几条指令 虚拟机方法栈:...
  • java中的内存分区

    2020-06-29 08:24:10
    一个数组的内存图 两个数组的内存图 两个数组指向同一处
  • ​如上所示,Java内存区域运行时数据区,分为程序计数器、虚拟机栈、本地方法栈、堆、方法区等五个区域。其中,堆和方法区是线程共享的,程序计数器、虚拟机栈和本地方法栈是线程隔离的。下面具体讲一下这五个区域...
  • 如上,jvm在运行时,会把其所管理的内存分为以上5个模块的,其中永久区已经在jdk 1.8中被元空间所替代。下面咱们分点描述。 1.方法区(永久区): 方法区和堆类似,是各个线程共享的内存区域,它用于存储类信息,常量...
  • java 内存模型欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右...
  • 内存分区模型 1.1 JVM栈 JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,栈中存的是基本数据类型和堆中对象的引用(java中定义的八种基本类 型:boolean、char、byte、short、int、long、float、double)...
  • 下面试着举例说明:JVM内存分区:如上所示,JVM主要分为以上几块:程序计数器,本地方法栈,虚拟机栈,堆和方法区。稍微粗糙一些得分法是JVM分为栈和堆,栈包括虚拟机栈,本地方法栈,程序计数器,堆分为堆和方法...
  • 存放对象的实例,所有对象和数组都在堆上分配,是jvm所管理的内存中最大的一块区域。 栈 虚拟机栈,java执行方法的内存模型。存储局部变量表,操作数栈,动态链接,方法出口等信息。 本地方法栈 和虚拟机栈类似,...
  • C语言内存模型如下: 从中可以看出内存被分成了5个区,每个区存储的内容都不相同。 1、栈区(stack) 传入函数的参数值、函数体内声明的局部变量等,由编译器自动分配释放,通常在函数执行结束后就释放了...
  • 动态内存分区分配方式模拟

    千次阅读 2011-02-05 22:52:00
    假设初始态下,可用内存空间为640K,并有下列请求序列,请分别用首次适应算法和最佳适应算法为作业分配和回收内存块,...* description:动态内存分区分配方式模拟 * author:rayment * creat date:2010-11-17 *
  • Ubuntu分区图

    2020-05-27 21:30:21
    分区大小如下 其中swap空间为计算机的内存
  • 在学习C++过程中,对其内存分区和各种变量、常量的定义及存放,并考虑其生命周期,很是头疼。今天根据自己的理解和查阅各个资料,整理记录了下,但还是不够详细,请大家斧正! 直接绘制出一个分析: 代码...
  • 8 C/C++之内存分区

    2019-08-17 21:54:16
    一个程序要运行,就必须先将可执行的程序加载到计算机内存里,程序加载完毕后,就可以形成一个运行空间,并如所示的那样进行布局。 代码区存放的是程序的执行代码;数据区存放的是全局数据、常量、静态变量等...
  • 这段时间开发环境Es新接了一个平台做测试,结果导致频繁gc,隔三岔五...从上可以看到,jvm中内存分区可以分为heap区和非heap区域。 heap区域包括: old space eden from space to space 非heap区域包括: perman
  • 同时,我们要了解:组成C语言程序的不同的元素(如变量、常量、指令等)要放在内存中不同的地方,我们看下: 这个就是内存分区表格,C编译器将内存划分成几个分区,将C语言程序的不同元素放入不同的分区。...
  • 动态内存分区分配方式模拟[转帖]

    千次阅读 2012-10-09 15:41:26
    百度面试题: 给定一块内存,大小为1M,现有一些内存请求序列1K、2K、4K、10K........ ...为作业分配和回收内存块,并显示出每次分配和回收后的空闲分区链的情况来以及内存占用情况。 作业1申请130K 作业2申
  • c-8 内存分区之数据区

    2020-07-17 22:53:52
    如下所属: 例子: #include <stdio.h> //全局初始化区域 int globalIntOne=0x123456; int globalIntTwo=0x5201314; //全局未初始化区域 int uninitGlobalIntOne; int uninitGlobalIntTwo; void
  • jvm内存分区和GC机制详解:一

    千次阅读 2018-04-27 18:14:45
    按照对象的生存与回收进行... 所以堆内存中所有的数据是线程们都可以进行操作的,而且也因为jvm只提供了一个堆内存,才有了jvm独特的GC机制和堆内存的划分。(来自 https://www.cnblogs.com/ygj0930/p/6522828.ht...
  • 1 JVM体系结构 方法区:存放JVM加载的类型信息。包括:类型基本信息,常量池,字段信息,方法信息,类变量,指向ClassLoader的引用,Class类的引用,方法表等。 (对应JVM内存配置中的-PermSize等) java堆...
  • 以下内容来自 ... 对于一个完整的程序,在内存中分布情况如下:     值得一提的是:在C#中struct存放在栈区,class存放在堆区,所以一般struct要比class要快的。   堆和栈
  • iOS 内存合并分区

    2017-11-30 15:11:05
    //联系人:石虎 QQ:1224614774 昵称:嗡嘛呢叭咪哄 一概念: 注意:图形表示 1: 2: 3: 4: 5: 6: 7: 8: 谢谢!!!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,033
精华内容 413
关键字:

内存分区图