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