java之变量以及对象的存储位置区别

Java内存分配的时候一共涉及5个区域,分别是;寄存器、栈、堆、常量池、非RAM存储。

寄存器

寄存器是最快的存储区,位于处理器内部,由于寄存器的数量非常有限,所以寄存器都是按需分配,我们在程序中无法控制。

栈位于通用RAM(随机访问存储器)中,栈由编译器自动分配和释放,栈存放的是基本数据类型(基本数据类型包括:int、short、double、long、float、boolean、char、byte;注意没有String)以及对象的引用。栈的优势是存取速度比堆快,仅次于CPU中的寄存器。另外,栈还有一个很大的特点就是栈中的数据可以共享,比如定义两个int类型的变量:int a = 3; int b = 3;这里a和b是一个指向int型的引用,指向"3"这个字面值。编译器先处理int a =
3;这句语句的时候,先在栈中创建一个变量为a的引用,然后查找有没字面值为3的地址,如果没有就开辟出一个存储3的地址,然后将a指向这个3对应的地址。接着处理int b = 3;,也是先创建一个变量b的引用,由于栈中已经有字面量3了,于是就把b也指向3对应的这个地址,所以a和b都指向了一个地址。当我们执行 b = 4;的时候,首先还是去栈中查找有没字面量值为4对应的地址,如果没有就开辟个,然后将b指向这个新开辟的地址。如果已经有了就直接将b指向这个地址,此时a还是指向3,但b指向4了,而且他俩不再指向同一个地址了。实际上形参,局部变量都存储在栈中。

堆是一种通用的内存池,也位于RAM中,堆用于存储所有的java对象。

常量池

常量池用于存放常量

非RAM存储

非RAM存储用于存放持久化对象

下面来看个例子:

public class Student {
	/**
	 * @author 行者摩罗
	 * @博客链接 http://blog.csdn.net/xingzhemoluo
	 */
	private int id;
	private String name;
	private int age;
	//get,set方法省略
	public Student(int i,String n,int a) {
		this.id = i;
		this.name = n;
		this.age = a;
	}
}
public class Test {
	public void update (int x) {
		x = 100;
	}

	public static void main(String[] args) {
		int score = 99;
		Test test = new Test();
		test.update(score);
		Student student = new Student(1,"行者摩罗",23);
	}
}

在这段代码中,score是局部变量,i、n、a、x都是形参,形参也属于局部变量,id、name、age为成员变量。当从main方法开始运行的时候,

①int score = 99;                      score是局部变量,引用(score)和值(99)都存储在栈中。

②Test test = new  Test();      test是个引用,存放于栈中,new Test()创建出来的对象存在于堆中。

③test.update(score);             update()方法里的形参x是局部变量,引用和值都存在于栈中,当update方法执行完毕以后,x会自动从栈中消失。

④Student student = new Student(1,"行者摩罗",23);               student为引用,存放于栈中,new Student(1,"行者摩罗",23)创建出来的对象存在于堆中。其中i、n、a为形参,存在于栈中,name,id,age为成员变量,他们对应的值存储于堆中(在new Student()里面)。当Student构造方法执行完毕以后,i、n、a会自动从栈中消失。

⑤main方法执行完毕以后,score、test、student都会自动从栈中消失,new Test()以及new Student(1,"行者摩罗",23)则由垃圾回收期来回收。

参考资料:http://blog.csdn.net/rj042/article/details/6871030

http://blog.csdn.net/cuixianpeng/article/details/6892043

声明:

1.原创内容,转载请注明原文链接

2.摩罗不写博客,所有内容只是摩罗笔记,如有错误或者您有更好的意见,欢迎指正。

欢迎关注行者摩罗微信公众号(xingzhemoluo),共同交流编程经验,扫描下方二维码即可;

时间: 2024-12-24 17:53:53

java之变量以及对象的存储位置区别的相关文章

java中变量、对象的存储

内容转自网上看到的一篇博文,讲的很不错. 1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆.2. 栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器.但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性.另外,栈数据可以共 享,详见第3点.堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据.但缺点是,由于要 在运行时动态分配

C语言变量的类型和存储位置

1. C语言变量主要分为全局变量.静态全局变量.局部变量.静态局部变量和寄存器变量.其中静态变量用static关键字进行修饰.程序所占用的内存可以分为以下几个部分: (1)代码段-存放程序代码,只读的,不能修改. (2)全局区(静态区),又称为数据段.其中.data段存放的是已经初始化的全局变量和静态变量(静态全局变量和静态局部变量)..bss段存放的是未初始化的全局变量和静态变量(静态全局变量和静态局部变量).bss段会将未初始化的变量填充为0. (3) 堆: 是一种线性结构,类似链表实现,也

java成员变量与局部变量修饰符的区别

成员变量: 可以被 public,static ,protected,default,final修饰. 局部变量:包括方法里的和 代码块里的(静态和非静态) 可以被default, final修饰 参考: 百度搜索:代码块与成员变量 java中静态代码块中初始化静态成员变量 分享| 2015-12-31 22:18 ∮老男孩丶 | 浏览 56 次 悬赏:5 javastatic{ age = 2; }static int age = 4; 我把声明age的语句放到代码块后面,为什么没报错,执行代

JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配

Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”. 根据“Java中的变量与数据类型”中的介绍,“变量是在内存中分配的保留区域的名称.换句话说,它是一个内存位置的名称”,也就是说我们通过这个变量名字就可以找到一个指向这个变量所引用的数据的内存指针,根据变量的类型我们可以知道这个指针之后的几个字节里存储了这个变量所引用的数据. 所以,了解变量在方法区.栈内存.堆内存

JVM各种变量存储位置

Java中变量分为静态变量,实例变量,临时变量.他们在JVM中存储的位置如下:静态变量    位于方法区实例变量    作为对象的一部分,保存在堆中.临时变量    保存于栈中,栈随线程的创建而被分配. 附JVM结构图

java数据的5种存储位置(转)

任何语言所编写的程序,其中的各类型的数据都需要一个存储位置,java中书的存储位置分为以下5种: 1.寄存器 最快的存储区,位于处理器内部,但是数量及其有限.所以寄存器根据需求自动分配,无序人为控制. 2.栈内存 位于RAM中,通过堆栈指针可以从处理器中获得直接支持.堆栈指针向下移动,则分配新的内存:向上移动,则释放哪些内存.这种存储方式仅次于寄存器.(常用于存放对象引用和基本数据类型,而不用于存储对象) 3.堆 一种通用的内存池,也位于RAM中.其中存放的数据由JVM自动进行管理. 堆相对于栈

java线程 在其他对象上同步、线程本地存储ThreadLocal:thinking in java4 21.3.6

package org.rui.thread.concurrency; /** * 在其他对象上同步 * synchronized 块必须给定一个在其上进行同步的对象,并且最合理的方式是,使用其方法正在被调用的当前对象 * :synchronized(this), 在 这种方式中,如果获得了synchronized块上的锁, * 那么该对象其他的synchronized方法和临界区就不能被调用了. * 因此,如果在this上同步,临界区的效果就会直接缩小在同步的范围内. * * 有时必须在另一个

Oracle03——游标、异常、存储过程、存储函数、触发器和Java代码访问Oracle对象

作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7476717.html 1.游标(光标)Cursor 在写java程序中有集合的概念,那么在pl/sql中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据. 语法: CURSOR  游标名  [ (参数名  数据类型,参数名 数据类型,...)]  IS  SELECT   语句; 例如:cursor c1 is select ename from emp; 游标

Java学习笔记一:对象与存储

1.用引用来操作对象 Java是面向对象的编程语言,一切都能看作是对象,通过引用来完成对对象的操作. // String 是对象,而s对指向这个String对象的引用 String s; 注意:我们是通过对象的引用来操纵对象数据的,如果对象没有关联数据(如没有被初始化),则会出现空引用,报空指针异常:java.lang.NullPointerException 2.数据存储 (1)寄存器:位于CPU内部,是处理最快的区域,但是存储空间有限.Java不能通过程序直接控制. (2)堆栈:位于RAM(