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中变量内存分配机制

原文地址:http://www.51testing.com/html/12/n-830112.html -------------------------------------------...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

变量内存的分配

预备知识—程序的内存分配  一个由C/C++编译的程序占用的内存分为以下几个部分  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的...

JAVA变量及内存分配

JAVA变量的要素包括便变量名、类型、作用域。本质上讲,变量实际上是内存中的一块区域,使用变量名来访问这块区域。每个变量使用前必须要先声明,然后赋值才可以使用。 根据变量的声明位置,可以分成 ①局部变...

变量内存分配

预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的...

变量内存分配

一个程序在运行时内存会被划分成几部分:代码区、数据区、堆区和栈区。     生成的目标代码的大小在编译时刻就已经固定下来了,因此编译器可以将可执行目标代码放在一个静态确定的代码区。这个区通常位于存储...

变量内存分配

预备知识—程序的内存分配  一个由C/C++编译的程序占用的内存分为以下几个部分  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的...

Java中变量的内存分析

一. 类的定义     1.成员变量: 成员变量可以使用Java语言中任何一种数据类型(包括基本类型和引用类型);在定义成员变量时可以对其初始化,如果不初始化,java会使用默认的值对其初始化(引...

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

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

变量的内存分配与printf()函数

首先来看下面一个简单的代码,程序和生活一眼个,其实里面很多都不是我们想象的那样执行的,的知道它里面的工作方式: #include int main() { char c1; char c2; ...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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