队
在java中是否有可能知道当前可用对象有多少活动/强引用?
例如在下面的代码中;类A的对象可以由项目中的许多类保存。但我想在监视器线程中打印它。
public class A {
public static A a = new A();
public static A getInstance() {
return a;
}
private A() {
new Monitor(this).start();
}
class Monitor extends Thread {
A refA;
public Monitor(A ref) {
this.refA = ref;
}
public void run () {
//TODO Print how many references currently available for Object A referenced by refA;
//Sure It will be minimum one. (which is "a" in this class A)
}
}
}
请不要过分重视此示例程序。我的问题是如何找到堆/堆栈中对象可用的强引用数量?唯一的好处是我们手头有一个强有力的参考对象。
如果在java中不可能;我可以通过这种强烈的C语言参考;从C语言我能做到吗?
我只是想知道Profilers /工具是如何做到这一点的? 请帮忙。
答案 0 :(得分:0)
如果不改变VM上的类或分支工具(由于对性能的影响,很难在生产中制作),你不能得到确切的计数。
使用the ref package,如果某个对象即将被接收(并在此时执行),则会通知您,但是没有可用的计数(并且不总是由VM处理)。
答案 1 :(得分:0)
您可以执行堆转储并对其进行分析,以查找对任何对象的引用数。
您需要做什么以及如何处理这些信息,因为我怀疑有更简单/更好的方式来实现您想要的目标。
基于WeakHashMap
/**
* Reference queue for cleared WeakEntries
*/
private final ReferenceQueue<Connection> queue = new ReferenceQueue<>();
List<WeakReference<Connection>> usedConnections = ....
// when you have a new connection
Connection connection = ....
usedConnections.add(new WeakReference(connection, queue));
// checking the queue for discarded objects.
// remove null references from usedConnections
for (Connection x; (x = queue.poll()) != null; ) {
synchronized (queue) {
x.close();
}
}
答案 2 :(得分:-1)
你可以试试这样的东西
Class A
{
static int instanceCount = 0;
public A()
{
instanceCount++;
}
protected finalize()
{
instanceCount--;
}
public static int getInstanceCount()
{
return instanceCount;
}
}
我相信这是您可以使用代码包含类的引用的最接近的。希望它有所帮助...