Java 静态字段是否比包含实例更有效?这是内存泄漏吗?

Java 静态字段是否比包含实例更有效?这是内存泄漏吗?,java,performance,memory-management,memory-leaks,garbage-collection,Java,Performance,Memory Management,Memory Leaks,Garbage Collection,我正在使用库作为应用程序的一部分。 我正在实例化一个从这个库导入的类。例如,Calculator c=new Calculator()并使用实例。 类计算器有一个静态成员字段,它是一个哈希映射内部映射,具有对对象的强引用。我指的是键/值对。 因此,当我使用实例c时,这个静态internalMap正在被填充(由这个库的内部逻辑而不是由我的代码填充)。 我不确定的是,这个静态哈希映射是否比实例更有效。 我认为如果对c进行GCed,静态internalMap将不会进行GCed,因为它是静态的。 那么,

我正在使用库作为应用程序的一部分。
我正在实例化一个从这个库导入的类。例如,
Calculator c=new Calculator()
并使用实例。
计算器
有一个静态成员字段,它是一个哈希映射
内部映射
,具有对对象的强引用。我指的是键/值对。
因此,当我使用实例
c
时,这个静态
internalMap
正在被填充(由这个库的内部逻辑而不是由我的代码填充)。
我不确定的是,这个静态哈希映射是否比实例更有效。
我认为如果对
c
进行GCed,静态
internalMap
将不会进行GCed,因为它是静态的。

那么,从本质上说,这种记忆正在“丢失”?例如内存泄漏?

简短的回答是肯定的。如果要回收内存,必须清除所有静态数据。也许库的作者已经提供了一些处理方法?

据我所知,GC(垃圾收集器)查看堆内存并确定哪些对象正在使用(哪些没有使用)…删除未使用的对象。如果一个对象正在被使用/引用,这意味着“某人”仍然保持一个指向它的指针。另一方面,如果一个未使用/未引用的对象不再被引用,它就可以释放GC运行时使用的内存

基于此,对于您的
计算器
类,每当您在
internalMap
中有引用并且GC运行时,它就不会被释放……根本不会。因此,并不是说“它比实例活得长”,实例将一直存在,直到它被GC'ed,而是因为它仍然有一个(或多个)成员具有一些“活动”引用,所以它不能被GC'ed(因此,它占用的内存不能被重用/释放)


如果我错了,请更正…

否该类未向客户端代码公开。因此,如果hashmap有弱引用的键/值,那么就不会有问题了,对吗?此外,即使键/值仅由hashmap引用,它们也会永久保留,因为hashmap没有GCD,对吗?我在考虑库提供的一些方法来清理混乱。无论如何,我猜弱引用不会成为问题,除非地图本身仍然存在。是的,地图中引用的所有内容都将保留。