JVM(Java Virtual Machine)运行时存储区分为4个:
1、程序计数器:线程私有。是一块较小的内存,是当前线程所执行的字节码的行号指示器。通过改变计数器的值来确定下一条指令,比如循环,分支,跳转,异常处理,线程恢复等都是依赖计数器来完成。是JVM中唯一没有规定OOM(OutofMemory)的区域。
2、栈区:线程私有,生命周期和线程相同。
用于存储(1)基础数据类型 byte short int long float double char boolean (2)对象的引用变量(引用变量就相当于是为堆中的数组或对象起的一个别名,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。)
3、堆:所有线程共享 ,JVM只有一个堆区,虚拟机启动时创建。
用于存储:(1)new出来的的对象 (2)数组
4、方法区(永久区、静态区):所有线程共享,用于存储已被JVM加载的类信息、常量、静态变量等数据。
方法区的垃圾收集主要是回收废弃常量和无用的类(卸载类)。但是垃圾回收其实很少光顾这个区域。
提问:String 和 stringbuffer创建的对象放在栈还是堆呢?
String既可以在堆中存放,也可以在栈中存放。String对象有两种方式来创建,一种是new,比如String str = new String("abc"),这样的会存放在堆中,且每调用一次就会创建一个新的对象;另一种是直接用等号赋值String str = "abc",这一种是先在栈中创建一个对String类的对象引用变量str ,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str 指向"abc",如果已经有"abc",则直接令str 指向"abc"。
stringbuffer存放在堆中。