实例化,掌握栈与堆内存的关系(转)

JAVA中到底有多少内存区域呢?

1)栈内存:可以保存对象的名称(保存,访问的堆内存地址)。

2)堆内存:保存每个对象的全局属性。

3)全局数据区:保存static类型的属性。

4)全局代码区:保存所有方法的定义。

1.声明对象,Person per,栈内存中声明,与数组一样,数组名称保存在栈内存中,只开辟栈内存的对象是无法使用的,必须有其堆内存的引用才能使用。

2,实例化对象,new Person();在堆中开辟内存空间,所有内容都是默认的。

3,String:是一个字符串,首字符是大写的,本身是一个类,就是引用数据类型,默认值是null;

1.对象保持在栈内存中,属性保存在堆内存中,在程序中所有的方法是保存在全局代码区中,此区是所有对象共享的。

2.在使用对象的时候,对象必须实例化之后才能使用(实例化对象,并不单单指通过new关键字实现的,只有有堆内存的空间指向,则表示实例化成功)

3,在引用操作的时候,如果一个对象没有堆内存的引用(也就是实例化),而调用属性或方法,就会出现空指向异常。

3,对象共用一个堆内存空间:

Person p1=new Person();实例化p1对象

Person p2=p1;把p1的堆内存空间使用权给p2.

此时,设置p2对象的内容,相当于设置p1对象的内容,因为他们是共用一个堆空间。

如,p2.age=30,等价于p1.age=30;

4,垃圾回收机制

Person p1=new Person();

Person p2=new Person();

p1.name="小明";

p1.age=30;

p2.name="小红";

p2.age=23;

p2=p1;此时把p1的堆内存使用权给p2,

因为p2的堆内存指向改变了,这时候p2所指向的内存必须断开,这段内存也就成为了垃圾内存。

时间: 2024-08-03 16:00:27

实例化,掌握栈与堆内存的关系(转)的相关文章

实例化,掌握栈与堆内存的关系

JAVA中到底有多少内存区域呢? 1)栈内存:可以保存对象的名称(保存,访问的堆内存地址). 2)堆内存:保存每个对象的全局属性. 3)全局数据区:保存static类型的属性. 4)全局代码区:保存所有方法的定义. 1.声明对象,Person per,栈内存中声明,与数组一样,数组名称保存在栈内存中,只开辟栈内存的对象是无法使用的,必须有其堆内存的引用才能使用. 2,实例化对象,new Person();在堆中开辟内存空间,所有内容都是默认的. 3,String:是一个字符串,首字符是大写的,本

JavaScript栈和堆内存,作用域

1.栈 stack"和"堆 heap": 简单的来讲,stack上分配的内存系统自动释放,heap上分配的内存,系统不释放,哪怕程序退出,那一块内存还是在那里.stack一般是静态分配内存,heap上一般是动态分配内存. 2.基本类型和引用类型: 基本类型:存放在栈内存中的简单数据段.数据大小确定,内存空间大小可以分配. 引用类型:存放在堆内存中的对象,变量中实际保存的是一个指针,这个指针指向另一个位置.每个空间大小不一样,要根据情况开进行特定的分配. 详见<Javas

【转】数据结构中栈和堆---内存分配中栈和堆

一.数据结构的栈和堆 首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈.堆和栈都是一种数据项按序排列的数据结构. 1)栈就像装数据的桶或箱子  我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取.这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体). 2)堆像一棵倒过来的树 而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值.通常我们

栈、堆内存到底是如何申请的,方法是如何入栈出栈的——内存结构理解学习

Lee出品,转载请注明出处http://blog.csdn.net/hnulwt/article/details/42934365 对于软件开发者而言,理解和熟悉计算机内存知识是很基础的.今天我就来翻翻旧账,回顾看看有哪些点遗漏了,在此共同学习. 提起内存,我们常常想到三个区域: 1,静态区,静态变量 static variables / constant  ,常量,静态变量就存储在静态区域,这个区域比较简单,只需要知道怎么通过地址访问他就行了. 2,堆,也叫堆栈(这里要注意堆栈 和 栈 是不同

JAVA内存管理之堆内存和栈内存

我们常常做的是将Java内存区域简单的划分为两种:堆内存和栈内存.这种划分比较粗粒度,这种划分是着眼于我们最关注的.与对象内存分配密切相关的两类内存域.其中栈内存指的是虚拟机栈,堆内存指的是java堆. 1.栈内存,即虚拟机栈.每个方法被执行的时候都会同时创建一个栈帧,用来存储局部变量,操作栈,动态链接,方法出口等信息.局部变量包括各种基本类型的变量和对象的引用变量都是在方法的栈内存中分配.其中,64位长度的long和double类型的数据占用2个局部变量的空间,其他数据类型只占用1个.局部变量

堆内存还是栈内存?

<剑指Offer>里面有一道题目,"把一字符数组中的空格用字符串"%20"代替",看了书上的思路,然后写出来的程序输入的空格太多时,会出现错误"memory clobbered before allocated block".其原因是没搞清楚栈内存,堆内存的分配和区别.错误代码如下: #include <stdio.h> #include <malloc.h> #include <string.h>

设计一个只能在堆内存上实例化的类和一个只能在栈内存上实例化的类

只能在堆内存上实例化的类:将析构函数定义为private,在栈上不能自动调用析构函数,只能手动调用.也可以将构造函数定义为private,但这样需要手动写一个函数实现对象的构造. 只能在栈内存上实例化的类:将函数operator new和operator delete定义为private,这样使用new操作符创建对象时候,无法调用operator new,delete销毁对象也无法调用operator delete. #include <iostream> using namespace st

JAVA基础-栈与堆,static、final修饰符、内部类和Java内存分配

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

java堆内存和栈内存的处理

前段时间学习二叉树在处理删除操作的时候遇到一个头疼的问题:删除节点的时候明明已经置null了可树上该节点依旧存在,还必须执行node.father.left = null;才可以删除node节点,寻找了一下原因发现还是因为对java内存管理理解不够深入. 代码如下: @Test public void testNode() { Node node1 = new Node("node1"); Node node2 = new Node("node2"); node2.