博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析Java中的内存机制
阅读量:6264 次
发布时间:2019-06-22

本文共 1764 字,大约阅读时间需要 5 分钟。

一.对象和引用

要了解Java中对象在内存中的位置,首先要分清楚两个概念,对象和引用。在Java中,使用

new Object()
来产生一个新的对象,这时,对象存在于堆内存中。而使用
Object object

仅仅产生了一个Object引用,引用存在于栈内存中,但此时仅仅声明了一个引用,并没有指向任何Object对象。可能到这里你还是不太理解对象和引用的概念。做一个很形象比喻,引用就像是一台电视机的遥控器,而对象则是电视机。引用是一个可以操控对象的入口,而对象则是操作的实体。它们两个在内存位置如下图:

如果仅仅只是声明了一个引用,则JVM仅仅在类的栈区内存分配了一个空间,用来保存引用的值。这里可以将引用看做C语言中的指针,或者可以看做C++中的句柄。这时就出现了第二个问题,如何将对象赋值给引用?Java给了我们两种方法:

引用赋值的两种方法:

1.先声明引用,再进行赋值
Object object;object = new Object();
2.直接在声明引用时赋值
Object object = new Object();
这时,引用就和对象连接在一起了,我们就可以通过引用来对对象进行操作了。他们现在在内存中如下:
需要注意的时,Java中一个对象可以被多个引用指向,但是一个引用只能指向一个对象。

二.继承中的引用和对象

我们先来看一段代码
 

public class test {	public static void main(String[] args) {		// TODO Auto-generated method stub		father fa = new son();
fa.sub();//调用父类sub方法
//fa.Test();  //无法调用
fa.test();  //调用子类test方法		son b = (son)fa;
//b.test();
 
b.Test();       //调用子类Test方法	}}class father{
void sub(){
System.out.println("father.sub()");
}	void test(){		System.out.println("father.test()");	}}class son extends father{	void Test(){		System.out.println("son.Test()");	}
 
void test(){
 
System.out.println("son.test()");
 
}}
 
 

我们可以看到一个父类引用可以指向子类对象,但是只能调用父类声明过的方法。这具体是为什么呢?这时候我们就可以想之前那个比喻了,引用仅仅是一个遥控器,之前在父类已经定义了这个遥控器上的所有按钮(方法),你虽然能让它控制子类电视机,但是它本身并没有子类的特有功能的按钮,它肯定不能用啊。这样下边就容易理解了,再将这个引用再重新进行赋值给一个子类引用时,遥控器又重新拥有了这些按钮,当然可以控制这些功能了。由此,我们可以明白,引用可以和对象分离,但是需要注意的是,父类引用可以指向任何一个子类对象,但是子类引用却不可以指向父类对象。

三.类中其他成员的内存分配

  用static修饰符修饰的数据成员是不属于任何一个类的具体对象,而是属于类的静态数据成员。它被保存在类的内存区的公共存储单元中,而不是保存在某个对象的内存区中。因此,一个类的任何对象访问它时,存取到的都是相同的数值。访问方式为通过类名加点操作符来访问,也可通过对象引用来访问。
 常量被分配在栈区内存,当对象销毁时,内存销毁。

四.内存的回收与释放

Java中的内存回收机制完全由Java虚拟机来控制,当一个对象完全没有引用时,这个对象成为垃圾。需要注意,Java中垃圾并不一定会被回收,什么时候回收还需要看Java虚拟机的处理。但是Java虚拟机往往在资源不够的情况下才进行垃圾回收。为了使其及时回收垃圾,我们可以用System.gc()方法来提醒虚拟机进行垃圾回收。但是仅仅是提醒,Java虚拟机并不一定会执行回收机制。

转载于:https://www.cnblogs.com/Toring/p/6628278.html

你可能感兴趣的文章
JDK各个版本的新特性jdk1.5-jdk8
查看>>
ZOJ 3529 A Game Between Alice and Bob(博弈论-sg函数)
查看>>
zoj 2822 Sum of Different Primes (01背包)
查看>>
Directx11学习笔记【三】 第一个D3D11程序
查看>>
UVa 11292 - Dragon of Loowater
查看>>
【Android】3.15 短串分享功能
查看>>
火星人乘坐核动力飞船回故乡
查看>>
怎么限制Google自己主动调整字体大小
查看>>
iOS Runtime原理及使用
查看>>
asp.net将内容导出到Excel,Table表格数据(html)导出EXCEL
查看>>
mysql中间件研究(Atlas,cobar,TDDL)
查看>>
Sublime text3 插件LiveReload 实现实时预览
查看>>
JS实现电子时钟
查看>>
嵌入式 fork与vfork的区别
查看>>
mb_strlen(,utf-8);可以除去中文字符,统一返回是几个字符
查看>>
BP神经网络模型与学习算法
查看>>
Jsoup代码解读之六-防御XSS攻击
查看>>
android: 后台执行的定时任务
查看>>
大数据时代下的用户洞察:用户画像建立(ppt版)
查看>>
qnx:从API开始理解QNX -- 消息传递
查看>>