栈:线程私有,为每个加载的方法创建一个栈帧,方法的进入退出分别对应栈帧的压栈和弹栈
存储基础数据类型的值与对象的引用。是一串连续的内存空间,后进先出
堆:通过new创建的对象存储在堆中,不是连续的内存空间,线程间共享,数组也存储在堆中(即使长度为0,因为开辟了内存空间)
方法区:是线程间共享的区域,用于存储虚拟机已经加载的类信息、常量池、static变量、即时编译器编译后的代码。
String a=new String("aa");---------在堆中创建字符串对象,多次new,则多次创建
String b="aa";-------------------先在常量池中找,没有则新建,有的话直接用,存储在方法区的常量池中
String c=b+b;-------------------带加号的,如果不是final修饰,则也存储在堆中
final String d="bb";
String e=d+b;-------------因为是final的,常量,所以存储在常量池中
jvm中GCRoot根节点:
(1)方法区中静态属性指向的对象
(2)方法区中的常量指向的对象
(3)虚拟机中局部变量指向的对象
(4)本地方法栈中JNI(native修饰方法指向的对象)