##JVM运行时数据区分为: 线程共享部分:所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁。 线程独占部分:每个线程都会有他独占的空间,随线程生命周期而创建和销毁。 ####线程共享部分分为: 方法区:存储加载的类信息(class name, super class,interface),常量,静态变量,JIT编译后的代码等数据。 方法区(GC)存在垃圾回收,但回收频率低,回收主要针对常量池的回收和类型的卸载,当方法区无法满足内存需求是,报OOM, 堆内存: 存放对象实例,几乎所有的对象,数组都存放在这里,对于大多数应用来说,堆是JVM管理的内存中最大的一块内存区域,也是最容易OOM的区域,大多数JVM都讲堆实现为大小可扩展的,(通过-Xmx,-Xms控制)

线程独占部分分为:
虚拟机栈:线程中方法之执行的模型,每个方法执行时,就会在虚拟机中创建一个栈帧,每个方法从调用到执行的过程,就对应着栈帧在虚拟机中从入栈到出栈的过程。 (栈帧:虚拟机栈由多个栈帧组成,一个线程会执行一个或多个方法,一个方法对应一个栈帧,) 本地方法栈:执行一些其它语言的本地方法, 程序计数器:记录字节码指令执行的位置
####直接内存 不是JVM运行时数据区的一部分,也不是《JAVA虚拟机规范》中定义的内存区域,使我们常说的堆外内存,JDK1.4引入NIO,他可以使用Native函数库,直接分配堆外内存,然后通过一个存在在java堆中的DirectByteBuffer对象作为操作这块内存区域的引用进行操作, 直接内存不受java堆大小限制,当内存总和大于机器物理内存是,会OOM。
##怎么理解对象live还是die
引用计数器算法
对象不再被引用则说对象已经挂掉了,在对象里面有个ref_count计数器,只要这个值不为0则说明这个对象live, 但是这个存在一个问题如果两个对象相互引用,他们互相调用计数器值ref_count是1,其他地方也不会调用他们,就没用意义,但是却不能被回收,
可达性分析算法:
主流的商用程序语言(java,c#)都是通过可达性分析算法来判定对象是否是存活的,GC Roots 可以是:虚拟机栈,方法中静态属性引用的对象,方法区中常量引用的对象,Native方法引用的对象。
