zoukankan      html  css  js  c++  java
  • 【jvm】GC笔记(一)

    什么是垃圾回收(GC)?

    垃圾回收是为了释放那些不在被使用的独享以释放存储空间,提高程序效率。

    什么时候需要GC?

    当一个对象变得不可达(对象已死)的时候可以回收。

    什么是不可达呢?就是一个对象没有在任何地方被引用,则它就是不可达的,可以被回收的。

    怎么判断对象是活的还是死的(不可达的)?

    1.通过引用计数计数器

    为对象设置一个应用计数器,当该对象被引用时,计数器加1,当引用失效时就减1,当计数器的值为0时,则表明没有在任何地方引用到它,可以被GC。但是它无法解决对象之间相互循环引用的问题。

    2.通过根搜索算法

    通过一系列名为GC Roots的对象向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连(即对象不可达)时就可以判定对象是死的,可以被GC。

    Java中可作为GC Root的对象

    • 虚拟机栈(栈帧中的本地变量表)中引用的对象。

    • 方法区中类静态属性引用的对象。

    • 方法区中常量引用的对象。

    • 本地方法栈中JNI(即一般说的Native方法)引用的对象。

    GC回收的主要地方?

    GC主要对堆中的对象进行回收,也会对方法区(永久代)进行回收。主要回收两部分内容:废弃常量和无用的类。

    废弃的常量:没有任何地方引用的这个常量,则它是废弃的常量,会被移出常量池。

    无用的类:

    GC回收什么时候进行

    GC的时间不确定,具体由虚拟机自己控制,也可以调用gc()方法通知虚拟机需要回收,但是否真正回收还是有虚拟机自己决定。

    一个对象至少要被两次标记为可回收才会回收。

  • 相关阅读:
    单链表的学习
    数据库连接
    Oracle学习指南
    Java登录第一版
    LeetCode(141): Linked List Cycle
    LeetCode(24): Swap Nodes in Pairs
    LeetCode(2):Add Two Numbers
    LeetCode(83):Remove Duplicates from Sorted List
    LeetCode(21):Merge Two Sorted Lists
    LeetCode(234):Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286701.html
Copyright © 2011-2022 走看看