1、栈(stack)
    存放基本类型的数据和对象的引用,即存放变量;
    如果存放的是基本类型数据(非静态变量),则直接将变量名和值存入stack中的内存中;
    如果是引用类型,则将变量名存入栈,然后指向它new出的对象(存放在堆中)

    2、堆(heap)
    堆内存用于存放有new创建的对象和数组;在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在栈内存中的首地址,在栈中的这个特殊变量就变成了数组或者对象的引用变量,引用变量相当于为数组或者对象起一个别名(代号);

    3、方法区
    方法区也被称之为 永久代/非堆 ,主要保存虚拟机加载的类信息、常量、静态变量,是各个线程共享的内存区,

    4、程序计数器
    主要记录当前线程程序的字节码执行位置,是线程私有的;
    5、常量池
    JVM为每个已加载的类型维护一个常量池,常量池就是这个类型用到的常量的一个有序集合;包括直接常量(基本类型,String)和其他类型、方法、字段的符号引用;常量池存于堆中;
    内存解析 - 图1

    1. public static void main(String[] args){
    2. String name = "";//表示对象存,但是对象中没有数值
    3. String name1 = null;//表示对象不存在
    4. //字面量--->存放在方法区中的运行时常量池中(数据共享)
    5. String s = "hello";
    6. String s1 = "hello";
    7. String s2 = new String("hello");
    8. String s3 = new String("hello");
    9. }