详见: http://www.iteye.com/problems/34966
heap(堆) :
JVM 的内存数据区. 用来保存对象的实例.
在堆中分配一定的内存来保存对象实例, 实际上是保存对象实例的属性值、属性的类型和对象本身的类型标记等,
并不保存对象的方法(方法是指令, 保存在 栈 中).
对象实例在堆中分配好以后, 会在 栈 中保存一个 4 字节的堆内存地址
用来定位该对象实例在堆中的位置, 便于找到该对象实例.
stack(栈) :
JVM 的内存指令区: Java 基本数据类型, Java 指令代码, 常量都保存在 栈 中.
“ 栈” 的内存管理不存在内存回收问题(而 “堆” 则是随机分配内存, 存在内存分配和回收的问题 )
GC 会不定期扫描堆, 根据“栈”中保存的 4 字节对象地址扫描“堆”, 定位“堆”中这些对象,
进行一些优化(例如合并空闲内存块什么的), 并且假设堆中没有扫描到的区域都是空闲的, 统统垃圾收集.
=========================分割线=============================
JVM中的堆和栈
JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。
我们知道,某个线程正在执行的方法称为此线程的当前方法.我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的 Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据.这个帧在这里和编译原理中的活动纪录的概念是差不多的.
从Java的这种分配机制来看,堆栈又可以这样理解:
堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域,该区域具有先进后出的特性。每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享.跟C/C++不同,Java中分配堆内存是自动初始化的。
Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,
也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。
分享到:
相关推荐
### 队列、堆、栈与堆栈的区别 #### 队列 队列是一种遵循先进先出(First In First Out, FIFO)原则的数据结构。这意味着最先加入队列的元素将会是最先被移除的元素。队列常用于处理需要按照顺序执行的任务集合,...
"Java 中堆(heap)和堆栈(stack)的区别" Java 中堆(heap)和堆栈(stack)是两个不同的内存区域,分别用于存储不同的数据类型和对象。堆栈(stack)是 Java 中的一种内存区域,用于存储基本类型的变量和对象的...
局部变量、全局变量、堆、堆栈、静态和全局变量都是编程中常见的概念,它们在内存管理、作用域和生命周期等方面有着不同的特点。 首先,局部变量是在函数内部声明的变量,它们在函数执行时分配空间,在函数结束时被...
理解堆和栈的区别是编写高效、无内存泄漏代码的关键。 首先,我们来看看堆和栈的基本概念: 栈(Stack)是程序运行时由编译器自动管理的内存区域,主要用于存放函数的参数值、局部变量等。栈的操作遵循“后进先出...
本文将重点讨论C#中的两种主要内存区域:堆栈和托管堆,并探讨它们之间的区别以及各自的应用场景。 #### 二、堆栈 堆栈(Stack)是一种线性数据结构,其遵循先进后出(First In Last Out, FILO)的原则。在C#中,...
### 栈和堆栈的区别详解 #### 一、程序的内存分配 在深入探讨栈和堆的区别之前,我们首先需要了解程序在运行时是如何管理内存的。程序在运行时主要可以划分为以下几部分: 1. **栈区(Stack)**: - 分配与释放...
【摄像头元件】是现代智能手机摄像头的关键组成部分,主要分为两种类型:背照式传感器和堆栈式传感器。这两种传感器的设计差异显著影响了它们的性能和成像质量。 **背照式传感器(Backside Illumination Sensor)**...
标题和描述中的核心知识点主要集中在计算机科学领域中的数据存储机制,特别是栈(stack)和堆(heap)的区别和联系。为了深入理解这些概念,我们不仅需要掌握它们的基本定义,还要了解它们在实际编程中的应用以及与其他...
### 堆和栈的区别详解 #### 一、预备知识 — 程序的内存分配 在探讨堆和栈的区别之前,我们先了解一个由 C/C++ 编译的程序在运行时占用的内存是如何划分的。这有助于我们更好地理解这两种数据结构的特点以及它们的...
### 进程线程及堆栈关系的总结 #### 一、进程与线程的概念及其关系 **进程**是具有一定独立功能的程序在一个特定数据集合上的运行活动,是系统进行资源分配和调度的一个独立单位。进程是操作系统进行管理和调度的...
### Java堆栈的区别详解 #### 一、预备知识—程序的内存分配 程序在运行时,根据不同的数据类型和用途,会被分配到不同的内存区域。这些区域包括: 1. **栈区(Stack)**:这部分内存由编译器自动管理,主要用于...
堆栈常用于函数调用(调用栈)、表达式求值(逆波兰表示法)和内存管理(内存堆)。队列则广泛应用于任务调度、打印机队列、多线程同步(信号量)等场景。 堆栈和队列的操作复杂度分析如下: - 堆栈:push和pop操作...
堆和栈的区别(C/C++) 在 C/C++ 编程中,堆和栈是两个基本的内存分配机制。理解堆和栈的区别是非常重要的,因为它们对程序的性能和可靠性产生了很大的影响。 一、内存分配 在 C/C++ 中,程序占用的内存分为五个...
堆和栈的主要区别在于: 1. 分配方式:栈由编译器自动分配和释放,而堆需要程序员手动分配和释放。 2. 内存大小:栈的大小有限,通常较小;堆的大小取决于可用的虚拟内存,相对较大。 3. 分配效率:栈的分配速度较...
内存中堆和栈的区别 内存中堆和栈是两个不同的概念,都是用来存放数据的内存区域,但它们有所区别。 内存分配方面 堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收。堆的分配方式类似于链表...
堆和栈的区别 堆和栈是计算机内存管理中两个重要的概念,它们都是程序运行时的内存分配方式,但是它们之间有着明显的区别。 1. 预备知识—程序的内存分配 程序的内存分配可以分为五个部分:栈区、堆区、全局区、...
堆栈以及堆和栈的区别 堆栈是一种"后进先出"的主存区域,位于堆栈段中,使用SS段寄存器记录其段地址。它只有一个出入口,即当前栈顶,栈顶是地址较小的一端(低端),它用堆栈指针寄存器SP指定。堆栈有两种以字为...
Thread Dump 是非常有用 Java应用问题的工具。每一个 Java 虚拟机 都有及时生成所有线程在某...照,及JVM 中所有 Java线程的堆栈跟踪信息,堆栈信息一般包含完整的类名 及所执行的方法,如果可能的话还有源代码的行数。
"C++中堆和栈的区别" 堆栈是一个不容忽视的概念,在计算机领域中,我们编写的C语言程序基本上都要用到。但对于很多的初学者来说,堆栈是一个很模糊的概念。实际上,堆栈是两种数据结构:堆和栈。 数据结构上的堆和...
### 堆栈内存区别详解 在计算机编程与运行环境中,堆栈(Heap vs Stack)是两种关键的数据存储区域,它们各自拥有独特的属性与管理方式,对于程序的性能与资源管理有着深远的影响。本文将深入解析堆栈的区别,探讨...