精华内容
下载资源
问答
  • JVM内存区域分为五个部分,分别是堆,方法区,虚拟机栈,本地方法栈,程序计数器。 JVM内存区域 堆。 堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上,Java堆可使用-Xms -...
    1. Java虚拟机内存的五大区域
      Java的运行离不开Java虚拟机的支持,今天我就跟大家探讨一下Java虚拟机的一些基础知识。
      JVM内存区域分为五个部分,分别是堆,方法区,虚拟机栈,本地方法栈,程序计数器。
      JVM内存区域

    在这里插入图片描述
    1.堆。 堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上,Java堆可使用-Xms -Xmx进行内存控制,值得一提的是从JDK1.7版本之后,运行时常量池从方法区移到了堆上。
    2.方法区。它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据,方法区在JDK1.7版本及以前被称为永久代,从JDK1.8永久代被移除。
    3.虚拟机栈。虚拟机栈中执行每个方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
    4.本地方法栈。与虚拟机栈发挥的作用相似,相比于虚拟机栈为Java方法服务,本地方法栈为虚拟机使用的Native方法服务,执行每个本地方法的时候,都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口等信息。
    5.程序计数器。指示Java虚拟机下一条需要执行的字节码指令。
    以上五个区域是Java虚拟机内存划分情况,其中方法区和堆被JVM中多个线程共享,比如类的静态常量就被存放在方法区,供类对象之间共享,虚拟机栈,本地方法栈,pc寄存器是每个线程独立拥有的,不会与其他线程共享。


    作者:忽如一夜听春雨
    来源:CSDN
    原文:https://blog.csdn.net/qq_24499615/article/details/80012470

    展开全文
  • jvm的内存结构主要包含哪几个部分发布时间:2020-06-04 14:24:33来源:亿速云阅读:196作者:Leahjvm的内存结构主要包含哪几个部分?针对这个问题,今天小编总结这篇有关内存结构的文章,希望能帮助更多想解决这个...

    jvm的内存结构主要包含哪几个部分

    发布时间:2020-06-04 14:24:33

    来源:亿速云

    阅读:196

    作者:Leah

    jvm的内存结构主要包含哪几个部分?针对这个问题,今天小编总结这篇有关内存结构的文章,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。

    jvm内存分为五大块:

    97d3854d1edebdfea30d300ef2fe4203.png

    标灰的是线程公有的内存区域,没有标灰的是线程私有

    一:程序计数器:程序计数器是用来指示当前线程要执行哪条指令,并且在执行完该条指令后让程序计数器指向下一条指令,直到将程序执行完毕。指令需要靠cpu来执行,在多线程中,多个线程是通过轮流切换分配cpu的时间片而执行的,在切换时需要记录当前执行到了哪条指令以便将来继续执行,每一个线程都需要有自己的程序计数器,所以程序计数器是线程私有的内存。

    二:虚拟机栈:通常我们把jvm的内存粗略的分为堆和栈,其中的栈指的就是虚拟机栈,虚拟机栈也是线程私有的。

    虚拟机栈对应的是方法的内存区域,每个方法执行时都会创建一个栈帧,用来存储该方法的局部变量表,操作数栈,动态链接,方法返回地址:

    56fc3048c09eaf4b63b7e8290a73cd02.png

    1.局部变量表:局部变量表中存储的是方法的参数和方法中定义的局部变量,在编译期间就为局部变量表分配好了内存空间。局部变量表中存储三种类型的数据:

    (1) 基本数据类型

    (2) 引用类型:指向一个对象在内存中的地址

    (3) returnAddress类型:指向指令的地址(已经很少见了,指向异常处理的指令,现在已经由异常表代替)

    2.操作数栈:当虚拟机执行一些指令的时候会对操作数栈进行入栈或出栈的操作,比如iadd指令将两个数相加,会先将操作数栈中的两个数弹出来(出栈),相加后再压入栈(入栈)中。

    3.动态链接:在运行时常量池中存储了诸如类名,方法名,我们要找到目标类,执行相应的方法就需要用到动态链接,栈帧中有一个指向运行时常量池的引用,通过这个引用可以找到相应的类名和方法名,但是光知道名称是没法执行方法的,需要通过名称找到相应的类和方法在内存中的地址,这个过程就是动态链接。

    4.方法返回地址:当方法执行完以后如果有返回值,就会把这个返回值返回给该方法的调用者,方法的返回就是我们java中用到的return命令。方法返回之后调用者需要继续往下执行就需要知道要执行的地址,该地址就是方法返回地址,它被记录在了栈帧中,当然在发生异常的情况下不会有返回值,要继续执行的地址可以通过异常处理器表来确定。

    虚拟机栈可能出现两种类型的异常:

    1.线程请求的栈深度大于虚拟机允许的栈深度会抛出StackOverflowError,(虚拟机栈空间不能动态扩展的情况下)

    2.如果虚拟机栈空间可以动态扩展(目前多数的虚拟机都可以),当动态扩展无法申请到足够的空间时会抛出OutOfMemory异常。

    三:本地方法栈:本地方法栈与虚拟机栈的作用是一样的,区别在于虚拟机栈为虚拟机执行java方法服务,而本地方法栈为虚拟机执行native方法服务,native方法为本地方法,不是用java语言写的有可能是c或者c++写的,在jdk中就有很多c的代码,就是提供给本地方法来调用的。

    四:堆:通常我们把jvm的内存粗略的分为堆和栈,其中的堆就是指它,它是虚拟机中占用内存最大的一块,是被所有线程共享的一块区域,它是用来存放对象实例的。是垃圾收集器管理的主要区域。

    五:方法区:方法区也是被所有线程共享的一块区域,它存储的是类信息,常量,静态变量,编译后的字节码等信息。方法区中还有一块区域“运行时常量池“:运行时常量池中存储的是编译期生成的各种字面量和符号引用。字面量相当于Java里常量的概念,比如字符串,声明为final的常量值等,符号引用包括了:类和接口名,字段名,方法名。

    看完上述内容,你们对jvm的内存结构有进一步的了解吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读。

    展开全文
  • 内存分为几个部分?堆与栈的区别

    千次阅读 2018-01-24 15:45:44
    五大内存分区  在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。  栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部...

    五大内存分区

        在C++中,内存分成5个区,他们分别是自由存储区全局/静态存储区常量存储区

        栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。

        堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

        自由存储区,就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。

        全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

        常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改(当然,你要通过非正当手段也可以修改,而且方法很多,在《const的思考》一文中,我给出了6种方法)
        

        明确区分堆与栈:

        在BBS段上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。

        首先,我们举一个例子:

        void f( ) {   int* p=new int[5];   } 

        这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针p。在程序会先确定在堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中,他在VC6下的汇编代码如下:
        00401028   push        14h
        0040102A   call        operator new (00401060)
        0040102F   add         esp,4
        00401032   mov         dword ptr [ebp-8],eax
        00401035   mov         eax,dword ptr [ebp-8]
        00401038   mov         dword ptr [ebp-4],eax
        这里,我们为了简单并没有释放内存,那么该怎么去释放呢?是delete p么?哦,错了,应该是delete []p,这是为了告诉编译器:我删除的是一个数组,VC6就会根据相应的Cookie信息去进行释放内存的工作。
        好了,我们回到我们的主题:堆和栈究竟有什么区别? 
        主要的区别由以下几点:
        1、管理方式不同;
        2、空间大小不同;
        3、能否产生碎片不同;
        4、生长方向不同;
        5、分配方式不同;
        6、分配效率不同;

        (1)管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。

        (2)空间大小:一般来讲在32位系统下,堆内存可以达到4G的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在VC6下面,默认的栈空间大小是1M(好像是,记不清楚了)。当然,我们可以修改:    
        打开工程,依次操作菜单如下:Project->Setting->Link,在Category 中选中Output,然后在Reserve中设定堆栈的最大值和commit。
        注意:reserve最小值为4Byte;commit是保留在虚拟内存的页文件里面,它设置的较大会使栈开辟较大的值,可能增加内存的开销和启动时间。

        (3)碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。

       (4) 生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。

        (5)分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

        (6)分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。

        从这里我们可以看到,堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。

        虽然栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。
        无论是堆还是栈,都要防止越界现象的发生(除非你是故意使其越界),因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生以想不到的结果,就算是在你的程序运行过程中,没有发生上面的问题,你还是要小心,说不定什么时候就崩掉,那时候debug可是相当困难的:) 


    展开全文
  • Java内存模型存放数据 程序计数器 每条线程的程序计数器,相互独立,线程私有的。 若线程正在执行Java 方法,则计数器记录正在执行的虚拟机字节 码指令的地址;若正在执行Natvie 方法,则计数器值...
    Java内存模型存放数据
    程序计数器

    每条线程的程序计数器,相互独立,线程私有的。

    若线程正在执行Java 方法,则计数器记录正在执行的虚拟机字节

    码指令的地址;若正在执行Natvie 方法,则计数器值(Undefined)

    是唯一一个没有任何OutOfMemoryError 的区域
    内部方法栈

    地方法栈区域可能会抛出StackOverflowError 和OutOfMemoryError异常。其他参见Java虚拟机栈

     

    线程私有,

    生命周期与线程相同

    Java虚拟机栈

    每个方法被执行的时候都会同时创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口。

    1. 局部变量表存放了编译期可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,引用指针或句柄 )和returnAddress 类型。
    2. 两种异常状况:
      1. 如果线程请求的栈深度大

        于虚拟机所允许的深度,将抛出StackOverflowError 异常;

      2. 如果虚拟机栈可以动态扩展

        (当前大部分的Java 虚拟机都可动态扩展,只不过Java 虚拟机规范中也允许固定长度的

        虚拟机栈),当扩展时无法申请到足够的内存时会抛出OutOfMemoryError 异常。

    线程私有,

    生命周期与线程相同

    唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。曾经的描述是:所有的对象实例以及数组都要在堆上分配,但是目前有所变化。

    GC的主要管理区域,是JVM中最大一个块区域。

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

    方法区

    被虚拟机加载的 类信息、常量、静态变量、即时编译器编译后的代码等数据。

    包含运行时常量池,编译期生成的各种字面量和符号引用,在类加载后存放到方法区的运行时常量池中。运行期间也可能将新的常量放入池中,比如String 类的intern() 方法。

    当方法区无法满足内存分配需求时,将抛出

    OutOfMemoryError 异常。

     

    展开全文
  • java对象的内存布局:对象头:包含...还必须包括数据的长度信息实例数据:接下来就是对象的成员变量的内容,包括了从父类继承下来的内容对齐补白:jvm要求java对象的起始地址必须是8的倍数,所以这部分内容用来对齐...
  • JVM内存模型:主要指运行时的数据区,包括五个部分。 栈(Stack): 也叫方法栈,是线程私有的,线程在执行每个方法时,都会创建一个栈阵,用来存储局部变量表,操作栈、动态链接,方法出口等信息,调用方法时执行...
  • 基于内存的文件系统

    2019-04-17 15:19:35
    资源中包含部分,一部分是基于内存的文件系统的源代码,这一部分包括内核以及外部封装两个子部份。第二部分是实验运行的截图,以及工作原理的截图。第三部分是课程设计报告,里面重点讲述的是每个函数的具体功能。...
  • STM32 LwIP内存配置

    2018-03-27 14:37:22
    Opt.h 头文件中包括协议使能和设置,内存设置,调试选项等等。而 Lwipopts.h 头文件中集合了 opt.h 中一些常常需要改动的部分。一般情况下用户对 lwipopts.h 头文件进行修改就可以了。不管是对 lwipopts.h 还是 opt....
  • Android内存优化杂谈

    2021-01-04 23:46:47
    Android内存优化是我们性能优化工作中比较重要的一环,这里其实...在这里我们不再细述PSS、USS等概念与Android应用的内存管理,如对这部分内容感兴趣,可自行阅读文末的参考文章。 内存泄露的检测与修改 内存泄露:简单
  • 工作内存是私有区域,所以工作内存可以对应着JVM运行时数据区的线程私有部分包括虚拟机栈,本地方法栈,程序计数器。 主内存是共享区域,所以主内存可以对应着JVM运行时数据区的线程共享部分包括堆和方法区。 ....
  • JVM自动内存管理机制

    2021-02-25 02:33:15
    Java自动内存管理机制包含部分内存分配和内存回收,要想理解内存分配和回收的机制,则需要了解下Java内存区域(Java运行时数据区),这篇随笔将按照下面的线索进行逐步解析:1.Java运行时数据区2.对象“已死”的...
  • JS哪些操作会造成内存泄露

    万次阅读 2017-09-07 22:45:04
    内存泄漏:指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束。 1、JS的回收机制 JavaScript垃圾回收的机制很简单:找出不再使用的变量,然后释放掉其占用的内存,但是这个过程不是实时的,因为...
  • 这是我剖的2.6.15版本的linux内核源码 共享内存部分源码 其中包括shmget shmmat shmdt shmctl函数的内核调用,以及内核创建共享内存的过程。
  • jvm(一)——内存区域划分

    千次阅读 2018-08-31 19:29:16
    前言:jvm内存划分为多个区域,每个不同的区域分别有着不同的功能和不同的用途,本篇博客旨在说清楚区域的划分、名称、属性以及作用,本篇博客是参考了多篇博客的结果,参考博客会在文章结尾进行说明。 上图中...
  • JVM内存区域分为五个部分,分别是堆,方法区,虚拟机栈,本地方法栈,程序计数器。 堆。 堆是Java对象的存储区域,任何用new字段分配的Java对象实例和数组,都被分配在堆上,Java堆可使用-Xms -Xmx进行内存控制,...
  • 内存屏障简介

    千次阅读 多人点赞 2020-06-22 15:34:57
    为了限制性能下降,CPU被设计成在从内存 中获取数据的同时,可以执行其他指令和内存引用。这明显会导致指令 和内存引用乱序执行,并导致严重的混乱 仅仅在两个CPU之间或者CPU与设备之间存在需要交互的可能性 时,才...
  • 内存数据库从范型上可以分为关系型内存数据库和键值型内存数据库。 在实际应用中内存数据库主要是配合oracle或mysql等大型关系数据库使用,关注性能。 作用类似于缓存,并不注重数据完整性和数据一致性。 基于...
  • 内存一般采用半导体存储单元,包括随机存储器(RAM),只读存储器(ROM),以及高速缓存(CACHE)。只不过因为RAM是其中最重要的存储器。(synchronous)SDRAM同步动态随机存取存储器:SDRAM为168脚,这是目前...
  • jvm栈帧包含哪些内容

    千次阅读 2018-06-07 15:59:46
    栈帧:前面说了,当线程执行到某个方法时就会往方线程栈中压入一个帧,称为栈帧,栈帧中包含了方法的局部变量表、操作数栈、返回地址、动态连接等信息局部变量表:顾名思义就是用来存储java方法中的局部变量的,在...
  • 内存是由哪几部分组成?有何特点?答案:4信息版本:手机版解决时间 2019-10-06 02:44已解决2019-10-05 13:10简述计算机的内存和外存有何区别与特点?内存是由哪几部分组成?有何特点?最佳答案2019-10-05 14:04(1)...
  • 工作内存: 每个线程都有一个工作内存,工作内存中主要包括两个部分,一个是属于该线程私有的栈和 对主存部分变量拷贝的寄存器(包括程序计数器PC和cup工作的高速缓存区)。 所有的变量都存储在主内存中(虚拟机内存的...
  • JVM 内存模型主要指运行时的数据区,包括 5 个部分,如下图所示 栈、本地方法栈、程序计数器这三个部分都是线程独占的,线程安全 栈也叫方法栈,是线程私有的,线程在执行每个方法时都会同时创建一个栈帧,...
  • 概述 想必在linux上写过程序的同学都有分析进程占用多少内存的经历,或者被问到这样的问题——你的程序在运行时占用了...当然如果更加深入一点,你可能会问进程所占用的那些物理内存都用在了哪些地方?这时候to...
  • 文章目录windows如何查看内存条型号信息cpu型号信息包括 内存条个数 和 cpu个数前言一、查看内存条型号信息和个数二、查看cup型号 信息 个数总结 其他的小知识 前言 不说那么多废话 很多人网上查 关于windows如何...
  • 问题导读:1、如何配置 Flink 进程的内存?2、如何配置总内存?3、如何配置 TaskManager 内存?4、如何配置堆内存和托管内存?Apache Flink 基于 JVM 的高效处理能力,依赖于其对各组件内存用量的细致掌控。考虑到...
  • Linux内存目录

    2021-05-10 02:05:52
    本文概述内存目录包含整个系统的文件。所有设备信息, 进程运行中的数据或系统相关信息都存储在此目录中。内存目录包含以下目录。/ dev/%/ sys/ dev” dev”一词是设备的缩写。如你所知, 在Linux操作系统中, 所有...
  • #include<stdio.h> /** 在C中动态分配内存的基本步骤有: ... realloc : 在之前分配的内存块的基础上,将内存重新分配为更大或者更小的部分  calloc: 从堆上分配内存并清零  fre...
  • 其中主要包括了《操作系统精髓与设计原理(原书第6版)》,部分博客中的原图,实验2的部分源码——主要用于内存检测的代码:包括移植linux的部分与根据Detecting Memory (x86)的代码,Detecting Memory (x86)网页,...
  • 接受内存存储器或主存储器,是计算机的主要组成部分,它与外部存储器有关. 内存的质量和容量的大小会影响计算机的速度.通常使用的微型计算机存储器包括磁芯存储器和半导体存储器. 当前,微型计算机的存储器使用...
  • 内存测试_内存检测工具大全

    万次阅读 2020-01-25 22:12:05
    测试内存,往往不局限于一种软件,因为每种工具都有自己的局限性。灵活运用多种工具,是为了实现最大的测试效果,提升产品质量 1、《HCI MemTest》 https://hcidesign.com/memtest/ HCI MemTest恐怕是世界上...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,818,569
精华内容 727,427
关键字:

内存包括哪些部分