虚拟机的运行时数据区管理着内存,分为五个区域。方法区,虚拟机栈,本地方法栈(有些虚拟机把这两个栈合二为一),堆,程序计数器。
JAVA虚拟机管理内存
< div> 虚拟机的运行时数据区管理着内存,分为五个区域。方法区,虚拟机栈,本地方法栈(有些虚拟机把这两个栈合二为一),堆,程序计数器。 程序计数器: 每个线程处理Java方法执行位置的程序计数器所在内存区域。本地方法计数器为空,属于线程私有,即线程各自的程序计数器互不干扰。这个不会弹溢出异常,其余区域都会弹溢出异常。 Java虚拟机栈 :Java方法执行时,创建一个栈帧,保存局部变量表,方法出口等方法相关信息,属于线程私有区域。 本地方法栈:与Java虚拟机栈相似,本地方法执行时,保存方法相关信息。 Java堆:存放对象的内存区域。里面可以分为线程共享区域和线程私有区域。 方法区:属于线程共享区域,存储类信息,静态变量,代码。 当创建线程过多时,会弹出OutOfMemory异常,这是因为系统内存不足以分配Java虚拟机请求的栈内存。如果在方法中死循环爆出异常,这是StackOutOfMomory异常。栈的大小超出虚拟机规定大小。 堆又分为老年代和新生代(方法区被称作永久代),老年代主要采用标记整理方法清理内存,新生代通过复制法清理内存。复制法思想将新生代区分为eden区和两个survior区,清理eden区和其中一个survior区,将存活的引用复制到另一个survior区,如果survior区大小不够,向老年代借 空间存储。minorGC和FullGC不同之处,minorGC只清理新生代,FullGC连老年代也清理。 判断对象已死的算法是根搜索算法。