`

java内存相关及程序初始化顺序

    博客分类:
  • j2se
阅读更多

1、heap和stack的区别

什么时候使用heap和stack不取决于变量类型,而是取决于要变量的生存空间(内存生存期??)。例如:全局变量定义在heap中,动态局部变量定义在stack中。Heap的使用代价要比stack高,而且要慢。

Heap速度慢的原因有:

分配操作:特别是空闲列表没有块时;

释放操作:释放内存时的收集操作;

堆竞争:多线程时;

总之,heap速度慢是因为频繁的分配和重分配。

stack的空间大小有限定,vc的缺省是2M。栈不够用的情况一般是程序中分配了大量数组和递归函数层次太深。有一点必须知道,当一个函数调用完返回后它会释放该函数中所有的栈空间。栈是由编译器自动管理的,不用用户操心。

heap是动态分配内存的,并且你可以分配使用很大的内存。但是用不好会产生内存泄漏。并且频繁地malloc和free会产生内存碎片(有点类似磁盘碎片),因为c分配动态内存时是寻找匹配的内存的。而用栈则不会产生碎片。

heap:堆,在程序中,使用堆来动态的分配和释放对象,也就是用户new出来的内存,必须用delete释放。当new了对象但没有释放时,就会造成内存泄漏。Java的垃圾回收机解决了这个问题,它会帮你释放这部分内存。

下列情况下调用堆操作:事先不知道程序所需对象的数量和大小;对象太大而不适合堆栈分配程序。另外,全局变量、静态变量都是创建在heap上的。注:java这中,没有全局变量,只有静态变量。

stack:栈,其上内容是编系统分配给进程的,只要进程结束就会自动回收。函数体内定义的变量会保存在stack中。因此在GC(没有指针的语言)中,全部分配在heap中,就没有stack这样的说法了。栈是先入后出的,一般是由高地址向低地址生长。
例1:

int a = 0; 全局初始化区

char *p1; 全局未初始化区

main()

{

 

int b; 栈

char s[] = “abc”;栈

char *p2; 栈

char *p3 = “123456″; 123456在常量区,p3在栈上。

static int c =0; 全局(静态)初始化区

 

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

分配得来得10和20字节的区域就在堆区。

strcpy(p1, “123456″); 123456放在常量区,编译器可能会将它与p3所指向的”123456″优化成一块。

}

例2:
char s1[] = “aaaaaaaaaaaaaaa”;
char *s2 = “bbbbbbbbbbbbbbbbb”;
aaaaaaaaaaa是在运行时刻符值的,而bbbbbbbbbbb是在编译时就确定的
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
在C++中,指针长度为四字节,并且都是变量或者参数形式存在的,所以都存贮
在栈中;而指针所指向的对象是new在堆中的。
2、java中的static
从某种程度上可以说java中的static函数和变量类似于C语言中的全局函数和全局变量。

1、static变量

整个程序中,只有一份,即只分配一块存储空间,而且所有此类的方法都可以操作修改该空间。Static变量或者static程序段在第一次装载时就进行初始化,涉及继承时,先初始化父类的static变量,然后是子类的static变量。

2、static方法

不需要创建对象就可使用,因此静态方法常用来为应用程序提供一些使用的方法。静态方法的调用方式为“类名.方法名”。

3、static类

通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为static的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。

3、变量的初始化顺序

装载时初始化static变量及static程序段内的变量:先父类,后子类;

装载完毕,初始化main()内的变量―>创建对象,先初始化此类的变量,再调用构造函数:先父类构造函数,再子类构造函数。

 

 

 

分享到:
评论

相关推荐

    Java语言程序设计

    2.2.1 类的声明 2.2.2 对象的声明与引用 2.2.3 数据成员 2.2.4 方法成员 2.2.5 类的组织——包的概念 2.2.6 类的访问控制 2.2.7 类成员的访问控制 2.3 对象初始化和回收 2.3.1 构造方法 2.3.2 内存回收技术...

    java源码包---java 源码 大量 实例

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    java源码包4

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    java源码包3

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    java源码包2

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目源代码

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    Java开发技术大全(500个源代码).

    errorInit.java 演示变量初始化错误的程序 integerExample.java 演示各种整型变量的使用 isPrime.java 判断素数 leapYearByIf.java 用if语句判断闰年 leapYearByLogical.java 用逻辑表达式判断闰年 lowToUpper...

    java面试题静态加载顺序构造方法

    Java中的继承与静态static等的执行先后顺序的面试题 java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。...3、类初始化时,先初始化类的属性成员,在执行构造方法。

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

    疯狂JAVA讲义

    5.3.3 局部变量的初始化和内存中的运行机制 130 5.3.4 变量的使用规则 130 5.4 隐藏和封装 132 5.4.1 理解封装 132 5.4.2 使用访问控制符 132 5.4.3 package和import 135 5.4.4 Java的常用包 140 5.5 深入...

    游戏画面就弹出内存不能为read修复工具

    解决方法:Win XP的“预读取”技术这种最佳化技术也被用到了应用程序上,系统对每一个应用程序的前几次启动情况进行分析,然后新增一个描述套用需求的虚拟“内存映像”,并把这些信息储存到WindowsPrefetch文件夹。...

    JAVA基础课程讲义

    静态初始化块(经常用来初始化类,加载类信息时执行!) 67 package 68 JDK中的主要包 68 import 68 eclipse的使用 69 继承(extend, inheritance) 70 为什么需要继承?继承的作用? 70 继承介绍 70 如何实现继承? ...

    Java并发编程实战

    第1章 简介 1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 ...第16章 Java内存模型 附录A 并发性标注 参考文献

    JAVA复习资料

    12、在Java中有一种叫作__构造方法__的特殊方法,我们在程序中用它来对类的对象成员进行初始化。 13、面向对象技术具有_封装性___、_继承性___、_抽象性___、多态性等特性。 14、Java中所有类都是类 _Object___...

    Java的六大问题你都懂了吗

     本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。  1. 类的属性,或者叫值域  2. 方法里的局部变量  3. 方法的参数 对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始...

    Java优化编程(第2版)

    Java优化编程(第2版)通过丰富、完整、富有代表性的实例,展示了如何提升Java应用性能,并且给出了优化前与优化后的Java应用程序的性能差别,以实际的实例与数字告诉你,为什么不可以这么做,应该怎么做,深入分析...

    高级java开发并发问题

    2.在内存 M 上初始化该对象 3.将内存 M 的地址赋值给引用变量 obj 创建线程的过程如下: 1.JVM为一个线程栈分配内存,该栈为每个线程方法调用保存一个栈帧 2.每一栈帧由一个局部变量数组、返回值、操作数堆栈和常量...

Global site tag (gtag.js) - Google Analytics