Bruce Eckel在《ThinKing in Java》中提到: java的存储可以分为六块。
第一:寄存器,位于处理器内部。但是程序员不能控制其内存分配,是由编译器根据需求来决定是否存储在寄存器中。
第二:RAM,具体又分为三种:
a:堆栈
存储java编译器能够确定大小以及生命周期的数据,比如对象引用以及基本类型变量。它主要是通过“堆栈指针”
来实现的,“堆栈指针”下移,则分配内存,“堆栈指针”上移,则释放内存。
b:堆
存储对象。
c:静态存储
来存储static关键字修饰的某个对象的特定元素。java对象是不可能存放在静态存储空间里的。
第三:常量存储
常量值通常直接存储在程序代码内部。但在嵌入式中可以存储在ROM中。
第四:非RAM存储
完全存活于程序外部的,比如流对象和持久化对象。
java虚拟机加载class文件时,分配存储空间的顺序:
首先会调用static成员和static块,仅初始化一次;然后是基本数据成员,然后是构造函数。(先父类,后子类)
代码示例:
/**
*
*/
package com.tjb.foundation.test;
/**
* @author tjbworkshop
*
*/
class LoadSequenceA{
static int testIntA = 5;
static{
System.out.println(testIntA);
System.out.println("1");
}
public LoadSequenceA(){
System.out.println("a");
}
}
class LoadSequenceB extends LoadSequenceA{
int testIntB = 6;
static{
System.out.println("2");
}
public LoadSequenceB(){
System.out.println(testIntB);
System.out.println("b");
}
}
public class LoadSequence {
/**
*
*/
public LoadSequence() {
super();
// TODO Auto-generated constructor stub
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
LoadSequenceA a = new LoadSequenceB();
System.out.println("************");
a = new LoadSequenceB();
}
}
结果:
5
1
2
a
6
b
************
a
6
b