(I assume you're using adapter)
ODP.NET unmanaged ado.net provider is a wrapper around their (massive) java based client-level interface. Due to this, every .NET object created through ODP.NET wraps a java object. This requires that every object is disposed to free up the java object.
It's therefore essential that you call Dispose() on all DataAccessAdapter objects. if you fetch datareaders, it's key that you dispose these as well. We went to great lengths to make sure things are disposed properly, even parameters (as in the v1.x era we had a leak there with ODP.NET).
That said, out-of-memory can happen because of a lot of things. If at your client the managed provider gives out-of-memory as well, it might also be your application fetches too much data (e.g. thousands of entities, large sets, which are kept in-memory for a long time) and keels over because of that. It also might be, due to the fact ODP.NET unmanaged wraps java objects, the amount of memory given to the JVM is too small (the JVM can be given more memory, per process) and it goes wrong because of that.
If, with the given dataset the app works with, the managed provider works fine and the unmanaged doesn't, and the JVM is given enough memory, I'd look into your code whether you dispose all adapters properly as otherwise they leak (the finalizers might not run for a long time)