Java中的内存划分
Java 程序运行时,需要在内存中分配空间。为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
Java中的内存划分主要分为五个部分。
栈(Stack)
栈中存放的都是方法中的局部变量。局部变量一旦超出作用域,立刻从栈中消失。
栈有一个很重要的特性:存在栈中的数据可以共享。
假如int a = 1 ,int b = 1;编译器会先处理int a = 1,首先编译器会创建一个变量为a的引用,然后找有没有值为1的地址,如果没有就开辟一个字面量为1的地址空间,然后把变量a指向1的地址,接着执行int b = 1;在创建b的引用后,由于已经有了字面量为1的地址,因此编译器就直接把变量b的引用指向字面量为1的地址。此时变量a和变量b均指向字面量为1的地址。
堆(Heap)
在Java中凡是使用new关键字声明的变量均保存在堆中。
堆内存中的东西都有一个地址值,这个地址值使用16进制表示。
堆内存中的数据都有默认值。
如果是整数,默认值为0;
如果是浮点数,默认值为0.0;
如果是字符,默认值为“\u0000”;
如果是布尔型,默认值为false;
如果是引用类型,默认值时null;
Java自动管理堆和栈,开发人员不能直接地设置堆和栈。
栈的优势是:存取速度比较快,仅次于寄存器。
缺点是存放在栈中的数据大小和生存周期确定,缺乏灵活性。
而堆的优势是:可以动态分配内存大小,生存期也不必事先告诉编译器。java的垃圾回收器会自动回收不再被使用的数据。
缺点是:存取速度较慢。
方法区(Method Area)
存储class相关信息,包含方法的信息。
需要注意的是:当方法运行时,方法中的信息保存在栈中。
本地方法栈(Native Method Stack)
与操作系统相关
寄存器(pc Register)
与CPU相关。
后面两个了解即可。好了,以上就是我对java中内存分配的一些理解,如有错误,欢迎掘友留言指正。