Myšlenky dne otce Fura

Dává je jen zřídka, obvykle jim není moc rozumět a často vám ani k ničemu nejsou.

PermGenSpace problem? No problem!

Autor Michal Franc, publikováno dne 11.4.2008
Publikováno k: Java. 6 komentářů

Tento článek vyšel na našem firemním intranetu. Jelikož je jeho obsah velmi přínosný ve své jednoduchosti a agregace poznatků z řady roztříštěných zdrojů po internetu, požádal jsem autora Michala France o svolení k jeho zveřejnění. Jak to dopadlo, můžete vytušit už sami. Výsledkem je že se s Vámi mohu podělit o zkušenosti s (vy)řešením problémů OutOfMemory v oblasti PermGenSpace při redeploy našich aplikací v aplikačních kontejnerech. Před aplikací těchto znalostí jsme vcelku pravidelně po dvou „redeployích“ restartovali celý server, protože docházela PermGenSpace. V současném stavu aplikační server žije i po několika desítkách redeployů.

A nyní slíbený článek

Každého programátora to jednou čeká. Jeho aplikace začne padat na OutOfMemoryError. Dá se krčit rameny se slovy „já vážně nevím čím to je“, nebo s tím něco udělat.

Tak mu dej víc paměti

V ideálním případě je chyba způsobena pouze poddimenzovaným nastavením limitů paměti. Pak stačí nastavit JVM následovně (hodnoty doplnit dle uvážení).

Pro java.lang.OutOfMemoryError: Java heap space

-Xmx256m

Pro java.lang.OutOfMemoryError: PermGen space

-XX:MaxPermSize=128m

Další volby v dokumentaci Java HotSpot VM.

Tak tohle nepomohlo, prubni jmap

Většinou ale zvýšení přiřazené paměti problém jen oddálí. Pak přijdou na řadu diagnostické nástroje. Tím nejjednodušším je jmap.

Pomocí jmap je možné získat užitečné informace o využití paměti a umožňuje získat HEAP dump.

Více informací o jmap s příklady naleznete v sumarizaci na Blog O’Matty

S jmap jsem narazil na problém pod Windows Vista. Nepodařilo se mi ho donutit komunikovat s java procesem, který běžel jako service. Pořád tvrdošíjně tvrdil, že „Not enough storage is available to process this command”. Jediné řešení které znám je spustit proces přímo z příkazové řádky.

Můžu zjistit něco i bez jmap?

Na JDK 1.5 lze použít následující JSP (je možné ho nakopírovat přímo do deploynuté aplikace)

<%@ page import="java.lang.management.*" %>
<%@ page import="java.util.*" %>

Memory<title></head><br /> <body></p> <h1>Memory</h1> <table border="1"> <tr> <th width="100"><b>Name</b></th> <th width="150">Type</th> <th colspan="6">Usage</th> </tr> <tr> <td colspan="2"><b>Heap Memory summary</b></td> <td><b>Usage</b></td> <td><%= String.valueOf( ManagementFactory.getMemoryMXBean().getHeapMemoryUsage() ).replace(")",")</td> <td>„)%></td> </tr> <tr> <td colspan="2"><b>Non-Heap Memory summary</b></td> <td><b>Usage</b></td> <td><%= String.valueOf( ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage() ).replace(")",")</td> <td>„)%></td> </tr> <tr> <th colspan="8"></th> </tr> <p><%<br /> Iterator iter = ManagementFactory.getMemoryPoolMXBeans().iterator();<br /> while (iter.hasNext()) {<br /> MemoryPoolMXBean item = (MemoryPoolMXBean) iter.next(); %></p> <tr> <td rowspan="2"><b><%= item.getName() %></b></td> <td rowspan="2"><%= item.getType() %></td> <td><b>Usage</b></td> <td><%= String.valueOf( item.getUsage() ).replace(")",")</td> <td>„) %></td> </tr> <tr> <td><b>Peak</b></td> <td><%= String.valueOf( item.getPeakUsage() ).replace(")",")</td> <td>„) %></td> </tr> <p><%}%><br /> </table> <p></body></html></p> <p>Výpis informací může vypadat nějak takhle:</p> <p style="text-align: center"><a href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/jmx-memory-information/" rel="attachment wp-att-64" title="JMX memory information"><img src="http://blog.novoj.net/binary//2008/04/jmx-info.thumbnail.gif" alt="JMX memory information" /></a></p> <h3> Co je to ten perm gen?</h3> <p>Telegraficky – popis jednotlivých oblastí paměťi JVM (formulace dávají přednost srozumitelnosti před přesnou charakteristikou):</p> <ul> <li>Eden Space – oblast kde jsou instance objektů umístěny po jejich vytvoření (young generation)</li> <li>Survivor Space, Tenured Gen, From/To space – instance objektů s delší platností</li> <li>Perm Gen – interní data JVM, zde se ukládají načtené třídy (class)</li> <li>Code Cache – oblast obsahující bytecode přeložený do nativní podoby</li> </ul> <p style="text-align: center"><img src="http://blog.novoj.net/binary//2008/04/jvm-gen.gif" alt="Mapa paměti JVM" /></p> <p>Více se dá dočíst v <a onclick="javascript:pageTracker._trackPageview('/outgoing/java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html');" href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html">Tuning Garbage Collection with the 5.0 Java Virtual Machine</a><span class="absUrlLink"> </span></p> <h3>Paměti to žere dost, ale kde?</h3> <p>Přehled o objektech v paměti lze získat pomocí profilerů. Našinec asi vynechá klasickou komerční řadu produktů (<a onclick="javascript:pageTracker._trackPageview('/outgoing/www.yourkit.com/overview/index.jsp');" href="http://www.yourkit.com/overview/index.jsp">YourKit</a><span class="absUrlLink"></span>, <a onclick="javascript:pageTracker._trackPageview('/outgoing/www.quest.com/jprobe/');" href="http://www.quest.com/jprobe/">JProbe</a><span class="absUrlLink"></span>, <a onclick="javascript:pageTracker._trackPageview('/outgoing/www.ej-technologies.com/products/jprofiler/overview.html');" href="http://www.ej-technologies.com/products/jprofiler/overview.html">JProfiler</a><span class="absUrlLink"></span>) a bude hledat něco zdarma (<a onclick="javascript:pageTracker._trackPageview('/outgoing/www.netbeans.org/features/java/profiler.html');" href="http://www.netbeans.org/features/java/profiler.html">NetBeans Profiler</a><span class="absUrlLink"></span>). Problémy se ale nejčastěji objevují na produkčních prostředích. A zde je použití profilerů mnohem složitější. Většinou zbývá jediná možnost, získat dump paměti a ten následně analyzovat.</p> <h4>Použití jmap</h4> <p>Příklady použití jmap pod Linuxem</p> <pre class="brush: xml; title: ; notranslate" title=""> jmap -heap:format=b 18302 Attaching to process ID 18302, please wait... Debugger attached successfully. Server compiler detected. JVM version is 1.5.0_11-b03 heap written to heap.bin </pre> <p>A pod windows (JDK 1.6)</p> <pre class="brush: xml; title: ; notranslate" title=""> jmap -dump:format=b,file=heap.bin 18302 </pre> <p>Hodnota 18302 je číslo procesu (PID).</p> <h4>Dump přímo z JVM</h4> <p>Následující užitečná nastavení:</p> <p>JVM provede heap dump pokud dojde k OutOfMemoryError</p> <pre class="brush: xml; title: ; notranslate" title="">-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/dump.hprof</pre> <p>JVM provede heap dump pokud obdrží Ctrl Break</p> <pre class="brush: xml; title: ; notranslate" title="">-XX:+HeapDumpOnCtrlBreak</pre> <p>Generování dumpu může trvat poměrně dlouho (jednotky minut), proto pozor v jaké době dump děláte. JVM v průběhu generování samozřejmně nepracuje.</p> <h3>Mrkneš se na ten dump? Já se v tom nevyznám.</h3> <p>Zbývá už „jen zanalyzovat” jaké objekty jsou v paměti. Lze využít některý z profilerů, ale jsou zde i další nástroje.</p> <h4>jhat – <a onclick="javascript:pageTracker._trackPageview('/outgoing/java.sun.com/javase/6/docs/technotes/tools/share/jhat.html');" href="http://java.sun.com/javase/6/docs/technotes/tools/share/jhat.html">Java Heap Analysis Tool</a><span class="absUrlLink"> </span></h4> <p>Příklad použití (s nastavením 512MB pro jhat).</p> <pre class="brush: xml; title: ; notranslate" title=""> &gt; jhat -J-mx512m dump.hprof Reading from dump.hprof... Dump file created Thu Apr 10 18:27:40 CEST 2008 Snapshot read, resolving... Resolving 639872 objects... Chasing references, expect 127 dots ............................................................................................................................... Eliminating duplicate references ............................................................................................................................... Snapshot resolved. Started HTTP server on port 7000 Server is ready. </pre> <p>JHAT nastartuje webovou aplikaci. Nasměrujte prohlížeč na <a onclick="javascript:pageTracker._trackPageview('/outgoing/localhost:7000/');" href="http://localhost:7000/">http://localhost:7000/</a><span class="absUrlLink"></span></p> <p style="text-align: center"><img src="http://blog.novoj.net/binary//2008/04/jhat1.gif" alt="JHat console" /></p> <p style="text-align: center"><img src="http://blog.novoj.net/binary//2008/04/jhat2.gif" alt="JHat console" /></p> <h4>Sap Memory Analyzer</h4> <p>Tento nástroj je skutečně to nejlepší co se mi podařilo pro analýzu heap dumpu najít.</p> <p><a onclick="javascript:pageTracker._trackPageview('files.novoj.netbinary//2008/04/sap_memory_analyzer_03.png');" href="http://blog.novoj.net/binary//2008/04/sap_memory_analyzer_03.png" title="SAP Memory Analyzer"></a></p> <p style="text-align: center"><a onclick="javascript:pageTracker._trackPageview('files.novoj.netbinary//2008/04/sap_memory_analyzer_03.png');" href="http://blog.novoj.net/binary//2008/04/sap_memory_analyzer_03.png" title="SAP Memory Analyzer"><img src="http://blog.novoj.net/binary//2008/04/sap_memory_analyzer_03.thumbnail.png" alt="SAP Memory Analyzer" /></a></p> <p>Program je <a onclick="javascript:pageTracker._trackPageview('/outgoing/www.sdn.sap.com/irj/sdn/wiki?path=/display/Java/Java+Memory+Analysis');" href="https://www.sdn.sap.com/irj/sdn/wiki?path=/display/Java/Java+Memory+Analysis">volně ke stažení zde</a><span class="absUrlLink"></span>.</p> <h3>To neřeš, perm gen dochází jen po redeploy</h3> <p>Častý problém – na aplikačním serveru dochází Perm Gen po několika restartech aplikačního kontextu.</p> <p>Na serveru nedochází k uvolnění classloaderů a v perm gen zůstávají třídy staré verze aplikace (<a onclick="javascript:pageTracker._trackPageview('/outgoing/blogs.sun.com/fkieviet/entry/classloader_leaks_the_dreaded_java');" href="http://blogs.sun.com/fkieviet/entry/classloader_leaks_the_dreaded_java">více popisuje Frank Kieviet</a><span class="absUrlLink"></span>).</p> <p>Ano i já jsem objevil již objevené.</p> <h4>Problém první – commons logging</h4> <p>Problémy s commons-logging jsou <a onclick="javascript:pageTracker._trackPageview('/outgoing/wiki.apache.org/jakarta-commons/Logging/UndeployMemoryLeak');" href="http://wiki.apache.org/jakarta-commons/Logging/UndeployMemoryLeak">dobře popsané</a><span class="absUrlLink"></span>, celkem i srozumitelné, ale přece jen. Vzhledem k tomu, že existuje jednoduchý způsob jak se commons-logging úplně zbavit, proč to neudělat.</p> <p><a onclick="javascript:pageTracker._trackPageview('/outgoing/www.slf4j.org/docs.html');" href="http://www.slf4j.org/docs.html">SLF4J</a><span class="absUrlLink"></span> umí nahradit commons logging beze změny v aplikaci, pouze nahrazením knihoven. S Maven je řešení úžasně jednoduché. Jediný problém je, jak zajistit aby se do výsledného buildu nedostal commons-logging z tranzitivních dependencí. Řešení je nastavit scope na provided.</p> <p>Příslušná část pom.xml pak vypadá následovně:</p> <pre class="brush: xml; title: ; notranslate" title=""> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1</version> <scope>provided</scope> <!-- provided knihovny se nedostanou do vysledného WARu/EARu --> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.5.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl104-over-slf4j</artifactId> <version>1.5.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.5.0</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.14</version> <!-- SLF4J vyžaduje min. verzi 1.2.12 --> </dependency> </pre> <h4>Problém druhý – JDBC drivery</h4> <p>DriverManager v JDBC způsobuje další leak. Pokud nelze přesunout JDBC drivery do knihoven aplikačního serveru, je zde možnost použít context listener pro uvolnění registrovaných driverů:</p> <pre class="brush: java; title: ; notranslate" title=""> public class CleanupListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { } public void contextDestroyed(ServletContextEvent event) { try { Introspector.flushCaches(); for ( Enumeration e = DriverManager.getDrivers(); e.hasMoreElements(); ) { Driver driver = (Driver) e.nextElement(); if (driver.getClass().getClassLoader() == getClass().getClassLoader()) { DriverManager.deregisterDriver(driver); } } } catch (Throwable e) { System.err.println("Failled to cleanup ClassLoader for webapp"); e.printStackTrace(); } } } </pre> <p>Uvedené řešení, stejně jako problémy s dalšími knihovnami naleznete v článku <a onclick="javascript:pageTracker._trackPageview('/outgoing/opensource.atlassian.com/confluence/spring/pages/viewpage.action?pageId=2669');" href="http://opensource.atlassian.com/confluence/spring/pages/viewpage.action?pageId=2669">Memory leak – classloader won’t let go</a><span class="absUrlLink"></span>.</p> <p>Asi se zeptáte proč vše neřešit vhodným umístěním knihoven přímo do aplikačního serveru. Zní to jednoduše, nicméně úmyslně jsem řešil problém tak, aby aplikace nebyla závislá na konfiguraci prostředí.</p> <h3>Dovětek</h3> <p>Na závěr ještě doporučuji <a onclick="javascript:pageTracker._trackPageview('/outgoing/java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf');" href="http://java.sun.com/j2se/1.5/pdf/jdk50_ts_guide.pdf">JavaTM 2 Platform – Troubleshooting and Diagnostic Guide</a><span class="absUrlLink"> a </span><a onclick="javascript:pageTracker._trackPageview('/outgoing/www.szegedi.org/articles/memleak.html');" href="http://www.szegedi.org/articles/memleak.html" target="_blank">A day in the life of a memory leak hunter</a>.</p> <p>Většina nástrojů je závislá na JDK 1.5, dump lze získat i z posledních verzí JDK 1.4.2. Pokud někdo víte jak vymámit dump z JDK 1.4.2_04 podělte se prosím.</p> <p>Pro ne-Sunovské implementace JVM může být vše jinak <img src='http://blog.novoj.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p> <h3>Update k 9.5.2008 – další způsoby jak leakovat classloader</h3> <p>Následným zkoumáním našich web aplikací jsme přišli na další způsoby, jak spolehlivě přijít o možnost GC classloaderu:</p> <ul> <li> <strong>Leakování Java Timeru</strong> </p> <p> při použití Timerů ze standardního balíku Javy se často používá strategie, že při naběhnutí aplikace se nastartují vlákna, která v pravidelných intervalech provádějí určité servisní činnosti. Častou chybou ale je, že při ukončení aplikace, se nastartované Timery neuzavřou. Tím pádem zůstanou instance vašich objektů živé i po stopnutí web aplikace a zamezí zGC classloaderu celé web aplikace.</p> </li> <li> <strong>Leakování referencí v ThreadLocal</strong></p> <p> další poměrně často využívaná technika ve web aplikacích je používání ThreadLocal objektů, držících reference na objekty po celou dobu zpracování requestu. Pokud se tyto proměnné na konci zpracování nevyčistí, může v nich zůstat reference na objekt z web aplikace, což opět zabrání zGC jejího classloaderu. Tuto chybu obsahuje například i knihovna iBatis – <a onclick="javascript:pageTracker._trackPageview('/outgoing/issues.apache.org/jira/browse/IBATIS-376');" href="https://issues.apache.org/jira/browse/IBATIS-376" target="_new">chyba je již nahlášená z roku 2006</a>, takže kdo ví, jestli se jejího vyřešení dočkáme. </li> </ul> <h3>Update k 19.6.2008 – způsobů jak leakovat je na tisíc <img src='http://blog.novoj.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </h3> <ul> <li> <strong>Leakování class v Introspectoru</strong> </p> <p> Pokud používáte (nebo některá z knihoven) JavaBeany a přistupuje te k nim reflexním způsobem (tzn. používáte např. Commons BeanUtils, Spring, nebo další frameworky, které pracují s JavaBeanami) je třeba starat se o vyčištění <a onclick="javascript:pageTracker._trackPageview('/outgoing/java.sun.com/j2se/1.5.0/docs/api/java/beans/Introspector.html');" href="http://java.sun.com/j2se/1.5.0/docs/api/java/beans/Introspector.html" target="_new">Introspector</a> cache – což je cache, která udržuje meta informace o třídách, jejich property a dalších věcech, které jsou potřeba. Cache je životně důležitá z hlediska performance. Bohužel Introspector sídlí v classloaderu Javy a tudíž mimo kontext classloader webové aplikace. Classy uložené v cache tedy zabrání GC classloaderu web aplikace. Pokud používáte spring můžete využít <a onclick="javascript:pageTracker._trackPageview('/outgoing/static.springframework.org/spring/docs/2.0.x/api/org/springframework/web/util/IntrospectorCleanupListener.html');" href="http://static.springframework.org/spring/docs/2.0.x/api/org/springframework/web/util/IntrospectorCleanupListener.html" target="_new">IntrospectorCleanupListener</a>, který je ale potřeba zaregistrovat do web.xml.</p> <p> Zajímavé počtení najdeme v dokumentaci k tomuto listeneru:</p> <p> <i>Application classes hardly ever need to use the JavaBeans Introspector directly, so are normally not the cause of Introspector resource leaks. Rather, many libraries and frameworks do not clean up the Introspector: e.g. Struts and Quartz.</i></p> <p> Cache lze vyčistit také jednoduše vlasním kódem zavoláním: Introspector.flushCaches();</p> </li> </ul> <div class="snap_nopreview sharing robots-nocontent"><ul><li class="sharing_label">Líbilo se ti? Sdílej:</li><li class="share-google-plus-1 share-regular"><div class="googleplus1_button"><g:plusone size="small" callback="sharing_plusone" href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/"></g:plusone></div></li><li class="share-facebook share-regular"><div class="like_button"><iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fblog.novoj.net%2F2008%2F04%2F11%2Fpermgenspace-problem-no-problem%2F&layout=button_count&show_faces=false&action=like&colorscheme=light&height=21&locale=cs_CZ&width=90" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:96px; height:21px;" allowTransparency="true"></iframe></div></li><li class="share-twitter share-regular"><div class="twitter_button"><iframe allowtransparency="true" frameborder="0" scrolling="no" src="http://platform.twitter.com/widgets/tweet_button.html?url=http%3A%2F%2Fblog.novoj.net%2F2008%2F04%2F11%2Fpermgenspace-problem-no-problem%2F&counturl=http%3A%2F%2Fblog.novoj.net%2F2008%2F04%2F11%2Fpermgenspace-problem-no-problem%2F&count=horizontal&text=PermGenSpace%20problem%3F%20No%20problem%21: " style="width:97px; height:20px;"></iframe></div></li><li class="share-print share-regular"><a rel="nofollow" class="share-print share-icon" href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/#print" target="_blank" title="Click to print">Print</a></li><li class="share-email share-regular"><a rel="nofollow" class="share-email share-icon" href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/?share=email" target="_blank" title="Click to email this to a friend">Email</a></li><li class="share-custom"><a href="#" class="sharing-anchor">Share</a></li><li class="share-end"></li></ul><div class="sharing-hidden"><div class="inner" style="display: none;"><ul><li class="share-digg"><a rel="nofollow" class="share-digg share-icon" href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/?share=digg" target="_blank" title="Click to Digg this post">Digg</a></li><li class="share-stumbleupon"><a rel="nofollow" class="share-stumbleupon share-icon" href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/?share=stumbleupon" target="_blank" title="Click to share on StumbleUpon">StumbleUpon</a></li><li class="share-end"></li><li class="share-end"></li></ul></div></div><div class="sharing-clear"></div></div> </div> <nav id="post-nav" class="contain"> <h1 class="assistive-text">Navigace mezi články</h1> <div class="nav-older">← <a href="http://blog.novoj.net/2008/04/11/blog-v-pavucine-zajimavustky-o-javascriptu/" rel="prev">Blog v pavučině – zajímavůstky o JavaScriptu</a></div> <div class="nav-newer"><a href="http://blog.novoj.net/2008/05/09/podcast-zaznam-z-prednasky-automaticke-testovani-v-praxi/" rel="next">Podcast: Záznam z přednášky Automatické testování v praxi</a> →</div> </nav> </article> <div id="comments"> <h2 id="comments-title">6 komentáře “<span>PermGenSpace problem? No problem!</span>”</h2> <ol class="commentlist"> <li class="comment even thread-even depth-1" id="li-comment-1939"> <article id="comment-1939" class="contain"> <footer class="comment-meta contain vcard"> <img alt='' src='http://0.gravatar.com/avatar/238e8b2100a5366b226234b946026462?s=40&d=wavatar&r=G' class='avatar avatar-40 photo' height='40' width='40' /> <div class="comment-author"> <span class="fn">Ladislav Thon</span> komentoval dne <a href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/comment-page-1/#comment-1939"><time pubdate datetime="2008-04-11T14:18:16+00:00">11.4.2008 v 14:18</time></a>: </div><!-- .comment-author --> </footer><!-- .vcard --> <div class="comment-content"><p>Žil jsem v dojmu, že naopak právě umístění knihoven do aplikačního serveru způsobuje problémy (objekt třídy nahrané classloaderem aplikačního serveru nebo bootstrap classloaderem má referenci na objekt třídy nahrané classloaderem aplikace) a že by se knihovny měly umisťovat přímo k aplikaci. Jak to ksakru je? <img src='http://blog.novoj.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p> </div> <div class="reply contain"> <a class='comment-reply-link' href='/2008/04/11/permgenspace-problem-no-problem/?replytocom=1939#respond' onclick='return addComment.moveForm("comment-1939", "1939", "respond", "63")'>Odpovědět</a> </div><!-- .reply --> </article><!-- #comment-## --> </li> <li class="comment byuser comment-author-frc bypostauthor odd alt thread-odd thread-alt depth-1" id="li-comment-1940"> <article id="comment-1940" class="contain"> <footer class="comment-meta contain vcard"> <img alt='' src='http://1.gravatar.com/avatar/bb3d126e35e9246d2f62515e44f41fe7?s=40&d=wavatar&r=G' class='avatar avatar-40 photo' height='40' width='40' /> <div class="comment-author"> <span class="fn"><a onclick="javascript:pageTracker._trackPageview('/outgoing/www.fg.cz');" href='http://www.fg.cz' rel='external nofollow' class='url'>Michal Franc</a></span> komentoval dne <a href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/comment-page-1/#comment-1940"><time pubdate datetime="2008-04-11T14:56:44+00:00">11.4.2008 v 14:56</time></a>: </div><!-- .comment-author --> </footer><!-- .vcard --> <div class="comment-content"><p>To všechno platí až na malé vyjímky ;o)</p> <p>Chápu to tak, že problematická je přítomnost commons-logging v aplikačním serveru. Nebudu zastírat že v tom plavu a víc sem experimentoval.</p> <p>Nicméně v odkazovaných článcích lze nějaké info nalézt:</p> <p><a onclick="javascript:pageTracker._trackPageview('/outgoing/blogs.sun.com/fkieviet/entry/classloader_leaks_the_dreaded_java');" href="http://blogs.sun.com/fkieviet/entry/classloader_leaks_the_dreaded_java" rel="nofollow">http://blogs.sun.com/fkieviet/entry/classloader_leaks_the_dreaded_java</a><br /> Not a problem if the Apache Commons code is loaded in your application’s classloader. However, you do have a problem if this code is also present in the classpath of the application server because those classes take precedence. As a result now you have references to classes in your application from the application server’s classloader… a classloader leak!</p> <p><a onclick="javascript:pageTracker._trackPageview('/outgoing/wiki.apache.org/jakarta-commons/Logging/UndeployMemoryLeak');" href="http://wiki.apache.org/jakarta-commons/Logging/UndeployMemoryLeak" rel="nofollow">http://wiki.apache.org/jakarta-commons/Logging/UndeployMemoryLeak</a><br /> Except for the brain-dead design of JDBC where jdbc drivers loaded via a custom classloader apparently get stored in a map within java.sql.DriverManager thereby causing cyclic references to that classloader.</p> </div> <div class="reply contain"> <a class='comment-reply-link' href='/2008/04/11/permgenspace-problem-no-problem/?replytocom=1940#respond' onclick='return addComment.moveForm("comment-1940", "1940", "respond", "63")'>Odpovědět</a> </div><!-- .reply --> </article><!-- #comment-## --> </li> <li class="comment even thread-even depth-1" id="li-comment-1944"> <article id="comment-1944" class="contain"> <footer class="comment-meta contain vcard"> <img alt='' src='http://1.gravatar.com/avatar/9944c53b99bfbadc91251c0ae218a911?s=40&d=wavatar&r=G' class='avatar avatar-40 photo' height='40' width='40' /> <div class="comment-author"> <span class="fn"><a onclick="javascript:pageTracker._trackPageview('/outgoing/jetensky.net/blog');" href='http://jetensky.net/blog' rel='external nofollow' class='url'>Pavel Jetenský</a></span> komentoval dne <a href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/comment-page-1/#comment-1944"><time pubdate datetime="2008-04-15T12:17:37+00:00">15.4.2008 v 12:17</time></a>: </div><!-- .comment-author --> </footer><!-- .vcard --> <div class="comment-content"><p>Tak tenhle článek obsahuje spoustu hodnotného a vydestilovaného úsilí. Určitě ho nečtu naposled, díky moc pánové…</p> </div> <div class="reply contain"> <a class='comment-reply-link' href='/2008/04/11/permgenspace-problem-no-problem/?replytocom=1944#respond' onclick='return addComment.moveForm("comment-1944", "1944", "respond", "63")'>Odpovědět</a> </div><!-- .reply --> </article><!-- #comment-## --> </li> <li class="comment odd alt thread-odd thread-alt depth-1" id="li-comment-2623"> <article id="comment-2623" class="contain"> <footer class="comment-meta contain vcard"> <img alt='' src='http://0.gravatar.com/avatar/8587551597c1a635cc17ad91c965ac11?s=40&d=wavatar&r=G' class='avatar avatar-40 photo' height='40' width='40' /> <div class="comment-author"> <span class="fn">Jakub Příkazský</span> komentoval dne <a href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/comment-page-1/#comment-2623"><time pubdate datetime="2008-08-01T09:59:05+00:00">1.8.2008 v 09:59</time></a>: </div><!-- .comment-author --> </footer><!-- .vcard --> <div class="comment-content"><p>Děkuji za velmi pěkný článek, </p> <p>se stejným problémem jsem se potýkal cca před 1,5 rokem ale vy jste byl mnohem preciznější <img src='http://blog.novoj.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> . Na problém s JDBC drivery a Springem jsem přišel také, ale externí knhovny jsem příliš nezkoumal. Zajímalo by mě, do jaké míry se Vám podařilo problém odstranit (nebo zmizel úplně?). Pokud si vzpomínám, tak jsem tehdy došel do celkem rozumného stavu, kdy mi Tomcat lehnul až po několika desítkách restartů.</p> <p>Mám drobnou poznámku, odkaz na RSS kanály úplně dole ve stránce není správný a měl by být nejspíš takový <a href="http://blog.novoj.net/feed/" rel="nofollow">http://blog.novoj.net/feed/</a></p> </div> <div class="reply contain"> <a class='comment-reply-link' href='/2008/04/11/permgenspace-problem-no-problem/?replytocom=2623#respond' onclick='return addComment.moveForm("comment-2623", "2623", "respond", "63")'>Odpovědět</a> </div><!-- .reply --> </article><!-- #comment-## --> </li> <li class="comment byuser comment-author-admin even thread-even depth-1" id="li-comment-2644"> <article id="comment-2644" class="contain"> <footer class="comment-meta contain vcard"> <img alt='' src='http://0.gravatar.com/avatar/2cd9de8d95507b300cacd68f88929bbc?s=40&d=wavatar&r=G' class='avatar avatar-40 photo' height='40' width='40' /> <div class="comment-author"> <span class="fn"><a href='http://blog.novoj.net' rel='external nofollow' class='url'>Novoj</a></span> komentoval dne <a href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/comment-page-1/#comment-2644"><time pubdate datetime="2008-08-03T18:35:30+00:00">3.8.2008 v 18:35</time></a>: </div><!-- .comment-author --> </footer><!-- .vcard --> <div class="comment-content"><p>Jakube díky za info, ty linky vytváří FeedBurner plugin a přestože vypadají „zvláštně“, jsou funkční (přesměrovávají na RSS generované FeedBurnerem). Navíc např podle článku: <a onclick="javascript:pageTracker._trackPageview('/outgoing/www.brindys.com/winrss/feedformat.html');" href="http://www.brindys.com/winrss/feedformat.html" rel="nofollow">http://www.brindys.com/winrss/feedformat.html</a> se zdá, že odkaz je i správně.</p> <p>Současný status quo je ten, že problém se nám 100% odstranit nepodařilo. Po úvodním nadšení jsme zjistili, že problém se podařilo odstranit na testované instalaci, nicméně na jiných přetrvával. Od té doby dopisuji k článku další problémy, na které jsme narazili a které postupně odstraňujeme.</p> </div> <div class="reply contain"> <a class='comment-reply-link' href='/2008/04/11/permgenspace-problem-no-problem/?replytocom=2644#respond' onclick='return addComment.moveForm("comment-2644", "2644", "respond", "63")'>Odpovědět</a> </div><!-- .reply --> </article><!-- #comment-## --> </li> <li class="comment odd alt thread-odd thread-alt depth-1" id="li-comment-2772"> <article id="comment-2772" class="contain"> <footer class="comment-meta contain vcard"> <img alt='' src='http://0.gravatar.com/avatar/e2b40632e8f103bdde2f9afda573adba?s=40&d=wavatar&r=G' class='avatar avatar-40 photo' height='40' width='40' /> <div class="comment-author"> <span class="fn"><a onclick="javascript:pageTracker._trackPageview('/outgoing/www.hradil.cz');" href='http://www.hradil.cz' rel='external nofollow' class='url'>Jirka Hradil</a></span> komentoval dne <a href="http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/comment-page-1/#comment-2772"><time pubdate datetime="2008-08-19T22:51:58+00:00">19.8.2008 v 22:51</time></a>: </div><!-- .comment-author --> </footer><!-- .vcard --> <div class="comment-content"><p>Děkuji za tento článek. Doplňuji další odkazy, kde je problematika také velmi hezky popsána:</p> <p><a onclick="javascript:pageTracker._trackPageview('/outgoing/blogs.sun.com/fkieviet/entry/classloader_leaks_the_dreaded_java');" href="http://blogs.sun.com/fkieviet/entry/classloader_leaks_the_dreaded_java" rel="nofollow">http://blogs.sun.com/fkieviet/entry/classloader_leaks_the_dreaded_java</a><br /> <a onclick="javascript:pageTracker._trackPageview('/outgoing/blogs.sun.com/fkieviet/entry/how_to_fix_the_dreaded');" href="http://blogs.sun.com/fkieviet/entry/how_to_fix_the_dreaded" rel="nofollow">http://blogs.sun.com/fkieviet/entry/how_to_fix_the_dreaded</a></p> </div> <div class="reply contain"> <a class='comment-reply-link' href='/2008/04/11/permgenspace-problem-no-problem/?replytocom=2772#respond' onclick='return addComment.moveForm("comment-2772", "2772", "respond", "63")'>Odpovědět</a> </div><!-- .reply --> </article><!-- #comment-## --> </li> </ol> <div id="respond"> <h3 id="reply-title">Napsat komentář <small><a rel="nofollow" id="cancel-comment-reply-link" href="/2008/04/11/permgenspace-problem-no-problem/#respond" style="display:none;">Zrušit odpověď na komentář</a></small></h3> <form action="http://blog.novoj.net/wp-comments-post.php" method="post" id="commentform"> <p class="comment-notes">Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny <span class="required">*</span></p> <p class="comment-form-author"><label for="author">Jméno</label> <span class="required">*</span><input id="author" name="author" type="text" value="" size="30" aria-required='true' /></p> <p class="comment-form-email"><label for="email">Emailová adresa</label> <span class="required">*</span><input id="email" name="email" type="text" value="" size="30" aria-required='true' /></p> <p class="comment-form-url"><label for="url">Webová stránka</label><input id="url" name="url" type="text" value="" size="30" /></p> <p class="comment-form-comment"><label for="comment">Komentář</label><textarea id="comment" name="comment" cols="45" rows="8" aria-required="true"></textarea></p> <p class="form-allowed-tags">Můžete používat následující <abbr title="HyperText Markup Language">HTML</abbr> značky a atributy: <code><a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> </code></p> <p class="form-submit"> <input name="submit" type="submit" id="submit" value="Odeslat komentář" /> <input type='hidden' name='comment_post_ID' value='63' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /> </p> <p style="display: none;"><input type="hidden" id="akismet_comment_nonce" name="akismet_comment_nonce" value="e1c9ac1268" /></p> <span id="openid_comment"> <label> <input type="checkbox" id="login_with_openid" name="login_with_openid" checked="checked" /> Ověřit tento komentář pomocí <span class="openid_link">OpenID</span>. </label> </span> <script type="text/javascript">jQuery(function(){ add_openid_to_comment_form('http://blog.novoj.net/index.php', 'e1476d14d4') })</script> <p class="comment-subscription-form"><input type="checkbox" name="subscribe_comments" id="subscribe_comments" value="subscribe" style="width: auto; -moz-appearance: checkbox; -webkit-appearance: checkbox;" /> <label class="subscribe-label" id="subscribe-label" for="subscribe_comments">Pošli mi reakce na můj komentář e-mailem.</label></p><p class="comment-subscription-form"><input type="checkbox" name="subscribe_blog" id="subscribe_blog" value="subscribe" style="width: auto; -moz-appearance: checkbox; -webkit-appearance: checkbox;" /> <label class="subscribe-label" id="subscribe-blog-label" for="subscribe_blog">Pošli mi nové komentáře k článku na e-mail.</label></p> </form> </div><!-- #respond --> </div><!-- #comments --> </div><!-- end main --> <ul id="sidebar" role="complementary"> <li id="search-3" class="widget widget_search"><h2 class="widget-title">Vyhledávání</h2><form role="search" method="get" id="searchform" action="http://blog.novoj.net/" > <div><label class="screen-reader-text" for="s">Hledat:</label> <input type="text" value="" name="s" id="s" /> <input type="submit" id="searchsubmit" value="Hledat" /> </div> </form></li><li id="get-recent-comments" class="widget widget_get_recent_comments"><h2 class="widget-title">Poslední komentáře</h2><div id="get_recent_comments_wrap"><ul><li><strong><a href="http://blog.novoj.net/2011/01/25/muj-prechod-na-ubuntu/" title="Můj přechod na Ubuntu zveřejněn dne 25.1.2011">Můj přechod na Ubuntu</a> (<a href="#" title="Článek má 37 komentářů">37</a>)</strong><ul> <li style="list-style-type: none; margin-top: 5px;"><a href="http://blog.novoj.net/2011/01/25/muj-prechod-na-ubuntu/#comment-60782" title="Můj přechod na Ubuntu, 25.1.2011"><img src="http://www.gravatar.com/avatar.php?gravatar_id=49dc6a47a23cdb9dbfe3adc0066ba913&size=15&rating=G" alt="" width="15" height="15" class="kjgrcGravatar" /></a> Nikoliv Alt + Shift+F7, ale Alt + Shift+7. To je zkratka z gnome keymap (nabízí sama Idea) za Ctrl+Alt+F7, které...</li> <li style="list-style-type: none; margin-top: 5px;"><a href="http://blog.novoj.net/2011/01/25/muj-prechod-na-ubuntu/#comment-60739" title="Můj přechod na Ubuntu, 25.1.2011"><img src="http://www.gravatar.com/avatar.php?gravatar_id=2cd9de8d95507b300cacd68f88929bbc&size=15&rating=G" alt="" width="15" height="15" class="kjgrcGravatar" /></a> No hele v Unity to skoro nejde přenastavit. Ale od Unity jsem ustoupil, protože to se výkonově nedalo. Potřebuju aby...</li> <li style="list-style-type: none; margin-top: 5px;"><a href="http://blog.novoj.net/2011/01/25/muj-prechod-na-ubuntu/#comment-60733" title="Můj přechod na Ubuntu, 25.1.2011"><img src="http://www.gravatar.com/avatar.php?gravatar_id=49dc6a47a23cdb9dbfe3adc0066ba913&size=15&rating=G" alt="" width="15" height="15" class="kjgrcGravatar" /></a> Honzo, jak máš v Idee nastavenou keymap? Ta výchozí se bije se systémovými zkratkami (třeba Alt + F7 Show usages vs....</li> </ul></li> <li><strong><a href="http://blog.novoj.net/2012/01/26/ad-acta-moje-komunikace-s-p-zahradilem/" title="Ad ACTA – moje komunikace s p. Zahradilem zveřejněn dne 26.1.2012">Ad ACTA – moje komunikace s p. Zahradilem</a> (<a href="#" title="Článek má 12 komentářů">12</a>)</strong><ul> <li style="list-style-type: none; margin-top: 5px;"><a href="http://blog.novoj.net/2012/01/26/ad-acta-moje-komunikace-s-p-zahradilem/#comment-60722" title="Ad ACTA – moje komunikace s p. Zahradilem, 26.1.2012"><img src="http://www.gravatar.com/avatar.php?gravatar_id=2cd9de8d95507b300cacd68f88929bbc&size=15&rating=G" alt="" width="15" height="15" class="kjgrcGravatar" /></a> Jo vím o tom, díky … už jsem podepsal a tweetoval dál.</li> <li style="list-style-type: none; margin-top: 5px;"><a href="http://blog.novoj.net/2012/01/26/ad-acta-moje-komunikace-s-p-zahradilem/#comment-60690" title="Ad ACTA – moje komunikace s p. Zahradilem, 26.1.2012"><img src="http://www.gravatar.com/avatar.php?gravatar_id=46dd9cf6566aec9627f12333c814d2c7&size=15&rating=G" alt="" width="15" height="15" class="kjgrcGravatar" /></a> Petice mj. existuje a v současnosti ji už podepsalo přes 900 000 lidí – viz http://www.avaaz.org/en/eu_...</li> </ul></li> </ul></div></li><li id="twitter-3" class="widget widget_twitter"><h2 class="widget-title"><a href='http://twitter.com/novoj'>Twitter (@novoj)</a></h2><ul class="tweets"> <li>Doplnil jsem půlitr krve, půlitrem svařáku a je mi dobře. Móóóc dobře :D. Ne fakt nedávám krev kvůli tomuhle. :D <a href='http://twitter.com/search?q=%23binaryblood'>#binaryblood</a> »<a href="http://twitter.com/novoj/statuses/165490913198608385" class="timesince">1 day ago</a></li> <li>@<a href='http://twitter.com/PrimaCool'>PrimaCool</a> má naprosto ty nejbožejší upoutávky a styl, kterej lze na české TV scéně vidět. Já tam prostě rád koukám jen na ty upoutávky. »<a href="http://twitter.com/novoj/statuses/165410186733957120" class="timesince">1 day ago</a></li> <li>Bylo mi ctí dnes krvácet pro dobrou věc s @<a href='http://twitter.com/tintera'>tintera</a> na <a href='http://twitter.com/search?q=%23binaryblood'>#binaryblood</a>. Další kolo za 3 měsíce. »<a href="http://twitter.com/novoj/statuses/165383851068231680" class="timesince">1 day ago</a></li> <li>Kolega teď měl zajímavej nápad - zavést něco jako programátorský řidičák. A ÚPLNÝM DEBILŮM HO VŮBEC NEDÁVAT! <a href='http://twitter.com/search?q=%23LOL'>#LOL</a> »<a href="http://twitter.com/novoj/statuses/165110226666786816" class="timesince">2 days ago</a></li> </ul> </li><li id="wpmp_switcher_widget_link" class="widget wpmp_switcher_widget_link"><h2 class="widget-title">Přepnout zobrazení</h2><ul><li><a onclick='document.cookie="wpmp_switcher=mobile;path=/;expires=Tue, 01-01-2030 00:00:00 GMT";' href='http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/?wpmp_switcher=mobile'>Přepnout do mobilního zobrazení</a></li></ul></li><li id="pages-3" class="widget widget_pages"><h2 class="widget-title">Články které nestárnou</h2> <ul> <li class="page_item page-item-3"><a href="http://blog.novoj.net/cesta-k-legalite/" title="Cesta k legalitě">Cesta k legalitě</a></li> <li class="page_item page-item-2"><a href="http://blog.novoj.net/about/" title="O tomto blogu …">O tomto blogu …</a></li> <li class="page_item page-item-1318"><a href="http://blog.novoj.net/poznamky-k-instalaci-ubuntu/" title="Poznámky k instalaci Ubuntu">Poznámky k instalaci Ubuntu</a></li> <li class="page_item page-item-477"><a href="http://blog.novoj.net/prvni-rok-myslenek-otce-fura/" title="První rok Myšlenek Otce Fura">První rok Myšlenek Otce Fura</a></li> <li class="page_item page-item-479"><a href="http://blog.novoj.net/druhy-rok-myslenek-otce-fura/" title="Druhý rok Myšlenek Otce Fura">Druhý rok Myšlenek Otce Fura</a></li> <li class="page_item page-item-706"><a href="http://blog.novoj.net/treti-rok-myslenek-otce-fura/" title="Třetí rok Myšlenek Otce Fura">Třetí rok Myšlenek Otce Fura</a></li> <li class="page_item page-item-1266"><a href="http://blog.novoj.net/ctvrty-rok-myslenek-otce-fura/" title="Čtvrtý rok Myšlenek Otce Fura">Čtvrtý rok Myšlenek Otce Fura</a></li> <li class="page_item page-item-1763"><a href="http://blog.novoj.net/paty-rok-myslenek-otce-fura/" title="Pátý rok Myšlenek Otce Fura">Pátý rok Myšlenek Otce Fura</a></li> </ul> </li><li id="archives-3" class="widget widget_archive"><h2 class="widget-title">Archív článků</h2> <ul> <li><a href='http://blog.novoj.net/2012/01/' title='Leden 2012'>Leden 2012</a> (2)</li> <li><a href='http://blog.novoj.net/2011/12/' title='Prosinec 2011'>Prosinec 2011</a> (2)</li> <li><a href='http://blog.novoj.net/2011/10/' title='Říjen 2011'>Říjen 2011</a> (2)</li> <li><a href='http://blog.novoj.net/2011/09/' title='Září 2011'>Září 2011</a> (2)</li> <li><a href='http://blog.novoj.net/2011/08/' title='Srpen 2011'>Srpen 2011</a> (2)</li> <li><a href='http://blog.novoj.net/2011/07/' title='Červenec 2011'>Červenec 2011</a> (1)</li> <li><a href='http://blog.novoj.net/2011/06/' title='Červen 2011'>Červen 2011</a> (2)</li> <li><a href='http://blog.novoj.net/2011/05/' title='Květen 2011'>Květen 2011</a> (2)</li> <li><a href='http://blog.novoj.net/2011/03/' title='Březen 2011'>Březen 2011</a> (2)</li> <li><a href='http://blog.novoj.net/2011/02/' title='Únor 2011'>Únor 2011</a> (1)</li> <li><a href='http://blog.novoj.net/2011/01/' title='Leden 2011'>Leden 2011</a> (2)</li> <li><a href='http://blog.novoj.net/2010/12/' title='Prosinec 2010'>Prosinec 2010</a> (1)</li> <li><a href='http://blog.novoj.net/2010/11/' title='Listopad 2010'>Listopad 2010</a> (3)</li> <li><a href='http://blog.novoj.net/2010/10/' title='Říjen 2010'>Říjen 2010</a> (2)</li> <li><a href='http://blog.novoj.net/2010/09/' title='Září 2010'>Září 2010</a> (2)</li> <li><a href='http://blog.novoj.net/2010/08/' title='Srpen 2010'>Srpen 2010</a> (2)</li> <li><a href='http://blog.novoj.net/2010/07/' title='Červenec 2010'>Červenec 2010</a> (1)</li> <li><a href='http://blog.novoj.net/2010/06/' title='Červen 2010'>Červen 2010</a> (1)</li> <li><a href='http://blog.novoj.net/2010/05/' title='Květen 2010'>Květen 2010</a> (2)</li> <li><a href='http://blog.novoj.net/2010/04/' title='Duben 2010'>Duben 2010</a> (1)</li> <li><a href='http://blog.novoj.net/2010/03/' title='Březen 2010'>Březen 2010</a> (2)</li> <li><a href='http://blog.novoj.net/2010/02/' title='Únor 2010'>Únor 2010</a> (3)</li> <li><a href='http://blog.novoj.net/2010/01/' title='Leden 2010'>Leden 2010</a> (1)</li> <li><a href='http://blog.novoj.net/2009/12/' title='Prosinec 2009'>Prosinec 2009</a> (2)</li> <li><a href='http://blog.novoj.net/2009/11/' title='Listopad 2009'>Listopad 2009</a> (2)</li> <li><a href='http://blog.novoj.net/2009/10/' title='Říjen 2009'>Říjen 2009</a> (1)</li> <li><a href='http://blog.novoj.net/2009/08/' title='Srpen 2009'>Srpen 2009</a> (4)</li> <li><a href='http://blog.novoj.net/2009/07/' title='Červenec 2009'>Červenec 2009</a> (1)</li> <li><a href='http://blog.novoj.net/2009/06/' title='Červen 2009'>Červen 2009</a> (2)</li> <li><a href='http://blog.novoj.net/2009/05/' title='Květen 2009'>Květen 2009</a> (3)</li> <li><a href='http://blog.novoj.net/2009/04/' title='Duben 2009'>Duben 2009</a> (4)</li> <li><a href='http://blog.novoj.net/2009/03/' title='Březen 2009'>Březen 2009</a> (2)</li> <li><a href='http://blog.novoj.net/2009/02/' title='Únor 2009'>Únor 2009</a> (3)</li> <li><a href='http://blog.novoj.net/2009/01/' title='Leden 2009'>Leden 2009</a> (4)</li> <li><a href='http://blog.novoj.net/2008/12/' title='Prosinec 2008'>Prosinec 2008</a> (4)</li> <li><a href='http://blog.novoj.net/2008/11/' title='Listopad 2008'>Listopad 2008</a> (1)</li> <li><a href='http://blog.novoj.net/2008/10/' title='Říjen 2008'>Říjen 2008</a> (3)</li> <li><a href='http://blog.novoj.net/2008/09/' title='Září 2008'>Září 2008</a> (2)</li> <li><a href='http://blog.novoj.net/2008/08/' title='Srpen 2008'>Srpen 2008</a> (5)</li> <li><a href='http://blog.novoj.net/2008/06/' title='Červen 2008'>Červen 2008</a> (2)</li> <li><a href='http://blog.novoj.net/2008/05/' title='Květen 2008'>Květen 2008</a> (3)</li> <li><a href='http://blog.novoj.net/2008/04/' title='Duben 2008'>Duben 2008</a> (3)</li> <li><a href='http://blog.novoj.net/2008/03/' title='Březen 2008'>Březen 2008</a> (3)</li> <li><a href='http://blog.novoj.net/2008/02/' title='Únor 2008'>Únor 2008</a> (2)</li> <li><a href='http://blog.novoj.net/2008/01/' title='Leden 2008'>Leden 2008</a> (3)</li> <li><a href='http://blog.novoj.net/2007/12/' title='Prosinec 2007'>Prosinec 2007</a> (2)</li> <li><a href='http://blog.novoj.net/2007/11/' title='Listopad 2007'>Listopad 2007</a> (3)</li> <li><a href='http://blog.novoj.net/2007/10/' title='Říjen 2007'>Říjen 2007</a> (2)</li> <li><a href='http://blog.novoj.net/2007/09/' title='Září 2007'>Září 2007</a> (4)</li> <li><a href='http://blog.novoj.net/2007/08/' title='Srpen 2007'>Srpen 2007</a> (4)</li> <li><a href='http://blog.novoj.net/2007/07/' title='Červenec 2007'>Červenec 2007</a> (4)</li> <li><a href='http://blog.novoj.net/2007/06/' title='Červen 2007'>Červen 2007</a> (2)</li> <li><a href='http://blog.novoj.net/2007/05/' title='Květen 2007'>Květen 2007</a> (3)</li> <li><a href='http://blog.novoj.net/2007/04/' title='Duben 2007'>Duben 2007</a> (2)</li> <li><a href='http://blog.novoj.net/2007/03/' title='Březen 2007'>Březen 2007</a> (2)</li> <li><a href='http://blog.novoj.net/2007/02/' title='Únor 2007'>Únor 2007</a> (1)</li> <li><a href='http://blog.novoj.net/2007/01/' title='Leden 2007'>Leden 2007</a> (3)</li> <li><a href='http://blog.novoj.net/2006/12/' title='Prosinec 2006'>Prosinec 2006</a> (1)</li> </ul> </li><li id="categories-2" class="widget widget_categories"><h2 class="widget-title">Kategorie</h2> <ul> <li class="cat-item cat-item-17"><a href="http://blog.novoj.net/category/posts-in-english/" title="Zobrazit všechny příspěvky zařazené do rubriky English">English</a> (10) </li> <li class="cat-item cat-item-1"><a href="http://blog.novoj.net/category/nezarazene/" title="Co se nevešlo do jiné škatulky ...">Nezařazené</a> (12) </li> <li class="cat-item cat-item-15"><a href="http://blog.novoj.net/category/podcast/" title="Zobrazit všechny příspěvky zařazené do rubriky Podcast">Podcast</a> (16) </li> <li class="cat-item cat-item-2"><a href="http://blog.novoj.net/category/programovani/" title="Zobrazit všechny příspěvky zařazené do rubriky Programování">Programování</a> (104) <ul class='children'> <li class="cat-item cat-item-8"><a href="http://blog.novoj.net/category/programovani/bezpecnost/" title="Zobrazit všechny příspěvky zařazené do rubriky Bezpečnost">Bezpečnost</a> (2) </li> <li class="cat-item cat-item-35"><a href="http://blog.novoj.net/category/programovani/databaze/" title="Zobrazit všechny příspěvky zařazené do rubriky Databáze">Databáze</a> (6) </li> <li class="cat-item cat-item-36"><a href="http://blog.novoj.net/category/programovani/groovy/" title="Zobrazit všechny příspěvky zařazené do rubriky Groovy">Groovy</a> (3) </li> <li class="cat-item cat-item-30"><a href="http://blog.novoj.net/category/programovani/ibatis/" title="Zobrazit všechny příspěvky zařazené do rubriky iBatis">iBatis</a> (7) </li> <li class="cat-item cat-item-3"><a href="http://blog.novoj.net/category/programovani/java/" title="Zobrazit všechny příspěvky zařazené do rubriky Java">Java</a> (68) </li> <li class="cat-item cat-item-25"><a href="http://blog.novoj.net/category/programovani/javascript/" title="Zobrazit všechny příspěvky zařazené do rubriky JavaScript">JavaScript</a> (7) </li> <li class="cat-item cat-item-5"><a href="http://blog.novoj.net/category/programovani/management/" title="Zobrazit všechny příspěvky zařazené do rubriky Management">Management</a> (1) </li> <li class="cat-item cat-item-10"><a href="http://blog.novoj.net/category/programovani/spring/" title="Zobrazit všechny příspěvky zařazené do rubriky Spring Framework">Spring Framework</a> (20) </li> <li class="cat-item cat-item-16"><a href="http://blog.novoj.net/category/programovani/stripes/" title="Zobrazit všechny příspěvky zařazené do rubriky Stripes">Stripes</a> (2) </li> <li class="cat-item cat-item-7"><a href="http://blog.novoj.net/category/programovani/testovani/" title="Zobrazit všechny příspěvky zařazené do rubriky Testování">Testování</a> (15) </li> <li class="cat-item cat-item-65"><a href="http://blog.novoj.net/category/programovani/user-experience/" title="Zobrazit všechny příspěvky zařazené do rubriky User Experience">User Experience</a> (1) </li> <li class="cat-item cat-item-11"><a href="http://blog.novoj.net/category/programovani/web/" title="Zobrazit všechny příspěvky zařazené do rubriky Web">Web</a> (16) </li> </ul> </li> <li class="cat-item cat-item-19"><a href="http://blog.novoj.net/category/reportaze/" title="Zobrazit všechny příspěvky zařazené do rubriky Reportáže">Reportáže</a> (23) <ul class='children'> <li class="cat-item cat-item-57"><a href="http://blog.novoj.net/category/reportaze/hackathon/" title="Zobrazit všechny příspěvky zařazené do rubriky Hackathon">Hackathon</a> (2) </li> <li class="cat-item cat-item-34"><a href="http://blog.novoj.net/category/reportaze/jopenspace/" title="Zobrazit všechny příspěvky zařazené do rubriky jOpenSpace">jOpenSpace</a> (9) </li> <li class="cat-item cat-item-66"><a href="http://blog.novoj.net/category/reportaze/webexpo-reportaze/" title="Zobrazit všechny příspěvky zařazené do rubriky WebExpo">WebExpo</a> (3) </li> </ul> </li> <li class="cat-item cat-item-4"><a href="http://blog.novoj.net/category/softwarove-nastroje/" title="Zobrazit všechny příspěvky zařazené do rubriky Softwarové nástroje">Softwarové nástroje</a> (20) <ul class='children'> <li class="cat-item cat-item-37"><a href="http://blog.novoj.net/category/softwarove-nastroje/intellij-idea/" title="Zobrazit všechny příspěvky zařazené do rubriky IntelliJ Idea">IntelliJ Idea</a> (4) </li> <li class="cat-item cat-item-6"><a href="http://blog.novoj.net/category/softwarove-nastroje/maven/" title="Zobrazit všechny příspěvky zařazené do rubriky Maven">Maven</a> (9) </li> <li class="cat-item cat-item-32"><a href="http://blog.novoj.net/category/softwarove-nastroje/selenium-softwarove-nastroje/" title="Zobrazit všechny příspěvky zařazené do rubriky Selenium">Selenium</a> (2) </li> <li class="cat-item cat-item-18"><a href="http://blog.novoj.net/category/softwarove-nastroje/teamcity/" title="Zobrazit všechny příspěvky zařazené do rubriky TeamCity">TeamCity</a> (1) </li> </ul> </li> </ul> </li><li id="text-6" class="widget widget_text"><h2 class="widget-title">Reklama</h2> <div class="textwidget"><div style="text-align: center"> <a href="http://www.fg.cz/cs/kariera/volna-mista/2.shtml?ref=blog.novoj.net"> <img src="http://files.novoj.net/Reklama/fg_banner_kariera_250x250_v01.gif" width="200" height="200"> </a> </div></div> </li><li id="wpmp_barcode_widget" class="widget wpmp_barcode_widget"><h2 class="widget-title">Zobrazit na mobilu</h2><img width='250' height='250' src='http://chart.apis.google.com/chart?chs=250x250&cht=qr&choe=UTF-8&chl=http%3A%2F%2Fblog.novoj.net%2F2008%2F04%2F11%2Fpermgenspace-problem-no-problem%2F' alt='QR Code - scan to visit our mobile site' /></li><li id="text-4" class="widget widget_text"><h2 class="widget-title">Moje vývěska</h2> <div class="textwidget"><a href="http://www.jetbrains.com/devnet/academy/experts/index.html" target="_new" title="JetBrains Academy"><img src="http://files.novoj.net/JetBrains/Member.gif" alt="JetBrains Academy Member" style="width: 70px; float: right; margin-right: 15px;"></a> <strong>Tento blog čte:</strong> <br/> <a href="http://feeds.feedburner.com/myslenkyDneOtceFura"><img src="http://feeds.feedburner.com/~fc/myslenkyDneOtceFura?bg=003399&fg=cfebf7&anim=0&label=ctenaru" height="26" width="88" style="border:0" alt="" /></a> <br/> <strong>Můj profil:</strong> <br/> <a href="http://www.linkedin.com/in/jannovotny" ><img src="http://www.linkedin.com/img/webpromo/btn_viewmy_120x33.gif" width="120" height="33" border="0" alt="View Jan Novotny's profile on LinkedIn"></a> <div style="text-align: center"> <a href="http://www.webarchiv.cz/files/vydavatele/certifikat.html" onclick="return !window.open(this, 'kod', 'toolbar=no, menubar=no, directories=no, resizable=yes, status=no, width=600, height=210, top=200, left=50')"><img title="STRÁNKY ARCHIVOVÁNY NÁRODNÍ KNIHOVNOU ČR" style="border:none; margin-top: 10px;" oncontextmenu="return false" src="http://files.novoj.net/webarchiv_certifikat_cb_inverse.gif"></a> </div> <div style="margin-top: 10px;"> <a href="http://www.jetbrains.com/idea/features/ajax.html?261008_45837" style="display:block; background:#0d3a9e url(http://www.jetbrains.com/idea/opensource/img/all/banners/idea210x60_blue.gif) no-repeat 0 0; border:solid 1px #0d3a9e; margin-bottom:10px;margin-top:10px;padding:0;text-decoration:none;text-indent:0;letter-spacing:-0.001em; width:200px; height:58px" alt="IDE for professional JavaScript development with AJAX ready refactorings" title="IDE for professional JavaScript development with AJAX ready refactorings"><span style="margin: -3px 0 0 42px;padding: 0;float: left;font-size: 10px;cursor:pointer; background-image:none;border:0;color: #acc4f9; font-family: trebuchet ms,arial,sans-serif;font-weight: normal;">Passionate about</span><span style="margin:33px 0 0 5px;padding:0 0 2px 0; line-height:11px;font-size:9px;word-spacing:-2;cursor:pointer; background-image:none;border:0;display:block;width:210px; color:#acc4f9; font-family:tahoma,arial,sans-serif;font-weight: normal;">IDE for professional JavaScript <br/>development with AJAX ready refactorings</span></a> <a href="http://petition.stopsoftwarepatents.eu/341003375901/"><img src="http://petition.stopsoftwarepatents.eu/banner/341003375901/ssp-181-30.gif" alt="stopsoftwarepatents.eu petition banner" width="181" height="30" /></a> </div></div> </li><li id="linkcat-9" class="widget widget_links"><h2 class="widget-title">Odkazy</h2> <ul class='xoxo blogroll'> <li><a href="http://www.fg.cz" title="Web stránky mého zaměstnavatele. Pokud jste kvalitní java programátor, webdesigner nebo grafik, jukněte tam. Stále hledáme.">FG Forrest</a></li> <li><a href="http://flavors.me/novoj" rel="me" target="_blank">Flavors.me</a></li> <li><a href="http://zivotopis.novoj.net" title="Můj profesní životopis, třebas se bude někomu hodit pro inspiraci, třeba někdo o mě bude chtít vědět víc.">Profesní životopis</a></li> <li><a href="http://www.sermirna.cz" rel="me" title="Pardubický šermířský spolek">Šermírna</a></li> <li><a href="http://rabidus.sweb.cz" rel="friend" title="Stránky mé šermířské rodiny." target="_blank">SHŠ Rabidus</a></li> </ul> </li> <li id="linkcat-13" class="widget widget_links"><h2 class="widget-title">Podcasty</h2> <ul class='xoxo blogroll'> <li><a href="http://www.java.cz/detail.do?articleId=2706" title="Český občasník – velmi zábavný ale velmi nepravidelný">CZ Podcast</a></li> <li><a href="http://www.freakonomics.com/" target="_blank">Freakonomics</a></li> <li><a href="http://javaposse.com" title="Kdo nesleduje JavaPosse, jako by nežil ;)">JavaPosse</a></li> <li><a href="http://www.se-radio.net" title="Podcast od německých sousedů">Software Radio Engeneering</a></li> </ul> </li> <li id="linkcat-14" class="widget widget_links"><h2 class="widget-title">Portály</h2> <ul class='xoxo blogroll'> <li><a href="http://www.infoq.com/" title="Tracking change and innovation in the enterprise software development community">InfoQ</a></li> <li><a href="http://java-source.net" title="Knihovna open source projektů v Javě">Java Open Source</a></li> <li><a href="http://www.java.cz" title="Centrální místo pro české Java developery.">Java.cz</a></li> <li><a href="http://www.onjava.com/" title="The Independent Source for Enterprise Java">OnJava</a></li> <li><a href="http://www.theserverside.com/">The Server Side</a></li> </ul> </li> <li id="linkcat-12" class="widget widget_links"><h2 class="widget-title">Sledované blogy</h2> <ul class='xoxo blogroll'> <li><a href="http://javicka.blogspot.com" title="Spring framework, Acegi security, Spring modules, Hibernate, J2EE a vše co souvisí s Javou">Blog o Javičce</a></li> <li><a href="http://dagblog.cz" title="Dagiho blog, co dodat, všichni ho znáte …">DagBlog</a></li> <li><a href="http://blog.krecan.net" title="Na blogu najdete velmi kvalitní postřehy ze světa Javy.">Java drobečky</a></li> <li><a href="http://blog.lukas-vlcek.com/" title="Zajímavý blog v angličtině.">Lukáš Vlček</a></li> <li><a href="http://www.jirifabian.net/" title="Filemon’s stream">Rubicon</a></li> <li><a href="http://blog.softeu.cz" title="Blog jedné progresivní jihočeské firmy">SoftEu</a></li> <li><a href="http://blog.pecka.name/" rel="co-worker colleague" title="Blog (nejen) o webových technologiích">Všeho s Mírou</a></li> </ul> </li> <li id="text-3" class="widget widget_text"><h2 class="widget-title">Licence</h2> <div class="textwidget"><a rel="license" href="http://creativecommons.org/licenses/by/3.0/"><img alt="Licence Creative Commons" style="border-width:0; float: left; margin-right: 1em; margin-bottom: 0.25em;" src="http://i.creativecommons.org/l/by/3.0/88x31.png" /></a><span xmlns:dct="http://purl.org/dc/terms/" href="http://purl.org/dc/dcmitype/Text" property="dct:title" rel="dct:type">Články z blogu Myšlenky dne Otce Fura</span>, jejímž autorem je <a xmlns:cc="http://creativecommons.org/ns#" href="http://zivotopis.novoj.net" property="cc:attributionName" rel="cc:attributionURL">Ing. Jan Novotný</a>, podléhá licenci <a rel="license" href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Uveďte autora 3.0 Unported </a>. <br /><br />Vytvořeno na základě tohoto díla: <a xmlns:dct="http://purl.org/dc/terms/" href="http://blog.novoj.net" rel="dct:source">blog.novoj.net</a></div> </li> </ul><!-- end sidebar --> </div><!-- end container --> <nav id="menu" role="navigation"> <div style="text-align: center"> <script type="text/javascript"><!-- google_ad_client = "ca-pub-0975150510693753"; /* Dolní široký banner */ google_ad_slot = "1971989063"; google_ad_width = 728; google_ad_height = 90; //--> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> </div> </nav> </div><!-- end page-wrap --> <footer id="colophon" role="contentinfo"> <div id="site-generator"> <a href="http://wordpress.org/" rel="generator">Proudly powered by WordPress</a> Šablona: Parament od <a href="http://automattic.com/" rel="designer">Automattic</a>. </div> </footer> <script type='text/javascript'> /* <![CDATA[ */ var ratingsL10n = { plugin_url: "http://blog.novoj.net/wp-content/plugins/wp-postratings", ajax_url: "http://blog.novoj.net/wp-content/plugins/wp-postratings/wp-postratings.php", text_wait: "Please rate only 1 post at a time.", image: "stars", image_ext: "gif", max: "5", show_loading: "1", show_fading: "1", custom: "0" }; var ratings_mouseover_image=new Image();ratings_mouseover_image.src=ratingsL10n.plugin_url+"/images/"+ratingsL10n.image+"/rating_over."+ratingsL10n.image_ext; /* ]]> */ </script> <p class="footer-link" style="font-size:75%;text-align:center;"><a href="http://wott.info/">With Picasa plugin by Wott</a></p> <!-- tracker added by Ultimate Google Analytics plugin v1.6.0: http://www.oratransplant.nl/uga --> <script type="text/javascript"> var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); </script> <script type="text/javascript"> var pageTracker = _gat._getTracker("UA-3197117-1"); pageTracker._initData(); pageTracker._trackPageview(); </script> <p class='mobile_switcher'><a onclick='document.cookie="wpmp_switcher=mobile;path=/;expires=Tue, 01-01-2030 00:00:00 GMT";' href='http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/?wpmp_switcher=mobile'>Přepnout do mobilního zobrazení</a></p> <script type="text/javascript"> window.___gcfg = {lang: 'cs'}; (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })(); </script> <!-- TPC! Memory Usage (http://webjawns.com) Memory Usage: 27381356 Memory Peak Usage: 27535460 WP Memory Limit: 32M PHP Memory Limit: 128M Checkpoints: 11 --> <script type='text/javascript' src='http://s.gravatar.com/js/gprofiles.js?aa&ver=3.2.1'></script> <script type='text/javascript'> /* <![CDATA[ */ var WPGroHo = { my_hash: "" }; /* ]]> */ </script> <div style="display:none"> <div class="grofile-hash-map-238e8b2100a5366b226234b946026462"> </div> <div class="grofile-hash-map-bb3d126e35e9246d2f62515e44f41fe7"> </div> <div class="grofile-hash-map-9944c53b99bfbadc91251c0ae218a911"> </div> <div class="grofile-hash-map-8587551597c1a635cc17ad91c965ac11"> </div> <div class="grofile-hash-map-2cd9de8d95507b300cacd68f88929bbc"> </div> <div class="grofile-hash-map-e2b40632e8f103bdde2f9afda573adba"> </div> </div> <script type="text/javascript" charset="utf-8"> function sharing_plusone( obj ) { jQuery.ajax( { url: 'http://blog.novoj.net/2008/04/11/permgenspace-problem-no-problem/?share=google-plus-1', type: 'POST', data: obj } ); } </script> <script type="text/javascript" src="http://apis.google.com/js/plusone.js"></script> <div id="sharing_email" style="display: none;"> <form action="" method="post"> <label for="target_email">Send to Email Address</label> <input type="text" name="target_email" id="target_email" value="" /> <label for="source_name">Your Name</label> <input type="text" name="source_name" id="source_name" value="" /> <label for="source_email">Your Email Address</label> <input type="text" name="source_email" id="source_email" value="" /> <img style="float: right; display: none" class="loading" src="http://blog.novoj.net/wp-content/plugins/jetpack/modules/sharedaddy/images/loading.gif" alt="loading" width="16" height="16" /> <input type="submit" value="Send Email" class="sharing_send" /> <a href="#cancel" class="sharing_cancel">Cancel</a> <div class="errors errors-1" style="display: none;"> Post was not sent - check your email addresses! </div> <div class="errors errors-2" style="display: none;"> Email check failed, please try again </div> <div class="errors errors-3" style="display: none;"> Sorry, your blog cannot share posts by email. </div> </form> </div> <script type='text/javascript'> (function(){ var corecss = document.createElement('link'); var themecss = document.createElement('link'); var corecssurl = "http://blog.novoj.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shCore.css?ver=3.0.83c"; if ( corecss.setAttribute ) { corecss.setAttribute( "rel", "stylesheet" ); corecss.setAttribute( "type", "text/css" ); corecss.setAttribute( "href", corecssurl ); } else { corecss.rel = "stylesheet"; corecss.href = corecssurl; } document.getElementsByTagName("head")[0].insertBefore( corecss, document.getElementById("syntaxhighlighteranchor") ); var themecssurl = "http://blog.novoj.net/wp-content/plugins/syntaxhighlighter/syntaxhighlighter3/styles/shThemeMidnight.css?ver=3.0.83c"; if ( themecss.setAttribute ) { themecss.setAttribute( "rel", "stylesheet" ); themecss.setAttribute( "type", "text/css" ); themecss.setAttribute( "href", themecssurl ); } else { themecss.rel = "stylesheet"; themecss.href = themecssurl; } //document.getElementById("syntaxhighlighteranchor").appendChild(themecss); document.getElementsByTagName("head")[0].insertBefore( themecss, document.getElementById("syntaxhighlighteranchor") ); })(); SyntaxHighlighter.config.strings.expandSource = '+ expand source'; SyntaxHighlighter.config.strings.help = '?'; SyntaxHighlighter.config.strings.alert = 'SyntaxHighlighter\n\n'; SyntaxHighlighter.config.strings.noBrush = 'Can\'t find brush for: '; SyntaxHighlighter.config.strings.brushNotHtmlScript = 'Brush wasn\'t configured for html-script option: '; SyntaxHighlighter.defaults['pad-line-numbers'] = false; SyntaxHighlighter.all(); </script> <script src="http://stats.wordpress.com/e-201205.js" type="text/javascript"></script> <script type="text/javascript"> st_go({v:'ext',j:'1:1.2.2',blog:'1473927',post:'63'}); var load_cmc = function(){linktracker_init(1473927,63,2);}; if ( typeof addLoadEvent != 'undefined' ) addLoadEvent(load_cmc); else load_cmc(); </script> </body> </html> <!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/ Minified using disk: basic Page Caching using disk: enhanced Served from: blog.novoj.net @ 2012-02-04 23:19:05 -->