The same code executed straight from a java client (inVM) shows no
memory leak.
So is the fact that it is WebService significant then? What else can be
different? I think one thread remains up, and somehow this causes
openjpa not being able to clean up after itself. What can I do to debug
this more? I can actually see in the profiler that the objects are
allocated by the WebService, but why aren't they cleaned up?
Thx,
--Kurt
Kurt T Stam wrote:
Thanks Kevin, thanks for your response.
I just replaced the static call by:
apiAuthToken = new org.uddi.api_v3.AuthToken();
apiAuthToken.setAuthInfo(modelAuthToken.getAuthToken());
//MappingModelToApi.mapAuthToken(modelAuthToken,
apiAuthToken);
which did not make a difference.
I'm wondering if the fact that my class is a webservice makes a
difference. I'll try extracting it into
a regular class with a main method and profile that. At least I know
that I didn't forget something
completely obvious..
--Kurt
Kevin Sutter wrote:
Kurt,
I agree that this is very common usage of the JPA programming model.
And,
we are not aware of any memory leaks. About the only thing that
jumps out
at me is the following two lines:
apiAuthToken = new org.uddi.api_v3.AuthToken();
MappingModelToApi.mapAuthToken(modelAuthToken,
apiAuthToken);
What do these do? Can you comment these out and see if the memory leak
still exists? Since you are passing the modelAuthToken into this
method, I
don't know what it's doing with the reference and could it be holding
onto
something to prevent the GC from cleaning up?
The rest of your example seems very straight forward with creating and
persisting objects.
Kevin
On Wed, Jan 13, 2010 at 2:09 PM, Rick Curtis <curti...@gmail.com> wrote:
If you change the 1000 to something like 1000000... does your
application
go
OOM? Are you running in a JSE environment? What is PersistenceManager?
On Wed, Jan 13, 2010 at 2:05 PM, Kurt T Stam <kurt.s...@gmail.com>
wrote:
BTW I'm running with the cache off
<property name="openjpa.DataCache" value="false"/>
(that turns it off right?)
--Kurt
Kurt T Stam wrote:
Hi guys,
[DESCRIPTION] The code below inserts a 1000 records in the database.
for (int i=1; i<1000; i++) {
EntityManager em = PersistenceManager.getEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
// Generate auth token and store it!
String authInfo = AUTH_TOKEN_PREFIX +
UUID.randomUUID();
org.apache.juddi.model.AuthToken modelAuthToken = new
org.apache.juddi.model.AuthToken();
if (authInfo != null) {
modelAuthToken.setAuthToken(authInfo);
modelAuthToken.setCreated(new Date());
modelAuthToken.setLastUsed(new Date());
modelAuthToken.setAuthorizedName(publisherId);
modelAuthToken.setNumberOfUses(0);
modelAuthToken.setTokenState(AUTHTOKEN_ACTIVE);
em.persist(modelAuthToken);
}
apiAuthToken = new org.uddi.api_v3.AuthToken();
MappingModelToApi.mapAuthToken(modelAuthToken,
apiAuthToken);
tx.commit();
} finally {
if (tx.isActive()) {
tx.rollback();
}
em.clear();
em.close();
}
}
[ISSUE]
After it leaving this code I end up with a 1000
org.apache.juddi.model.AuthToken objects in memory. I've been
using the
profiler, and these objects cannot be garbage collected.
This seems to be pretty the most common use case of using an
OR-mapping
tool, so I find it hard to believe openjpa has a memory leak here.
Does
anyone see what I'm doing wrong? Or can someone point me to an
example
that
does not exhibit this behavior? BTW same code using hibernate does
not
accumulate these objects.
We're using openjpa 1.2.1.
Thx,
Kurt
Apache jUDDI.
--
Thanks,
Rick