Java中变量的内存分配

原创 2016年05月30日 11:20:00

Java内存管理分为两个方面:内存分配 内存回收

这里的内存分配特指当创建一个java对象时JVM为该对象在堆内存中分配内存空间。

内存回收:当java对象失去引用,变成垃圾时,

          JVM的垃圾回收机制会(1)自动清理该对象(2)回收该对象所占用的内存。

虽然JVM内置了垃圾回收机制,但是java程序依然会存在内存泄漏,如果肆无忌惮创建对象,让系统分配内存,最后由垃圾回收机制回收。会带来:

(1)不断分配内存使得系统中可用内存减少,

(2)已经分配的内存的回收使得垃圾回收的负担加重。

一、实例变量和类变量

java中变量大体可以分为成员变量和局部变量

局部变量:(1)方法内部的局部变量:必须在方法内对其进行显示的初始化,初始化后生效,随方法结束而消亡。

        (2)代码块内部的局部变量:必须在代码块内对其进行显示的初始化,初始化后生效,随代码块结束而消亡。

        (3)形参:在方法签名中定义的局部变量,由方法的调用者为其赋值,随方法调用结束而消亡。

方法签名:由方法名称和一个参数列表(参数的顺序和类型)组成。

局部变量都被储存在方法的栈中。

成员变量:在类体内定义的变量。

(1)类变量(静态变量):

      1、在定义成员变量被static关键字所修饰时,那么该成员变量可称为静态变量或者类变量;

      2、可以向前引用;
     3变量属于类本身,类变量不依赖类的实例,类变量只在初始化时候在内存中被分配一次空间,无论类的实例被创建几次,都不再为类变量分配空间;
     4通过类的任意一个实例来访问类变量,底层都将将其转为通过类本身来访问类变量;

     5一旦类变量的值被改变,通过类或类的任意一个实例来访问类变量,得到的都将是被改变后的值;
     6将在类的初始化之前初始化。

(2)实例变量

      1、在定义成员变量时没有使用static关键字所修饰,那么该成员变量可称为实例变量或者非静态变量。

      2不能向前引用,如果向前引用,则称为非法向前引用,这是不允许的
      3变量属于类的实例对象,每创建一个对象便会对实例变量分配一次内存。

非静态代码块
    直接由 { } 包起来的代码,称为非静态代码块

静态代码块
    直接由 static { }包起来的代码,称为静态代码块

二、初始化

静态变量(类变量)、静态代码块
将在类被初始化创建实例对象之前被初始化,而且是按顺序从上到下依次被执行;
实例变量(非静态变量)、非静态代码块

初始化实际上是会被提取到类的构造器中被执行的,但是会比类构造器中的代码块优先执行到,其也是按在程序中的顺序从上到下依次被执行。

当一个类从被JVM装载开始,各种代码的执行顺序大致如下:
JVM装载->执行父类的相关代码->如果有静态初始化,先执行静态初始化,且只执行一次,以后即使有该类实例化,也不会再执行->如果有静态代码块,以与静态初始化一样的方式执行->如果有new语句带来的实例化,先为成员变量分配空间,并绑定参数列表,隐式或显式执行super(),即父类的构造方法,->执行非静态代码块-〉执行本类的构造函数-〉执行其他代码

版权声明:转载请标明出处

相关文章推荐

浅谈Java类加载的初始化阶段

类加载的初始化阶段对类变量赋予正确的值。主要有两种初始化方式,一种是通过类变量初始化语句;一种是静态初始化语句。如下述代码所示,前者是类变量初始化语句,后者是静态初始化语句。...

Java 类加载与初始化

目录 类加载器动态加载链接初始化示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用。 ...
  • oVoo_8
  • oVoo_8
  • 2015年10月09日 22:54
  • 1816

java实现的内存分配

  • 2013年11月20日 09:41
  • 7KB
  • 下载

java中内存分配

  • 2013年01月21日 16:32
  • 17KB
  • 下载

c中定义变量的内存分配顺序问题(极易错!!!)

对于c语言中大家都知道所有的变量都必须是先定义后使用的,但是但是,对于好多人而言,基本上没有人来注意自己的编译器和操作系统对这个东西是如何处理的, 1,如果全是一样的类型,比如全是int,编译器会如何...

Java内存分配原理

  • 2013年08月07日 10:26
  • 73KB
  • 下载

Java内存分配及垃圾回收文章汇总

  • 2010年11月11日 14:51
  • 379KB
  • 下载

C语言的变量的内存分配

今晚看了人家写的一个关于C语言内存分配的帖子,发现真是自己想找的,于是乎就收藏了。。。 先看一下两段代码: char* toStr() { char *s = "abcdefghijkl"; r...

JAVA虚拟机内存分配机制

  • 2013年03月07日 13:34
  • 33KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中变量的内存分配
举报原因:
原因补充:

(最多只允许输入30个字)