Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 静态变量的内存范围_Java_Performance_Memory - Fatal编程技术网

Java 静态变量的内存范围

Java 静态变量的内存范围,java,performance,memory,Java,Performance,Memory,我有一个定义如下的类 final public class Results { THashSet<String> filteredHashtags; 公开课最终结果{ THashSet filteredHashtags; 约束:我知道将变量声明为静态或非静态是一个设计问题,不应该受内存使用情况的控制,但HashSet filteredHashtags占用大量内存(>1Gb),因此我可以以较低的内存使用率为代价,稍微降低可读性 选项 非静态:到目前为止,我一直将其保持为非静

我有一个定义如下的类

final public class Results {
    THashSet<String> filteredHashtags;
公开课最终结果{
THashSet filteredHashtags;
约束:我知道将变量声明为静态或非静态是一个设计问题,不应该受内存使用情况的控制,但HashSet filteredHashtags占用大量内存(>1Gb),因此我可以以较低的内存使用率为代价,稍微降低可读性

选项

  • 非静态:到目前为止,我一直将其保持为非静态,原因如下:我创建了一个类的实例,使用构造函数为filteredHashtags赋值。因为我只创建了一个类的实例,所以就类使用的内存而言,它并不重要。当不再引用对象时,将使用内存变量被释放

  • Static:就代码的可读性而言,我更喜欢保持它的静态,因为它与它所表示的物理量关系更好。但是在这种情况下,我需要使用函数为静态变量赋值,比如setValues(…)

  • 问题:

  • 我是否假设在静态情况下,在程序终止之前,与变量相关联的内存永远不会被释放
  • 如果是,除了设置filteredHashtags=null,还有更好的释放内存的方法吗

  • Rishi,您认为“在静态情况下,在程序终止之前,与变量关联的内存永远不会被释放”的假设是不正确的。
    静态属于类,类由加载器加载。因此,静态变量使用的内存可以回收。

    根据你的问题1,当你做你在问题2中所做的事情时,GC将释放它。谢谢@Aeshang,我知道这一点。我想知道是否有更整洁的方法。只是确认一下,你为什么对非静态变量这么说tic声明在程序终止之前内存不会被释放??你是说静态吗?抱歉。这是一个输入错误。是的,我是说静态是的,你是对的…检查这个…“可以回收”-如何?当类发生“卸载”时,内存将被回收。有关卸载的详细信息,请参阅JLS 3.0第12.7节。似乎表明,类可以卸载的唯一方法是,如果使用的类加载器是垃圾收集的,这将在程序终止时发生。对不起,我不能浏览整个帖子。但是,卸载类的读取和静态的读取是真实的。我认为在这方面需要注意的一点是,被其他类引用的类的静态变量不会被删除。JVM标记无法访问的资源,这些类是从Java堆中删除的合格候选类。