`
afunti
  • 浏览: 105443 次
  • 性别: Icon_minigender_1
  • 来自: 安徽
社区版块
存档分类
最新评论

jvm中堆和栈

阅读更多
http://blog.sina.com.cn/s/blog_52fea7b60100pi0g.html

堆:堆是heap,是所谓的动态内存,其中的内存在不需要时可以回收,以分配给新的内存请求,其内存中的数据是无序的,即先分配的和随后分配的内存并没有什么必然的位置关系,释放时也可以没有先后顺序。一般由使用者自由分配,malloc分配的就是堆,需要手动释放。

      堆栈:就是STACK。实际上是只有一个出入口的队列,即后进先出(FIFO),先分配的内存必定后释放。一般由,由系统(编译器)自动分配,存放存放函数的参数值,局部变量等,自动清除。

JVM堆栈:

    JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。

      我们知道,某个线程正在执行的方法称为此线程的当前方法.我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的 Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据.这个帧在这里和编译原理中的活动纪录的概念是差不多的.

       从Java的这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。

       每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配堆内存是自动初始化。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。

具体的说:

       栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

       堆是一个运行时数据区,类的对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。java中的对象和数组都存放在堆中。

       栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象引用。

       栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:

         int a = 3;

         int b = 3;

         编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量
分享到:
评论

相关推荐

    JVM中堆内存和栈内存的区别

    因此,理解堆和栈的内存管理机制对于编写高效、无内存问题的Java程序至关重要。 在内存分配策略上,静态存储分配通常在编译时完成,适合静态数据结构;栈式存储分配在函数调用时进行,适用于局部变量和固定大小的...

    堆和栈总结

    对于Java语言而言,堆和栈的概念尤为重要,因为JVM如何管理和使用这两种结构直接影响到程序的性能和稳定性。 #### 二、Java堆栈详解 ##### 2.1 Java堆栈定义 Java中的堆栈主要指的是JVM为每个线程分配的栈空间,...

    Java中堆和栈的区别

    为了确保程序的高效运行以及资源的有效利用,Java虚拟机(JVM)将内存划分为堆和栈两种类型。这两种内存区域各自承担着不同的职责,并且对于程序员来说了解它们之间的差异至关重要。 #### 二、Java中的栈内存 Java中...

    java中的堆和栈

    ### Java中的堆和栈 #### 一、概述 在Java编程语言中,堆和栈是两种重要的内存区域,它们各自负责存储不同类型的数据。理解这两者之间的区别对于掌握Java内存管理和性能优化至关重要。本文将深入探讨Java中堆和栈...

    JVM 堆和栈的区别

    总结来说,JVM堆和栈的主要区别在于: 1. 使用场景:栈主要用于存储方法的局部变量和对象引用,而堆是对象的实际存储位置。 2. 存储速度:栈内存存取速度快,堆内存较慢。 3. 空间管理:栈内存由系统自动管理,空间...

    什么是堆和栈(简单版).pdf

    堆和栈是Java编程语言中两个非常重要的概念,它们是Java虚拟机(JVM)中用于存储和管理数据的两个主要组件。在本文中,我们将深入探讨堆和栈的概念、实现和应用。 堆(Heap) 堆是一种特殊的数据结构,用来存储...

    Java中堆内存与栈内存分配浅析

    程序运行时所使用的内存主要分为两类:堆内存(Heap Memory)和栈内存(Stack Memory)。理解这两种内存类型的工作原理及其区别对于优化程序性能、避免内存泄漏等问题至关重要。本文将深入探讨Java中堆内存与栈内存...

    JAVA中堆和栈的区别 - 路人浅笑 - 博客园.rar_java编程

    在Java编程中,堆和栈是两种非常重要的内存区域,它们各自承担着不同的职责,对于程序的运行效率和内存管理有着至关重要的作用。下面将详细阐述堆和栈的区别。 1. **栈(Stack)** - **定义**:栈是一种线性数据...

    堆和栈的区别

    Java编程语言中,内存管理是通过堆和栈两种机制实现的。栈主要处理基础类型变量和对象引用,而堆则是存储复杂对象和数组的主要区域。理解这两种内存区域的区别和工作原理对于优化代码性能至关重要。 首先,栈内存是...

    2024java面试题.pdf

    1. **JVM 中堆和栈的区别:** - **堆**:运行时数据区,用于存放对象实例,是 JVM 的主要管理区域之一。 - **栈**:线程私有的,用于存储局部变量和部分过程调用的上下文。 2. **Java 堆空间及 GC 机制:** - ...

    Java中堆与栈的内存分配.pdf

    这篇文章将对Java中的堆和栈的内存分配进行详细的介绍。 1. 堆和栈的概念 在Java中,内存被分为两部分:堆(Heap)和栈(Stack)。堆是用来存放对象的,它是由Java虚拟机(JVM)管理的。栈是用来存放基本类型的...

    堆和栈的区别可以用如下的比喻来看出

    在计算机科学中,堆和栈是两种不同的内存管理机制,它们在编程语言中扮演着重要的角色,尤其是在Java这样的高级语言中。理解堆和栈的区别对于优化代码性能和避免内存问题至关重要。 首先,栈(Stack)是一种后进先...

    java里的堆和栈

    ### Java里的堆和栈 #### 一、概述 在Java编程中,“堆”与“栈”的概念至关重要。它们是程序运行时内存管理的核心部分。本文将深入探讨Java中堆和栈的区别及其工作原理。 #### 二、Java内存区域划分 在Java中,...

    JVM中[本地方法栈]的所有内容-xmind脑图pdf

    通过阅读"JVM中[本地方法栈]的所有内容-xmind脑图pdf"这样的资源,可以更直观地掌握本地方法栈的细节,便于理解和实践。在学习过程中,结合Xmind工具打开脑图,可以清晰地梳理知识点,使得学习更加高效易懂。

    Java中的堆和栈.pdf

    在Java编程语言中,内存管理...总的来说,理解Java中的堆和栈可以帮助开发者更有效地管理内存,避免不必要的资源浪费,提高程序性能。合理使用栈和堆可以优化内存使用,减少垃圾回收的压力,从而提升整体应用的效率。

    解析JVM内存结构和6大区域

    JVM 栈是线程私有的,每个线程创建的同时都会创建 JVM 栈,JVM 栈中存放的为当前线程中局部基本类型的变量(java 中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果...

    Java中堆内存和栈内存详解

    #### 六、JVM中的堆和栈 Java虚拟机(JVM)是基于堆栈架构的。对于每一个新创建的线程,JVM都会为其分配一个独立的栈。线程栈用于存储线程的方法调用和局部变量。此外,JVM还维护了一个公共的堆空间,用于存储所有...

    推荐一些JVM原理,JVM调优,JVM内存模型,JAVA并发 电子书1

    内存管理涉及JVM内存区域,包括堆、栈、方法区、程序计数器和本地方法栈,每部分都有其特定的用途和管理方式。 2. JVM内存模型:JVM内存模型定义了内存中各个部分的关系,以及在多线程环境下如何共享和分配内存。...

    Java中堆和栈的区别详解

    Java中的堆和栈是两种重要的内存区域,它们在程序执行时扮演着不同的角色。了解它们的区别对于优化程序性能和处理内存相关问题是至关重要的。 首先,栈(Stack)主要用于存储基本类型的变量(如int、float)和对象...

    深入理解JVM-java虚拟机栈.docx

    栈的主要任务是为每个方法的执行提供一个栈帧(Stack Frame),栈帧存储了方法执行过程中的局部变量、操作数栈、动态连接和方法返回地址等关键信息。 栈帧是虚拟机栈的元素,它包含了以下几个重要组成部分: 1. ...

Global site tag (gtag.js) - Google Analytics