结论

局部变量表中的变量是很重要的垃圾回收根节点,被局部变量表中变量直接或者间接引用的对象都不会被回收。

实验

看如下代码,使用JVM的-XX:+PrintGC参数运行下面代码(在main函数中分别执行localVarGcN的每一个函数)

package com.winwill.jvm.basic;

public class GcTest { private static final int SIZE = 6 * 1024 * 1024; public static void localVarGc1() { byte[] b = new byte[SIZE]; System.gc(); } public static void localVarGc2() { byte[] b = new byte[SIZE]; b = null; System.gc(); } public static void localVarGc3() { { byte[] b = new byte[SIZE]; } System.gc(); } public static void localVarGc4() { { byte[] b = new byte[SIZE]; } int c = 0; System.gc(); } public static void localVarGc5() { localVarGc1(); System.gc(); } public static void main(String[] args) { // localVarGc1(); // 没有GC // localVarGc2(); // GC // localVarGc3(); // 没有GC // localVarGc4(); // GC // localVarGc5(); // GC } }

在main中分别执行localVarGc[1-5]方法,得到如下5次gc日志:

[GC (Allocation Failure) 512K->374K(130560K), 0.0006220 secs]

[GC (Allocation Failure) 886K->600K(130560K), 0.0011130 secs]

[GC (Allocation Failure) 1112K->752K(130560K), 0.0006960 secs]

[GC (Allocation Failure) 1264K->950K(131072K), 0.0015540 secs]

[GC (System.gc()) 7944K->7363K(131072K), 0.0008640 secs]

[Full GC (System.gc()) 7363K->7116K(131072K), 0.0085270 secs]

[GC (Allocation Failure) 512K->390K(130560K), 0.0008690 secs]

[GC (Allocation Failure) 902K->592K(130560K), 0.0008500 secs]

[GC (Allocation Failure) 1104K->718K(130560K), 0.0007220 secs]

[GC (Allocation Failure) 1230K->924K(131072K), 0.0012260 secs]

[GC (System.gc()) 7919K->7309K(131072K), 0.0018500 secs]

[Full GC (System.gc()) 7309K->975K(131072K), 0.0059300 secs]

[GC (Allocation Failure) 512K->374K(130560K), 0.0007940 secs]

[GC (Allocation Failure) 886K->598K(130560K), 0.0007240 secs]

[GC (Allocation Failure) 1110K->718K(130560K), 0.0007680 secs]

[GC (Allocation Failure) 1230K->916K(131072K), 0.0009900 secs]

[GC (System.gc()) 7887K->7340K(131072K), 0.0008910 secs]

[Full GC (System.gc()) 7340K->7116K(131072K), 0.0091600 secs]

[GC (Allocation Failure) 512K->416K(130560K), 0.0007990 secs]

[GC (Allocation Failure) 928K->584K(130560K), 0.0008580 secs]

[GC (Allocation Failure) 1096K->728K(130560K), 0.0007360 secs]

[GC (Allocation Failure) 1240K->910K(131072K), 0.0010150 secs]

[GC (System.gc()) 7883K->7339K(131072K), 0.0011770 secs]

[Full GC (System.gc()) 7339K->971K(131072K), 0.0069840 secs]

[GC (Allocation Failure) 512K->406K(130560K), 0.0005700 secs]

[GC (Allocation Failure) 918K->622K(130560K), 0.0011430 secs]

[GC (Allocation Failure) 1134K->710K(130560K), 0.0015010 secs]

[GC (Allocation Failure) 1222K->948K(131072K), 0.0020340 secs]

[GC (System.gc()) 7921K->7304K(131072K), 0.0013160 secs]

[Full GC (System.gc()) 7304K->7110K(131072K), 0.0091750 secs]

[GC (System.gc()) 7121K->7142K(131072K), 0.0002990 secs]

[Full GC (System.gc()) 7142K->966K(131072K), 0.0050000 secs]

从上面的gc日志中(加粗部分为System.gc触发的)可以得到如下结论:

申请了一个6M大小的空间,赋值给b引用,然后调用gc函数,因为此时这个6M的空间还被b引用着,所以不能顺利gc;

申请了一个6M大小的空间,赋值给b引用,然后将b重新赋值为null,此时这个6M的空间不再被b引用,所以可以顺利gc;

申请了一个6M大小的空间,赋值给b引用,过了b的作用返回之后调用gc函数,但是因为此时b并没有被销毁,还存在于栈帧中,这个空间也还被b引用,所以不能顺利gc;

申请了一个6M大小的空间,赋值给b引用,过了b的作用返回之后重新创建一个变量c,此时这个新的变量会复用已经失效的b变量的槽位,所以b被迫销毁了,所以6M的空间没有被任何变量引用,于是能够顺利gc;

首先调用localVarGc1(),很显然不能顺利gc,函数调用结束之后再调用gc函数,此时因为localVarGc1这个函数的栈帧已经随着函数调用的结束而被销毁,b也就被销毁了,所以6M大小的空间不被任何对象引用,于是能够顺利gc。

java 局部变量垃圾回收_java局部变量对垃圾回收的影响相关推荐

  1. java String如何回收_java中的垃圾回收

    原文-http://blog.csdn.net/zsuguangh/article/details/6429592 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用,在明确 ...

  2. java 全局变量 内存不回收_Java的内存 - 内存回收

    这篇承接上一篇 <Java的内存 - 内存模型>,分析内存回收相关的知识点. 垃圾回收包含两个步骤,①标记哪些内存是垃圾 ②回收内存.下面分别说这两个步骤有哪些算法: 1. 垃圾标记 1. ...

  3. java 手动垃圾回收_java如何进行垃圾回收的

    转:http://blog.csdn.net/yakihappy/article/details/3979944 垃圾收集的目的在于清除不再使用的对象.gc通过确定对象是否被活动对象引用来确定是否收集 ...

  4. java成员变量垃圾回收_JAVA 对象被垃圾回收后其成员变量可用吗? | 学步园

    我们知道JVM中一个对象实例超出作用域或无引用的时候会被垃圾回收,那么他被垃圾回收后,依赖其成员变量的其他实例是否还能正常使用呢?经过测试后发现即使一个实例被垃圾回收,如果他内部的数据被其他对象使用, ...

  5. java 线程池 资源回收_JAVA线程池资源回收的问题

    最近项目中为了提高用户体验度,前台创建任务后台任务,用多线程来跑. 现在的场景:后台定时任务管理这两个线程池,一个最大线程数10个,一个最大线程数15.应用部署之后,不超过5个小时,服务器负载高,内存 ...

  6. java 线程回收_JAVA线程池资源回收的问题

    最近项目中为了提高用户体验度,前台创建任务后台任务,用多线程来跑. 现在的场景:后台定时任务管理这两个线程池,一个最大线程数10个,一个最大线程数15.应用部署之后,不超过5个小时,服务器负载高,内存 ...

  7. java加快内存回收_java内存管理之垃圾回收及JVM调优

    GC(garbage Collector 垃圾收集器) 作用:a.内存的动态分配:b.垃圾回收 注:Java所承诺的自动内存管理主要是针对对象内存的回收和对象内存的分配. 一.垃圾标记 程序计数器.J ...

  8. java如何保证类不被回收_Java垃圾回收机制

    大部分转自:http://blog.csdn.net/zsuguangh/article/details/6429592 1. 垃圾回收的意义 在C++中,对象所占的内存在程序结束运行之前一直被占用, ...

  9. java 强制垃圾回收_Java垃圾回收机制

    Java垃圾回收机制 垃圾回收机制用到finalize.当程序创建对象.数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存中,当这块内存不再被任何引用变量引用时,这块内存 ...

最新文章

  1. JSPServlet(1)
  2. zephir开发的扩展“wudimei框架”之数据库使用方法
  3. C++ Primer 5th笔记(chap 17 标准库特殊设施)子表达式subexpression
  4. python 没找到库_这十个Python常用库,学习Python的你必须要知道!
  5. sql重复数据取日期小的_excel快速查询重复数据的3个小技巧
  6. Android onActivityResult中requestCode与resultCode区别
  7. egg直接取req_Egg服务器基础功能
  8. oracle宕机原因排查,oracle不定期的出现宕机的问题诊断
  9. 双向晶闸管,调压电路,开关电路,楼梯灯电路,光控路灯,无电弧接触器电路
  10. linux dosbox使用教程,dosbox安装及汇编教程 dosbox的常用快捷键
  11. vue中使用使用阿里云的iconfont
  12. 专科学校计算机是必修课吗,高等专科学校公共计算机选修课的开展与探索
  13. SQL中的n+1次select语句查询问题
  14. R语言 循环 步长 写法
  15. InputStream的available()方法(读文件)
  16. 计算机二级大题知识点汇总,计算机二级office复习知识点「汇总」
  17. 案例分享:如何通过数据分析进行活动效果评估
  18. 转载:Fiddler 教程
  19. 固态硬盘运行服务器,固态硬盘(SSD)在服务器中的工作原理是什么
  20. android系统怎么刷机教程,如何刷新Android系统? Android手机通用刷机教程

热门文章

  1. 涂鸦智能传感合作伙伴大会圆满落幕,打造安防传感新生态
  2. 苹果 Siri 被曝涉嫌泄露用户隐私;中国联通回应 5G 入网问题;PHP 7.4 beta 1 发布 | 极客头条...
  3. 华为或向苹果出售 5G 芯片;拼多多回应苹果停止供货;微信再推新功能! | 极客头条...
  4. 是谁榨干了 Android 设备的电量和流量?!| 极客头条
  5. 阿里战微信!20 亿元扶持小程序开发者
  6. Chrome 新 UI 很“难看”,用户很生气
  7. 程序员是否应该创造面向 IDE 而非人类的编程语言?
  8. 史上最大漏洞危机再生新变种,大量芯片受感染
  9. 58 同城 iOS 客户端搜索模块组件化实践
  10. 辽宁职称计算机和英语考试,2018年辽宁职称计算机报考有哪些要求?