首先明白,java创建一个对象,就是分配一块内存区域,然后把这个对象的一些具体信息,存放在这个区域里面。
虚拟机会把计算机中的许多内存管理起来。相当于一个大管家,不同的区域也有不同的应用。因此,也就构成了java的内存分配区域。
第一种:寄存器。
由于寄存器位于cpu内部,他的存取速度是最快的。当然,如果把对象存放在寄存器里面,这样对象的访问速度当然是最高的。但是只是我们一相情愿,对于寄存器的内存分配,是java编译器来自动分配的,我们是无法用程序来控制的。所以,只能望而却步。
第二种: 栈
首先明白,java对象的创建分为两个时期。第一个时期,java应用程开发过程中创建。第二个事情,是代码运行的时候,运用New关键字创建对象。虽然对象不能存放在寄存器中,但是我们知道通过栈指针,可以通过获得处理器的支持,指针向上移动则释放原有对象的内存,指针向下移动,则为对象分配内存。相比而言,效率也是很高的。但是由于有些java的对象都是在运行的时候就才创建对象,因此不能把对象存放在栈里面。
这里我们需要明白一些概念,因为java是面向对象的语言,所以对于一些基础变量也可以把它看做对象。这些对象是java提供能够的标准对象,我们是无法修改的。这就是对象创建第一个时期。即这些基础变量在程序开发过程中即可创建。下面继续回归到为什么栈中不适合存放我们自己创建的对象。由于我们在栈中创建对象的时候必须预先知道这些对象占多大字节,生命周期是多少等等一些信息。而对于基础变量来说自己数根据变量类型都是可以确定,因此可以把这些所谓的对象存放在栈里面。而用户自己创建的对象由于并不知道需要分配多少的内存才可以完整的记录下对象的信息,这样栈指针也无法知道便宜多少。所以就不适合存放在栈中。
第三种: 栈、堆
由于堆中没有栈指针,所以就不能获得处理器的支持,所以相比而言效率就不是太高。和栈相比就有一定的差距。因此new出来的对象都保存在堆中。因为java编译器不需要知道从堆里分配多少内存给对象,所以也是最灵活的,不需要记录太多的分配内存信息。系统会自动给对象分配一个内存。当然,最大的不足之处就是,在堆中创建对象和分配内存区域比栈中要慢的很多。
第三种: 静态区域
java中一些特殊的区域,也就是用static修饰的变量,都存放在这些静态区域。必须明确,所谓的静态区域就是java虚拟机会在一些固定的一篇内存上面存放一些数据。由于它是在固定的位置上面,因此当需要这个数据的时候就可以直接访问,因此效率会很高。所以,我们要尽量使用static定义一些变量,因为他的访问速度是很高的。