Java内存机制
Java内存分为若干个区域:程序计数器,Java虚拟机栈(存储临时变量表,操作数栈,动态链接,方法入口),对应着栈的出栈入栈过程,本地方法栈(调用本地方法),Java堆(内存最大的一块,所有线程共享的区域,在虚拟机启动时创建,此内存区的唯一目的是存放对象实例,包括数组,Java堆是垃圾管理器管理的的主要区域,分为新生代,老年代,永生代)、方法区(跟Java堆一样,也是所有线程共享的区域,用来加载类信息,常量、静态变量、及时编译的代码数据,也是垃圾搜集器同一管理)、运行时常量池(用于存放编译期生成的各种字面常量和符号引用,Java并不要求所有常量在编译期才产生,例如字符串);
程序计数器、虚拟机栈、本地方法栈区域是随着线程而生而亡,不需要过多考虑内存回收。而Java堆和方法区确定算法:
1、引用计数算法:python FlashPlayer、Squirrel:存在循环引用
2. 可达性分析算法(GC roots)是否到达
3. 垃圾搜集算法:标记清除算法,标记整理算法、复制算法
虚拟机类加载机制
Java类的加载、连接初始化、都是在程序运行期间完成的、可以增加灵活性、依赖运行期动态加载、和动态连接