确定队列大小

时间:2013-05-30 16:55:42

标签: java queue buffer priority-queue

我必须实现一个队列,根据某个因素,在不同的时间由两个不同的线程添加和删除对象。我的问题是要求说队列(整个队列和它拥有的数据)不应该占用200KB +数据。如果大小是200线程应该等待空间可用来推送更多数据。对象推送的大小可能不同。我可以创建java队列obut队列的大小将返回推送的总对象而不是使用的总内存如何确定队列所引用的数据的大小。

将对象视为

    class A{
       int x;
       byte[] buf;//array size vary per object
    }

1 个答案:

答案 0 :(得分:0)

Java中没有开箱即用的功能。 (在某种程度上,因为没有简单的方法可以知道添加到集合中的对象是否在其他地方被引用,因此如果添加它们会占用额外的内存。)

对于您的用例,您可能最好只是对队列进行子类化。重写super以将对象的大小添加到计数器(显然你必须使这个计算线程安全。)并且如果它没有空间则抛出异常IllegalStateException。同样,如果在重写的删除类上减少你的计数器。

确定如何向计数器添加多少空间的方法可能会有所不同。 Farlan建议使用this,看起来它会起作用。但由于您建议您正在处理字节数组,因此您可能已经知道要添加的数据的大小。您还必须考虑是否要考虑任何开销。该对象占用一些空间,队列内部的引用也是如此。加上队列对象。你可以找出确切的值,但是因为看起来你的要求只是为了防止outofmemory,你可能只是使用粗略的估计,只要你是一致的。

您想要子类化的队列类的详细信息可能取决于您认为线程之间存在多少争用。但听起来你可以处理同步问题。