对java中的成员变量内存分配的思考
2015-05-03 20:56
239 查看
一个由java编译的程序在JVM中占用的内存:
JVM内存分四种:
栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源
堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收
静态区(datasegment)—存放成员变量,静态变量和字符串常量,不释放
代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域
J***A里没全局变量.变量按位置分为成员变量和局部变量。其实这个成员变量非常类似于c中的全局变量。
成员变量又分两种一种实例属性(非static修饰的)另外一种是类属性(static修饰的)。以static修饰的静态变量是在类加载的时候分配空间的,直到系统完全销毁这个类,而不以static修的的类属性是在这个类的实例创建的时候才开始存在。所以要看情况而定。
是先加载类,在类初始化前有个准备阶段,在这时候创建的类变量(static变量)并赋默认值,然后在类初始化的时候对类变量初始化。实例化一个类是先给实例变量(非static变量)分配内存空间,并初始化为默认值,然后再调用构造函数的。
静态成员变量 :可以用类名直接访问,也可以用类的实例化来访问.非静态成员变量:不可以直接使用类名访问, (但是可以用实例化来访问)
静态变量在以后的创建对象的时候不在初始化所以一般用静态来保存共享信息.
1、编译:Java源文件—>.class文件(字节码文件)【命令:javac】
2、执行:运行.class文件【命令:java】
编译的时候是不会分配空间的,只是将java代码编译成字节码。是在运行这段代码的时候才会分配。
使用命令: javac *.java
编译时,会将写的.java文件(高级语言),生成相应的字节码文件.class文件(二进制代码)
Java程序的执行
使用命令:java *
流程: 加载到 – 连接 —- 初始化 …
运行时,首先会由将相应的.class文件,加载到内存中,并验证.class文件的有效性,将相应类的Class加载到内存中,并对类中的静态变量进行初始化操作(初始化就是分配内存),然后就由主类开始执行。
操作系统对于加载到,连接,初始化都有详细的说明,等待继续研究《操作系统》~~~
感恩:
Java内存分配全面浅析:http://blog.csdn.net/yangyuankp/article/details/7651251
JVM内存分四种:
栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源
堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收
静态区(datasegment)—存放成员变量,静态变量和字符串常量,不释放
代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域
J***A里没全局变量.变量按位置分为成员变量和局部变量。其实这个成员变量非常类似于c中的全局变量。
成员变量又分两种一种实例属性(非static修饰的)另外一种是类属性(static修饰的)。以static修饰的静态变量是在类加载的时候分配空间的,直到系统完全销毁这个类,而不以static修的的类属性是在这个类的实例创建的时候才开始存在。所以要看情况而定。
是先加载类,在类初始化前有个准备阶段,在这时候创建的类变量(static变量)并赋默认值,然后在类初始化的时候对类变量初始化。实例化一个类是先给实例变量(非static变量)分配内存空间,并初始化为默认值,然后再调用构造函数的。
一、静态成员变量和非静态成员变量的区别
静态成员变量是所有对象共用的,只有一份,不会为每一个对象都分配一个不同的值。比如,如果最长寿命是一个静态成员变量,那么你-最长寿命 和 我-最长寿命 调用的时候用的是同一个内存上的值,所有对象的调用都是这个值。不过是非静态成员,那么这个值就不同。每个对象都有自己的值,比如名字、身高、等等静态成员变量 :可以用类名直接访问,也可以用类的实例化来访问.非静态成员变量:不可以直接使用类名访问, (但是可以用实例化来访问)
静态变量在以后的创建对象的时候不在初始化所以一般用静态来保存共享信息.
二、java程序是在编译的时候分配空间的吗,如果不是那程序在什么时候给变量分配内存空间?
一个Java类文件需经历:1、编译:Java源文件—>.class文件(字节码文件)【命令:javac】
2、执行:运行.class文件【命令:java】
编译的时候是不会分配空间的,只是将java代码编译成字节码。是在运行这段代码的时候才会分配。
三、java程序编译和运行都在做什么
Java程序的编译使用命令: javac *.java
编译时,会将写的.java文件(高级语言),生成相应的字节码文件.class文件(二进制代码)
Java程序的执行
使用命令:java *
流程: 加载到 – 连接 —- 初始化 …
运行时,首先会由将相应的.class文件,加载到内存中,并验证.class文件的有效性,将相应类的Class加载到内存中,并对类中的静态变量进行初始化操作(初始化就是分配内存),然后就由主类开始执行。
操作系统对于加载到,连接,初始化都有详细的说明,等待继续研究《操作系统》~~~
感恩:
Java内存分配全面浅析:http://blog.csdn.net/yangyuankp/article/details/7651251
相关文章推荐
- java中成员变量和局部变量在内存中的分配
- java面向对象之成员变量和局部变量 以及他们的内存分配
- java中变量在内存中的分配
- java+内存分配及变量存储位置的区别
- 深入理解C语言结构体成员变量内存分配
- 图解Java多态内存分配以及多态中成员方法的特点
- java+内存分配及变量存储位置的区别
- java+内存分配及变量存储位置的区别
- C++类对象成员变量与成员函数内存分配问题
- 深度思考Java成员变量的初始化
- Java static 变量、方法的什么时候分配内存
- C++类对象成员变量和成员函数内存分配的问题
- java+内存分配及变量存储位置的区别
- Java内存分配及变量存储位置实例讲解
- 图解Java多态内存分配以及多态中成员方法的特点
- C++成员变量与函数内存分配
- 结构体、类的成员变量、成员函数是如何分配内存的?
- 图解Java多态内存分配以及多态中成员方法的特点
- 深度思考Java成员变量的初始化
- Java的内存分配机制以及变量在内存中的分配(以String为例)