zoukankan      html  css  js  c++  java
  • Java 垃圾回收

      续前节,前面总结了Java内存运行时区域划分的各个部分,分别:JVM虚拟机栈、本地方法栈(JDK Native方法执行所需)、程序计数器、堆内存、方法区、方法区常量池。其中JVM 虚拟机栈、本地方法栈、程序计数器3个区域会随线程而生,随线程而死。栈帧中的操作随着方法区的进入和推出进行相关的入栈和出栈操作。每个栈帧的大小随着方法结构而确定下来的。

      1、对象生死确定  

      堆内存存放着一个程序中所需的所有实例对象。垃圾回收机制主要针对堆内存进行回收。在执行回收之前首先要确定对象是否还在被引用。

      普遍判断对象是否存活的方法是通过引用计数法,指的是:当对象被引用,程序计数器+1;释放-1;当为0时证明对象未被引用。可回收。但是Java中并未采用次方法。

      Java采用可达性分析法 来确认对象是否存活。

      所谓可达性分析法是指的,通过一些列称之为“GC Roots” 的对象作为起点;从此起点向下搜索,所走过的路径称之为引用链,当一个对象到 GC Roots 没有任何引用链相连接,代表此对象不可达。

      如图所示:

      

      Java 可以作为GC Roots 的对象包括:

    • 虚拟机栈(帧栈中的本地变量表)中的引用对象。
    • 方法区中类静态属性引用的对象
    • 方法区中常量引用的对象
    • 本地方法栈中JNI (即一般说的 Native 方法) 的引用对象

      2、Java 引用

      java中把内存中对象的引用分成了四个等级,在不同程度下进行垃圾的回收工作。按照回收优先级顺序分为:虚引用 -> 弱引用 -> 软引用 -> 强引用。如下图

      

  • 相关阅读:
    C# 备份、还原、拷贝远程文件夹
    C#SpinWait和volatile一点温习
    Asp.net Core中使用Redis 来保存Session, 读取配置文件
    C# Round源码
    C# CRC16 和汉明重量
    .net源码调试 http://referencesource.microsoft.com/
    Session.Abandon和Session.Clear的实现和区别
    log4Net 高性能写入和CSV格式
    asp.net 简单记录请求的客户端和服务端 处理时间
    asp.net 用JWT来实现token以此取代Session
  • 原文地址:https://www.cnblogs.com/axuduo/p/11187420.html
Copyright © 2011-2022 走看看