9. java内存模型,垃圾回收机制,不可达算法
(1).Java的内存结构,也就是运行时的数据区域:
程序计数器:
程序计数器是一个较小的内存空间,他可以看做当前线程所执行的字节码的行号指示器,由于java虚拟机的多线程是通过线程轮流切换并分配处理器的执行时间来实现的,任何一个确定的时刻,一个处理器(对应于多核中的一个内核)都只会执行一个线程中的指令,因此为了线程切换后内回到正确的位置,每个线程都有一个独立的程序计数器,各线程之间的程序计数器互不影响,我们称为线程私有内存 唯一一个没有内存溢出的区域。
java虚拟机栈:
Java虚拟机栈也是线程私有的,他描述的是java方法执行的内存模型,每个方法执行的同时都要创建一个栈帧,用于储存局部变量表,操作数栈,动态链接,方法出口,等信息,每一个方法从调用到执行完成,都对应一个栈帧在虚拟机栈中从入栈到出栈的过程
局部变量表放置了,编译器可知的各种基本数据类型,和对象引用
本地方法栈:
类似虚拟机栈,存储执行本地方法(native)时所需要的数据、指令、返回地址。
方法区:
和java堆是一样,是各个线程共享的内存区域,它用于储存已经被虚拟机加载的,类信息,常量(1.7之后有变化,String常量存在heap中),静态变量,即时编译器(JIT)编译后的代码。
堆:
堆是JVM所管理的内存中最大的一块,是被所有Java线程锁共享的,不是线程安全的,在JVM启动时创建。堆是存储Java对象的地方,这一点Java虚拟机规范中描述是:所有的对象实例以及数组都要在堆上分配。Java堆是GC管理的主要区域,从内存回收的角度来看,由于现在GC基本都采用分代收集算法,所以Java堆还可以细分为:新生代和老年代;新生代再细致一点有Eden空间、From Survivor空间、To Survivor空间等。
(2).垃圾回收机制
详见我另一篇博客:GC算法
(3).可达性算法
1 虚拟机栈中的引用对象
2 方法区中类静态属性引用的对象
3 方法区中常量引用的对象
4 本地方法占中jin引用的对象