[JAVA] JSP geheugenlek bij vullen MYSQL db

Pagina: 1
Acties:

  • Zandor
  • Registratie: Juni 1999
  • Laatst online: 26-03 15:53
ik heb het volgende probleempje:
op mijn servertje (llinux debian woody) ben ik af en toe lekker aan het worstelen. voor de duidelijkheid: ben geen profesional ;) ook redelijke linux noob nog.

ik merk echter aan het geheugen dat als ik 10000 maal dezelfde string in een mysql database zet, er vele mb's (50 mb extra) in gebruik genomen worden, terwijl het toch dezelfde string is en een eenvoudige herhaalactie.

hoe zorg ik dat het geheugen ook weert vrijgegeven wordt: ik zie via meminfo dat het geheugengebruik ook niet meer omlaag gaat. als ik bijvoorbeeld de loop 200000 maal laat herhalen loop ie echt vast en krijg dan een java outofmemory error.

voorbeeldcode waarbij ik het probleem heb.
Kan iemand mij helpen en zeggen wat ik fout doe?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<%@ 
page language="java"
import="java.sql.*" 
import="java.lang.Object"
%>

<%
Class.forName("com.mysql.jdbc.Driver").newInstance();
Connection db = DriverManager.getConnection("jdbc:mysql://localhost:3306/twb","-----","----");
%>

<%int van = 0;
int tot = 10000;
String content=new String();
String opslaan=new String();
String invul = new String();%>

<%
for (int loep = van; loep < tot ; loep++) { %>
<%=(loep)%>&nbsp
                <% content = "bladibladiblabladibladiblabladibladiblabladibl"; %>

<%
invul = content;
opslaan="INSERT INTO twb(content) VALUES (?)";
PreparedStatement ps = db.prepareStatement(opslaan);
ps.setString(1, invul);
int rs = ps.executeUpdate();
ps.close();
}

db.close();
System.gc();

%>
</body></html>

E8400, P5K EPU, patriot extreme 800 4GB, EN9600gt, hoontech dsp24v, samsung F1 1TB, dell 2407wfp, canon LBP5200
Canon 50D, 17-85IS, 28-135 IS, 100-300mm, 50mm 1.8


  • Onno
  • Registratie: Juni 1999
  • Niet online
Beetje merkwaardig dat je elke keer opnieuw een prepared statement maakt. Het idee van die dingen is nou juist dat je ze kunt hergebruiken.

Dat zou verder geen lek moeten veroorzaken trouwens. :)

  • Zandor
  • Registratie: Juni 1999
  • Laatst online: 26-03 15:53
Onno schreef op donderdag 03 februari 2005 @ 21:54:
Beetje merkwaardig dat je elke keer opnieuw een prepared statement maakt.
check
Dat zou verder geen lek moeten veroorzaken trouwens.
check :)

maaruh het toevoegen van System.gc(); lijkt bij mij ook geen verschil uit te maken.

E8400, P5K EPU, patriot extreme 800 4GB, EN9600gt, hoontech dsp24v, samsung F1 1TB, dell 2407wfp, canon LBP5200
Canon 50D, 17-85IS, 28-135 IS, 100-300mm, 50mm 1.8


  • Johnny
  • Registratie: December 2001
  • Laatst online: 23:15

Johnny

ondergewaardeerde internetguru

Heb je al een memory profiler gebruikt? Daarmee kun je precies zien welke class al dat geheugen op vreet.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Wellicht helpt het nog om na elke executie een commit te doen? Maar op zich is het raar dat ie daar op lekt, het zou idd niet moeten.

Je kan waarschijnlijk het beste de boel testen door zo min mogelijk in de for-loop te plaatsen. Imho alleen de ps.setString en ps.executeUpdate-functies en dus evt een cs.commit(). De rest zou er allemaal buiten moeten blijven, sowieso is dat het beste voor de performance ;)

  • Zandor
  • Registratie: Juni 1999
  • Laatst online: 26-03 15:53
Johnny schreef op donderdag 03 februari 2005 @ 22:20:
Heb je al een memory profiler gebruikt? Daarmee kun je precies zien welke class al dat geheugen op vreet.
nee, ik zal gaan uitzoeken hoe dat werkt enezo, ken het niet. :)

E8400, P5K EPU, patriot extreme 800 4GB, EN9600gt, hoontech dsp24v, samsung F1 1TB, dell 2407wfp, canon LBP5200
Canon 50D, 17-85IS, 28-135 IS, 100-300mm, 50mm 1.8


  • Zandor
  • Registratie: Juni 1999
  • Laatst online: 26-03 15:53
ACM schreef op donderdag 03 februari 2005 @ 22:24:
Wellicht helpt het nog om na elke executie een commit te doen? Maar op zich is het raar dat ie daar op lekt, het zou idd niet moeten.
ga ik proberen.
Je kan waarschijnlijk het beste de boel testen door zo min mogelijk in de for-loop te plaatsen. Imho alleen de ps.setString en ps.executeUpdate-functies en dus evt een cs.commit(). De rest zou er allemaal buiten moeten blijven, sowieso is dat het beste voor de performance ;)
ga ik ook proberen.


kan ik trouwens zelf nog iets anderes forceren mbt die garbage collector?

E8400, P5K EPU, patriot extreme 800 4GB, EN9600gt, hoontech dsp24v, samsung F1 1TB, dell 2407wfp, canon LBP5200
Canon 50D, 17-85IS, 28-135 IS, 100-300mm, 50mm 1.8


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik zou niet te veel proberen met de garbage collector te werken. In principe zou die helemaal niet nodig moeten zijn namelijk.

Verwijderd

Nog een opmerking, je hoeft ook geen new string() voor een string declaratie op te roepen. Bij de toekenning van string literal (= ook 'gewoon' een String object) wordt dat String object dan nodeloos weer weggegooid.

ps

Je kunt ook beter engelse namen in je code gebruiken ;)
Pagina: 1