.java中的堆栈:
如 Student student = new Student();
在这里对象就是new 出来的student ,这个对象被存放在堆内存里面,而student是这个对象的引用如下
一般java程序运行时会涉及到如下几个存储区域:
程序计数器:
可以看做是当前所执行字节码的行号指示器。通常是改变计数器字节码的值来抉择下一步索要执行的代码,程序员不直接控制。
寄存器:
在程序中我们无法直接控制,由编译器管理。
栈区:
1,每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义的对象的引用以及局部变量。
2,每个栈中的数据都是私有的,其他栈不能访问。
3,当局部数据用完时,所占内存空间会自动释放。
JVM栈一个最大的用处是为执行
java方法服务的,每一个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表,操作栈,动态链接,方法出口等信息。
每一个方法从调用直至执行完成的过程都对应着一个栈帧在虚拟机中从入栈到出栈的过程。
栈的优势在于存取速度比较快,仅次于寄存器。缺点是存储在栈中的数据的大小和生存周期是确定的,缺乏灵活性。
堆区:
1,通过new建立的数组和对象都存储在堆中。
2,每一个对象都有相应的内存地址值。
3,对象中的变量都有默认初始化值。
4,数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。
另外要明确的是每一个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。在java堆中还必须包含能查找到对象类型数据(如对象类型,父类,实现的接口,方法等)的地址信息,
这些类型数据(优先于对象存在)都存储在方法区中。
堆的优势在于可以动态地分配内存的大小,生存周期也不必事先告诉编译器,因为它是运行时动态地分配内存的,并用垃圾回收机制回收那些不用的数据。缺点是存取速度比较慢。
一般是通过对象的引用来访问对象。待补充和修改