The question you need to ask yourself is, why do you want to remove a packet object immediately? You say that the GC runs every 5-50 seconds and you want to keep RAM (I assume you mean usage) low.
When writing Java code you should not (really) consider its interaction with the JVM's memory management. When you start your application, a heap size wil be set (either using default values or explicitly via the -Xms/-Xmx command line switches). If the application is handling all of the packets being delivered and the GC overhead (application pause time) is acceptable then your code is working exactly the way it should. You have no reason to want to delete processed packets as the GC is doing that for you.
Assuming you're using the Hotspot VM then the heap is separated into regions called generations. The primary reason for this is the weak generational hypothesis, which basically says that most objects you use only live for a very, very short time. If objects are collected in the young generation (which your packets most likely will be) there is effectively zero cost of collection, since they do not need to be processed in any way. The JVM will monitor heap memory usage and run whenever it is necessary to reclaim space to keep your application running.
You should let the JVM do its job and focus on the application logic.