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

  一个由java编译的程序在JVM中占用的内存:

JVM内存分四种:

  1. 栈区(stacksegment)—由编译器自动分配释放,存放函数的参数值,局部变量的值等,具体方法执行结束之后,系统自动释放JVM内存资源

  2. 堆区(heapsegment)—一般由程序员分配释放,存放由new创建的对象和数组,jvm不定时查看这个对象,如果没有引用指向这个对象就回收

  3. 静态区(datasegment)—存放成员变量,静态变量和字符串常量,不释放

  4. 代码区(codesegment)—存放程序中方法的二进制代码,而且是多个对象共享一个代码空间区域

  JAVA里没全局变量.变量按位置分为成员变量和局部变量。其实这个成员变量非常类似于c中的全局变量。

  成员变量又分两种一种实例属性(非static修饰的)另外一种是类属性(static修饰的)。以static修饰的静态变量是在类加载的时候分配空间的,直到系统完全销毁这个类,而不以static修的的类属性是在这个类的实例创建的时候才开始存在。所以要看情况而定。

  是先加载类,在类初始化前有个准备阶段,在这时候创建的类变量(static变量)并赋默认值,然后在类初始化的时候对类变量初始化。实例化一个类是先给实例变量(非static变量)分配内存空间,并初始化为默认值,然后再调用构造函数的。

一、静态成员变量和非静态成员变量的区别

  1. 静态成员变量是所有对象共用的,只有一份,不会为每一个对象都分配一个不同的值。比如,如果最长寿命是一个静态成员变量,那么你-最长寿命 和 我-最长寿命 调用的时候用的是同一个内存上的值,所有对象的调用都是这个值。不过是非静态成员,那么这个值就不同。每个对象都有自己的值,比如名字、身高、等等

  2. 静态成员变量 :可以用类名直接访问,也可以用类的实例化来访问.非静态成员变量:不可以直接使用类名访问, (但是可以用实例化来访问)

  3. 静态变量在以后的创建对象的时候不在初始化所以一般用静态来保存共享信息.

二、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

发布了353 篇原创文章 · 获赞 291 · 访问量 99万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览