java static 变量 内存释放_浅谈静态变量的回收问题

本文探讨了Java中静态变量内存释放的问题,特别是当静态变量`cachebuffer`被新对象替换时,旧对象是否会被GC回收。文章分析了JVM内存结构,包括堆、栈、方法区等,并详细讲解了垃圾回收的原理,如引用计数法、可达性分析算法、各种垃圾回收算法(标记-清除、复制、标记-整理、分代收集)。最后指出,静态变量通常不会轻易被GC回收,除非满足特定条件(所有实例被回收、加载类的ClassLoader被回收、Class对象无法访问)。
摘要由CSDN通过智能技术生成

今天工作中遇到一个用于缓存数据到内存的静态变量Stringbuffer;当缓存数据大小达到5M的时候就把该缓存数据写到S3上;然后清空该缓存buffer;看了这段代码我觉得是不是有点问题;先贴大概的代码

package com.sanpang.demo;

public class StaticVariableDemo {

//定义一个缓存buffer;存放数据到内存;数据达到5M的时候就写到S3上面;

public static StringBuffer cachebuffer = new StringBuffer();

public static void main(String[] args) {

cachebuffer.append("存的数据 达到5M");

//将数据存到S3 ;然后清空buffer

cachebuffer = new StringBuffer();

}

}

看了以上代码;我担心一个问题是这里通过new 个新对象来起到清空buffer的作用:

cachebuffer = new StringBuffer();

这样的写法会不会导致这个静态变量cachebuffer 之前引用的实例还存在不;有没有被GC回收;如果没有会不会出现OOM的问题?

带着这个疑惑问了很多技术小伙伴得到的回复都没有解决我疑惑的问题;于是自己分析了一下;自己主要疑惑的一个是这个静态变量在JVM 中的内存存储;还有一个疑惑就是这个静态对象之前引用的地址所指向的实例会不会被GC立即回收;

带着问题看了些关于JVM GC 的文章;下面写下我看了这些文章的自己的理解;不对的地方希望可以指出;

首先是JVM内存结构

根据《java虚拟机规范》规定,JVM的基本结构一般如下图所示

17920a658328

Paste_Image.png

从左图可知,JVM主要包括四个部分:

1.类加载器(ClassLoader):在JVM启动时或者在类运行时将需要的class加载到JVM中。(右图表示了从java源文件到JVM的整个过程,可配合理解。 关于类的加载机制,可以参考http://blog.csdn.net/tonytfjing/article/details/47212291)

2.执行引擎:负责执行class文件中包含的字节码指令(执行引擎的工作机制,这里也不细说了,这里主要介绍JVM结构);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值