栈,堆,方法区
1.静态成员变量在metaspace中;
2.其余的所有对象类型(成员变量和方法中的局部变量)都在heap中;
3.方法中的基本数据类型(局部变量),在栈中;
4.成员变量中的基本数据类型,跟所在对象一起,放在heap中。
1.栈:
函数中定义的基本类型变量,对象的引用变量都在函数的栈内存中分配。
栈内存特点,数数据一执行完毕,变量会立即释放,节约内存空间。
栈内存中的数据,没有默认初始化值,需要手动设置。
2.堆:
:
堆内存用来存放new创建的对象和数组。
堆内存中所有的实体都有内存地址值。
堆内存中的实体是用来封装数据的,这些数据都有默认初始化值。
堆内存中的实体不再被指向时,JVM启动垃圾回收机制,自动清除,这也是JAVA优于C++的表现之一(C++中需要程序员手动清除)。
3.方法区
和java堆一样,方法区是一块所有线程共享的内存区域。
保存系统的类信息,比如,类的字段,方法,常量池等。
方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出的错误
jdk1.6和jdk1.7方法区可以理解为永久区。
jdk1.8已经将方法区取消,替代的是元数据区。
jdk1.8的元数据区可以使用参数-XX:MaxMetaspaceSzie设定大小,这是一块堆外的直接内存,与永久区不同,如果不指定大小,默认情况下,虚拟机会耗尽可用系统内存