生成.class可执行 >>> 类装载子系统 >>> 运行时数据区(内存模型) >>> 字节码执行引擎
存放局部变量
存放临时的操作数区域
开辟内存空间,创建对象
常量 + 静态变量 + 类信息
native修饰,底层C语言实现的
本地方法栈运行的区域**(例如:加减操作
)**
最经典的示例:多线程挂起,从一个线程转化为另外一个线程的时候,如何判断从何处开始,这时候需要用到程序计数法
将"gc root"作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象 gc roots 根节点: 线程栈的本地变量,静态变量,本地方法栈等
为每个对象创建一个引用计数,有对象引用时计数器+1,引用被释放时计数-1,当计数器为0时就可以被回收,它有一个缺点不能解决循环引用的问题
当回收的垃圾到达from survivor并且大于 from survivor(s0)内存的一半,自动放入老年代
缺点:效率低,存活对象会经常性的移动位置
新生代垃圾回收一般采用的是复制算法,复制算法的优点是效率高,缺点是内存利用率低;老年代回收器一般采用的是标记-整理的算法进行垃圾回收
停止服务器清理垃圾,一般适用于 老年代 中
减少STW(减少老年代垃圾回收的处理时间,或者排出javaBean以外的资源进入老年代)
1、把Eden+From Survivor存活对象放入To Survivor区
2、清空Eden+ From Survivor 分区;
3、From Survivor和To Survivor分区交换,From Survivor变To Survivor,To Survivor 变 From Survivor
4、每次From Survivor 到To Survivor移动时都存活的对象,年龄就+1,当年了到达15(默认)时,升级为老年代,大对象也会直接进入老年代
5、老年代当空间占用到达某个值之后就会触发全局垃圾回收,一般使用标记整理的执行算法