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

Java 把内存划分成两种:一种是栈内存,另一种是堆内存。在函数中定义的一些基本类型的变量和对 象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量 分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以 立即被另作它用。

堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来 管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取 值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程 序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称 。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和 对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对 象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用, 但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。

这也是 Java 比较占内存的原因,实际上,栈中的变量指向堆内存中的变量,这就是 Java 中的指针!

时间: 2024-11-08 22:24:11

Java中的堆内存与栈内存分配浅析的相关文章

Java中堆内存和栈内存详解

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存. 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存

java 堆内存 与栈内存

Java把内存分成两种,一种叫做栈内存,一种叫做堆内存 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中

Java 堆内存与栈内存详细介绍_java

 Java 中的堆和栈 Java把内存划分成两种:一种是栈内存,一种是堆内存. ​ 在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配.当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用. 堆内存用于存放由new创建的对象和数组.在堆中分配的内存,由java虚拟机自动垃圾回收器来管理.在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取

javascrpit-JS中堆内存和栈内存的区别

问题描述 JS中堆内存和栈内存的区别 JS中对象分为基本类型和引用类型,基本类型存放在栈内存,引用类型存放在堆内存.请问栈内存和堆内存的区别是什么,为什么这两种对象分别存储在不同的内存中? 解决方案 这很好理解,比如说这么个函数: function sum(i) { if (i == 1) return 1; return i + sum(i - 1); } 显然,这是一个递归函数,函数自己调用自己. 那么每个调用,都必须保存一个i的变量. 此时就要用堆栈.堆栈的栈顶始终保持着函数的局部变量.当

Android For JNI(四)——C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统

Android For JNI(四)--C的数组,指针长度,堆内存和栈内存,malloc,学生管理系统 好几天每写JNI了,现在任务也越来越重了,工作的强度有点高,还有好几个系列的博客要等着更新,几本书还嗷嗷待哺的等着我去看,github上的两个散漫的开源,基础入门的视频也在录制,还要学习新的知识, 都是一种挑战,不知道为何,最近懒散了,看来还得再加把劲,今天我们继续延伸一下C的一些小知识 一.数组 C的数组和JAVA也是类似的,我们写一段小程序 #include <stdio.h> #inc

求教java中的unsafe.allocateMemory() 会导致内存申请失败吗?

问题描述 求教java中的unsafe.allocateMemory() 会导致内存申请失败吗? 在jre 1.6.0_26中,unsafe.allocateMemory()函数的调用后, 出现 malloc.c 5147:malloc_consolidate: Assertionnextchunk->fd_nextsize->bk_nextsize == nextchunk failed. java程序崩溃. 请问这这个是什么情况? 是段错误,还是内存不足? 解决方案 这个方法就是申请内存的

c++-C++中的堆对象与栈对象

问题描述 C++中的堆对象与栈对象 使用现代的c++,本地存储对象比堆存储对象好:这是今天看cocos2d-x的时候,官方教程一直 强调的一句话...这是为什么啊 解决方案 主要还是因为栈可避免内存方面的管理 解决方案二: 堆栈用于存储局部变量,优点是,方便在函数返回的时候销毁,特别是函数调用存在递归关系,相当于一个变量名的存储需要很多份,堆栈很适合这样的存储. 堆用于存储大量的.全局的变量和数据,它相当于直接利用内存,释放和分配都需要程序员小心处理. 解决方案三: 栈:适用于存储局部变量,申请

详解Java的堆内存与栈内存的存储机制_java

堆与内存优化    今天测了一个项目的数据自动整理功能,对数据库中几万条记录及图片进行整理操作,运行接近到最后,爆出了java.lang.outOfMemoryError,java heap space方面的错误,以前写程序很少遇到这种内存上的错误,因为java有垃圾回收器机制,就一直没太关注.今天上网找了点资料,在此基础上做了个整理.  一.堆和栈     堆-用new建立,垃圾回收器负责回收          1.程序开始运行时,JVM从OS获取一些内存,部分是堆内存.堆内存通常在存储地址的

Java中的堆、栈和常量池

  1.寄存器 最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈 存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中.) 3. 堆 存放所有new出来的对象. 4. 静态域 存放静态成员(static定义的) 5. 常量池 存放字符串常量和基本类型常量(public static final). 6. 非RAM存储 硬盘等永久存储空间 这里我们主要关心栈,堆和常量池,对于栈和常量池中的