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方法体的变量作为返回值的原理 在读《代码大全》时看到,c语言在方法中不要返回局部变量的指针,想到了java中是可以返回任意类型,没有限制,这是怎么实现的。经过深入了解,c语言是可以返回局部变...
  • y909513070
  • y909513070
  • 2016年08月17日 17:49
  • 473

结构体内数据变量内存分配详解

原则1、数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字...
  • ZHM977863924
  • ZHM977863924
  • 2015年03月12日 09:31
  • 1522

对java中的成员变量内存分配的思考

一个由java编译的程序占用的内存分为以下几个部分 栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 堆区(heap)— 由程序员分配释...
  • a910626
  • a910626
  • 2015年05月03日 20:56
  • 2154

Java中的基本数据类型在内存所占字节

Java中的基本数据类型
  • creasylai19
  • creasylai19
  • 2015年10月14日 16:48
  • 636

结构体变量的内存分配

计算机中的内存存放变量时往往并不是按照一个
  • u010565695
  • u010565695
  • 2014年07月31日 21:21
  • 841

JAVA中堆栈和内存分配详解

在JAVA中,有六个不同的地方可以存储数据: 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而...
  • zhangjinru123
  • zhangjinru123
  • 2016年07月21日 16:42
  • 1363

浅谈Java内存分配策略

Java 内存分配策略 Java 程序运行时的内存分配策略有三种,分别是静态分配,栈式分配,和堆式分配,对应的,三种存储策略使用的内存空间主要分别是静态存储区(也称方法区)、栈区和堆区。 静态存...
  • shangzhongjia
  • shangzhongjia
  • 2016年09月11日 20:43
  • 664

Java虚拟机内存分配机制与启动参数说明

Java虚拟机内存分配机制与启动参数说明,配置堆区:-Xms 、-Xmx、-XX:newSize、-XX:MaxnewSize、-Xmn; 配置非堆区:-XX:PermSize、-XX:MaxPer...
  • chengyun19830206
  • chengyun19830206
  • 2016年11月20日 20:30
  • 327

Java类及对象创建内存分配过程

Java是面向对象的程序设计语言,而面向对象的程序都是由对象组成的,而类就是该对象的抽象描述。 那么什么类,什么又是对象了? 类:具体事物的属性和行为的抽象,概念上的定义 对象:...
  • strong_yu
  • strong_yu
  • 2016年06月10日 21:53
  • 2543

union中的内存分配

在union联合体中,所有的变量是公用一个内存的,即以最大内存变量作为整个union的内存空间进行申请。同时也服从内存对其的策略,即如果同时又一个char和一个int类型,则占据4个字节的内存空间,最...
  • u010585135
  • u010585135
  • 2015年04月21日 17:10
  • 1057
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中变量的内存分配
举报原因:
原因补充:

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