java语言

JAVA对象创造及内存布局介绍

时间:2024-10-09 21:50:14 java语言 我要投稿
  • 相关推荐

JAVA对象创造及内存布局介绍

  下面是百分网小编收集整理的关于JAVA对象创造及内存布局介绍d的相关内容,欢迎阅读!

  进程简略介绍:

  计算机对于内存的分配是以进程为单位的,每个进程在逻辑上是隔离的,每个进程都认为自己是这台电脑上的唯一程序,自己面对所有的内存空间,(如,你的电脑有2G内存,那么一个进程认为自己可以申请到2G的内存空间)这种技术叫做进程隔离技术,保证了系统不会因为一个进程的失败,导致系统崩溃。一个进程可以向操作系统申请内存,(操作系统是系统资源的调度者,进程要使用资源必须向操作系统打报告)进程申请到的内存一般以两种形式使用,一种是栈(stack)的形式,另一种是堆(heap)的形式。一个进程可以有多个栈,但只有一个堆。一个栈对应一个线程(thread),一个进程至少需要一个线程,即至少有一个栈。

  现在有一个student类,如下

  class student{

  String name;

  int age;

  void gotoSchool(){

  System.out.print("Let's go to school !");

  }

  void eat(){

  System.out.print("Let's go to eat !");

  }

  }

  现在来创建一个学生对象 Student stu = new Student();

  该语句实际是Student stu = new Student student()的缩写版,只是人们发现那样写很累,于是就把两个student合二为一了。

  下面分析一下该语句是如何执行的。 进程申请到内存空间,按照两种方式分配,有的内存分配给栈,有的分配给堆。栈空间比较狭小,有大小限制,堆空间可以很大,大到和内存的容量一致。编译器是从左到右进行编译的,程序也是如此执行。

  首先是碰到Student这样一个符号(token),系统会马上看下Student是什么东西,不久它发现那是一个类,然后把整个类的代码加载(class loading)到内存中。程序的代码必须从磁盘上加载到内存中才能执行,其实cpu只跟内存打交道。只是因为一断电什么都没了,所以后面才发明了硬盘,软盘等。在堆中有一个代码区(code area),用来存放Student类的代码。因为栈的空间狭小,而类代码可能很大,所以要把类代码加载到堆中。

  然后,遇到stu符号,即创建一个引用变量(或句柄),其数据类型是Student,因为Student类已经加载了,所以系统也知道了stu是什么东西。因为引用变量指向一个地址(说白了就是保存地址的变量而已,相当于C语言中的指针),所占空间不大,所以把其创建在栈中即可。

  接着从=右边开始,先读到new Student,即创建一个裸对象(naked object),或者说空白对象。因为类对象可能很大(如继承),所以应创建在堆中。这个裸对象主要保存自己的属性,代码区中的代码只是指导如何去做,而真正申请内存空间是在对象中。每个对象都有一个隐藏属性,叫做代码指针,指向对象所处的类,每个对象只要保存自己个性化的特征就行了,这样可以减少内存的开销,。方法可以共用,而属性不可以,才能体现出个性化。就像你不想和别人共用一个名字一样,但行为可以是一致的,可以一起上学、一起吃饭。每个对象还有另一个隐藏属性,this指针,保存了本对象在内存中的位置(俗称为指向自己)。

  ps:一个对象的大小只跟属性的多少有关,而和代码的数量无关。属性是主人,方法是仆人,为属性服务。一个裸对象通过初始化,使其内部的空白对象属性获得对应,体现出个性化,然后才能进入正式使用。就像人一样,有名字、年龄、要上学等,从婴儿到成人,其初 始化是一个漫长的过程。

  再接着遇到student ( ),这是一个构造方法(constructor),调用该方法为空白对象提供初始化服务。

  ps:构造方法地位重要,所以被特批能使用类名作为自己的名字,即与类同名。如果一个类没有显示书写一个构造方法,系统会自动为其添加一个,该方法是一个无参空实现的构造方法。构造方法不能有返回值,而不是没有返回值(没有即为void).

  最后把创建完的对象的地址通过=赋值给stu,以后对对象的的操作,只要通引用变量stu就可以了。我们可以把stu想像成是一根套住对象的绳子,绳子的数据类型决定了该绳子能套住什么样的对象。通过绳子对对象发号施令(就如我们用遥控器[引用]去操控电视机[对象]一样),对象收到命令后会访问其的代码指针,找到代码区中相应的代码并执行,人只能和栈打交道,而栈再和堆打交道。

  至此语句Student stu = new Student( )就执行完了,接下去就是使用stu工作了。

  ps:附件是对象创建内存布局图。

【JAVA对象创造及内存布局介绍】相关文章:

查看java对象所占的内存大小的方法12-04

Java的内存模型11-28

Java内存回收11-25

Java编程节省内存的方法12-16

如何解决java内存泄漏的问题03-03

java面向对象编程讲解04-02

Java编程节省内存的方法有哪些11-21

java序列化对象的技巧03-27

java对象持久化的使用技巧03-28