Question: I'm new to Java and really need your help.

I am presently using a queue, a receiver thread puts data into this queue and the parser reads out of this.
But the problem is the receiver may receive at incredible peak speed, ~~eg. 3000/sec, while the parser only parses at 100/sec.~~ 

> 
> EDIT:I have checked, the queue first
>  stays at 100 or so, and after ten
>  seconds it starts to grow at 100 per
>  second, and crashes at 2000 or so.
>  Could it be possible that there is a
>  memory leak?
> 
> 
> 

My code (in a tight loop) is 

```
byte[] data = new byte[1024];
System.arraycopy(udpPacket.getData(), 0, data, 0, 1024);
queue.offer(data);

```

The heap is filled up too quickly, and I get an outofmemory exception. I guess the problem is that queue is made using a linked-list, and all the pointers must be saved in the heap.

I know a C version that does the same thing(using a buffer) but has much better performance, but because of deployment issues, we can only use Java.

Answer: 
If you receive 3000/sec but only process 100/sec sooner or later you will run out of memory.
May I suggest you use more threads to do the parsing?

Concerning the queue, have a look at [LinkedBlockingDeque](http://java.sun.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingDeque.html) and [LinkedBlockingQueue](http://java.sun.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingQueue.html). There are both high-performance thread-safe queue implementations.
If the producer produces more data then the consumer can handle, then the data will start to accumulate and eventually you run into OutOfMemory problems. This will depend on (1) the rate difference between the producer and consumer, (2) the quantity of data you have to process.

I suggest you limit the number of items in the queue. Use a [`BlockingDeque`](http://java.sun.com/javase/6/docs/api/java/util/concurrent/BlockingDeque.html) -> [`LinkedBlockingDeque`](http://java.sun.com/javase/6/docs/api/java/util/concurrent/LinkedBlockingDeque.html) to limit the capacity of the queue and block your loop when the limit is reached. This way, the queue acts as a cache to the parser.