堆区:
① 堆被所有线程共享区域,在虚拟机启动时创建,唯一目的存放对象实例。
② 堆区是GC的主要区域,通常情况下分为两个区块年轻代和老年代。更细一点年轻代又分为Eden区,放新创建对象,From survivor和To survivor保存gc后幸存下的对象,默认情况下各自占比8:1:1。
③ 会有异常OutOfMemoryError
方法区
① 被所有线程共享区域,用于存放已被虚拟机加载的类信息,常量,静态变量等数据,被Java虚拟机描述为堆的一个逻辑部分,习惯也叫它永久代(Permanent Generation)
② 垃圾回收很少光顾这个区域,不过也是需要回收的,主要针对常量池回收,类卸载。
③ 常量池具有一定的动态性,里面可以存放编译期生成的常量;运行期间的常量也可以添加进入常量池中,比如String的intern()方法。
程序计数器
① 当前线程所执行的行号指示器。通过改变计数器的值来确定下一条指令,比如循环,分支,跳转,异常处理,线程恢复等都是依赖计数器来完成的。
② Java虚拟机多线程是通过线程轮流切换并分配处理器执行时间的方式实现的。为了线程切换能恢复到正确的位置,每条线程都需要一个独立的程序计数器,所以它是线程私有的。
③ 唯一一块Java虚拟机没有规定任何OutOfMemoryError的区域