1、栈(stack)
存放基本类型的数据和对象的引用,即存放变量;
如果存放的是基本类型数据(非静态变量),则直接将变量名和值存入stack中的内存中;
如果是引用类型,则将变量名存入栈,然后指向它new出的对象(存放在堆中)
2、堆(heap)
堆内存用于存放有new创建的对象和数组;在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在栈内存中的首地址,在栈中的这个特殊变量就变成了数组或者对象的引用变量,引用变量相当于为数组或者对象起一个别名(代号);
3、方法区
方法区也被称之为 永久代/非堆 ,主要保存虚拟机加载的类信息、常量、静态变量,是各个线程共享的内存区,
4、程序计数器
主要记录当前线程程序的字节码执行位置,是线程私有的;
5、常量池
JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合;包括直接常量(基本类型,String)和其他类型、方法、字段的符号引用;常量池存于堆中;
public static void main(String[] args){
String name = "";//表示对象存,但是对象中没有数值
String name1 = null;//表示对象不存在
//字面量--->存放在方法区中的运行时常量池中(数据共享)
String s = "hello";
String s1 = "hello";
String s2 = new String("hello");
String s3 = new String("hello");
}