Re: java.lang.OutOfMemoryError: unable to create new native thread

2012-04-13 Tema obsahu Jaroslav Hurdes
-Xss znamená velikost zásobníku pro každý thread, pokud jej příliš 
snížíte, tak riskujete SctackOverflowException, pokud tento parametr 
zvednete, tak omezíte maximální počet threadu, které jste schopen 
využít. V mém případě, kdy je maximální počet spuštěných threadů cca 40 
je to jedno, jelikož snižování velikosti Xss má význam až od tisíců 
thready v rámci jedné JVM. Mne by nepřekvapilo, kdyby aplikace spadla na 
OutOfMemory z nedostatku heap, ale zrovna v případě procesů to prostě 
nechápu.


Jaroslav Hurdes

Dne 13.4.2012 9:00, arsi napsal(a):

Hi,

Treba nastavit

-Xsssizeset java thread stack size

Nema v zasobniku pre thready dost miesta...

Arsi

On 04/13/2012 07:12 AM, kek forums wrote:

Zdravím,

- k tomu statickému snímku z JConsole by asi bylo dobré ještě zaslat 
snímek s grafy, kde bude vidět vývoj chování aplikace v čase, třeba 
tam je nějaký peak, který to položí na lopatky, protože tady z těch 
statistik to vypadá v pohodě.


- nastavil bych tomu JVMku  -/XX/:+HeapDumpOnOutOfMemoryError  - a 
výsledný dump analyzoval nějakým nástrojem, jako 
http://www.eclipse.org/mat/


- jak již bylo napsáno - nevytvářel bych vlákna nekontrolovaně, ale 
raději bych volil nějaký ThreadPool, tak aby se počet vláken dal 
limitovat a navíc se zásadně snížila režie spojená s vytvářením 
vláken  - např.: 
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html


- navyšování různých parametrů Xmx, Xms, Xss, permGen - je sice 
možné, ale dělám to vždy až potom, co detekuji v čem je problém - 
protože v 80% případů je problém v aplikaci a tato navýšení řeší 
následky, nikoliv příčinu problému, ale především často jen pád 
oddálí, ale nic neřeší :). Doporučoval bych nastudovat nějaké 
materiály kolem rozložení paměti, jako například 
http://avricot.com/blog/index.php?post/2010/05/03/Get-started-with-java-JVM-memory-(heap%2C-stack%2C-xss-xms-xmx-xmn...) 
http://avricot.com/blog/index.php?post/2010/05/03/Get-started-with-java-JVM-memory-%28heap%2C-stack%2C-xss-xms-xmx-xmn...%29


 - pak člověk zjistí, že zvyšování HEAPu je naopak 
kotraproduktivní, protože Thread Stack  se alokuje mimo tuto oblast. 
Takže naopak je lepší ten Xmx limit snížit, aby zbylo více na ta 
vlákna opět v souvislosti s XSS.   Jinak tato oblast paměti je 
používána i pro JNI, GC, atd.  Ale jak koukám, vaše XSS je pro peak 
31 vláken asi taky v pohodě.


 - a když z toho všeho nic nepomůže - tak klasika - začít ořezávat 
aplikaci v testech a izolovat, kde je problém  - tady bych udělal 
mock na to JNI - JNI vyhodil a zkusil, zda to pomůže  - třeba si v 
rámci JNI alokujete nějaké velké množství paměti, které vám sebere 
prostor pro ta vlákna.



Dne 13. dubna 2012 0:15 re...@centrum.cz mailto:re...@centrum.cz 
napsal(a):


Ahoj,

podle mě by mělo stačit zvednout -Xmx1024M třeba na Xmx2048m. Jinak

12 GB RAM je ti pro 32 bitovou javu k nicemu, neboť velikost
heapu je omezena.

A to se častečně liší podle systému.


Radek

*
*

__
 Od: Jaroslav Hurdes j...@ataco.cz mailto:j...@ataco.cz
 Komu: konference@java.cz mailto:konference@java.cz
 Datum: 12.04.2012 22:35
 Předmět: Re: java.lang.OutOfMemoryError: unable to create new
native thread


Systém má k dispozici 12 GB RAM. Využití paměti je na cca 33% CPU
20%
Procesu cca 70, Threadu cca 5000 na cely OS, takže docela v pohodě.

Jaroslav Hurdes

Dne 12.4.2012 20:59, Peter Hanuliak napsal(a):
 skusali ste pozriet ako vyzeraju zdroje windows systemu? ako on
vyzera
 s threadmi? pamatou a pod?


 2012/4/12 Roman Pichlíkroman.pich...@gmail.com
mailto:roman.pich...@gmail.com:
 hmm je uz to opravdu jenom strelba od boku, co zkusit nastavit
PermSpace?

 2012/4/12 Jaroslav Hurdesj...@ataco.cz mailto:j...@ataco.cz:
 Ne, tato třída nemá s JNI nic společného. Je to jednoduchý
server, který na
 požádání vytvoří thread, obslouží požadavek a ukonči se. Tato
třída má na
 svědomí ten celkový počet spuštěných threadu, které ale žijí
jen velmi
 krátce (klient se zeptá na stav aplikace a po odeslání zprávy
je thread
 ukončen). Jaroslav Hurdes

 Dne 12.4.2012 20:13, Roman Pichlík napsal(a):

 Vola se to JNI v ramci CommandClientsManager$Client.start?

 2012/4/12 Jaroslav Hurdesj...@ataco.cz mailto:j...@ataco.cz:
 Vláken je spuštěno pouze 26, viz výpis z dokumentace k jconsole

 Threads

 Live threads: Current number of live daemon threads plus
non-daemon
 threads
 Peak: Highest number of live threads since JVM started.
 Daemon threads: Current number of live daemon threads
 Total started: Total number of threads started since JVM
started
 (including
 daemon, non-daemon, and terminated).


 DLL je volána přes JNI a nemělo by tam vzniknout souběžně
více vláken
 

Re: java.lang.OutOfMemoryError: unable to create new native thread

2012-04-13 Tema obsahu Jiří Zůna
Zdravim,
Na vasem popisu situace me zaujalo max. 12GB pameti a 33%-ni vuziti (takze
+- 4GB obsazene pameti).
A ted moje silena domnenka:
Java je pouze 32bit proces, tudiz dal nez za 4GB nevidi a pamet pro stack
se alokuje mimo heapu (a samozrejme i mimo permgen). Myslim si, ze pro javu
se v tech jejich ctyrech gigabajtech uz nenajde misto pro novy stack pro
nove vlakno (muze tam byt os, dalsi programy, ...) a tak skonci s  OOM,
idkyz je vlastne 66% pameti nevyuzite.
Jestli to ale skutecne tak muze byt, si nejsem jisty.

Hodne zdaru,
:J

On Thursday, April 12, 2012, Jaroslav Hurdes wrote:

 Systém má k dispozici 12 GB RAM. Využití paměti je na cca 33% CPU 20%
 Procesu cca 70, Threadu cca 5000 na cely OS, takže docela v pohodě.

 Jaroslav Hurdes

 Dne 12.4.2012 20:59, Peter Hanuliak napsal(a):

 skusali ste pozriet ako vyzeraju zdroje windows systemu? ako on vyzera
 s threadmi? pamatou a pod?


 2012/4/12 Roman Pichlíkroman.pich...@gmail.com:

 hmm je uz to opravdu jenom strelba od boku, co zkusit nastavit PermSpace?

 2012/4/12 Jaroslav Hurdesj...@ataco.cz:

 Ne, tato třída nemá s JNI nic společného. Je to jednoduchý server, který na
 požádání vytvoří thread, obslouží požadavek a ukonči se. Tato třída má na
 svědomí ten celkový počet spuštěných threadu, které ale žijí jen velmi
 krátce (klient se zeptá na stav aplikace a po odeslání zprávy je thread
 ukončen). Jaroslav Hurdes

 Dne 12.4.2012 20:13, Roman Pichlík napsal(a):

  Vola se to JNI v ramci CommandClientsManager$Client.**start?

 2012/4/12 Jaroslav Hurdesj...@ataco.cz:

 Vláken je spuštěno pouze 26, viz výpis z dokumentace k jconsole

 Threads

 Live threads: Current number of live daemon threads plus non-daemon
 threads
 Peak: Highest number of live threads since JVM started.
 Daemon threads: Current number of live daemon threads
 Total started: Total number of threads started since JVM started
 (including
 daemon, non-daemon, and terminated).


 DLL je volána přes JNI a nemělo by tam vzniknout souběžně více vláken
 (získávání obrazu z frame grabberu).

 Jaroslav Hurdes

 Dne 12.4.2012 19:26, Roman Pichlík napsal(a):

 To je pocet celkove vytvorenych vlaken po dobu behu, nikoliv zivych,
 tech je tam relativne malo, 67 pokud dobre pocitam.

 2012/4/12 Martin Caslavskymartin-l...@geek.cz:

 Máte 2.500 vláken a další už nejde vytvořit... První odkaz v Google
 popisuje tenhle problém:

 http://stackoverflow.com/**questions/763579/how-many-**
 threads-can-a-java-vm-supporthttp://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-support

  Martin Caslavsky



 On 12 April 2012 18:08, Jaroslav Hurdesj...@ataco.czwrote:

 Zdravím, bojuji s vyjímkou, která nastává v mé aplikaci a nedaří se mi
 objevit příčinu. Vyjímka je následující:

 Exception in thread Thread-6 java.lang.OutOfMemoryError: unable to
 create
 new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.**java:640)
at

 cz.nitta.licenceplate.server.**business.communicator.**
 CommandClientsManager$Client.**start(CommandClientsManager.**java:357)
at

 cz.nitta.licenceplate.server.**business.communicator.**
 CommandClientsManager.**addClient(**CommandClientsManager.java:**118)
at

 cz.nitta.licenceplate.server.**business.communicator.**
 ClientsGatekeeper.addClient(**ClientsGatekeeper.java:196)
at

 cz.nitta.licenceplate.server.**business.communicator.**ClientsGatekeeper.*
 *acceptClient(**ClientsGatekeeper.java:140)
at

 cz.nitta.licenceplate.server.**business.communicator.**
 ClientsGatekeeper.run(**ClientsGatekeeper.java:213)
at java.lang.Thread.run(Thread.**java:662)

 Prostředí je popsáno níže. V příloze je obrazovka z jconsole, kde je
 zobrazen počet threadu i stav paměti. Nesetkal se někdo s něčím podobným
 a
 nenašel řešení? Zkouším laborovat s různými parametry, ale zatím nic. 32
 bit
 javu používám z důvodu nutnosti použít 32 bit dll. Díky. Jaroslav Hurdes

 OS Windows 7, x64

 Verze javy (32 bit)
 java version 1.6.0_31
 Java(TM) SE Runtime Environment (build 1.6.0_31-b05)
 Java HotSpot(TM) Client VM (build 20.6-b01, mixed mode, sharing)

 spouštění aplikace:
 java -XX:ThreadStackSize=256 -Xss256k -XX:ReservedCodeCacheSize=64m
 -Dcom.sun.management.jmxremote -Dcom.sun.management.**jmxremote.port=9001
 -Dcom.sun.management.**jmxremote.authenticate=false
 -Dcom.sun.management.**jmxremote.ssl=false -server -Xcheck:jni -Xmx1024M
 -Djava.library.path=..\common\**lib\native -jar nitta-lp-rec-srv.jar ./cfg
 %*








 --
 S pozdravem Roman Dagi Pichlik

 /* http://dagblog.cz/



-- 
:J


Re: java.lang.OutOfMemoryError: unable to create new native thread

2012-04-13 Tema obsahu Dusan Msk
Ahoj,

ano, 32bit java nenaadresuje viac ako 4G. Ja som ale pochopil, ze sa k
tomuto limitu jvm este nepriblizila,
alebo ano? Co je vidiet v process table ( alebo ako sa to na windows nazyva )?

--
Dusan


Dňa 13. apríla 2012 11:03, Jiří Zůna j...@zunovi.cz napísal/a:
 Zdravim,
 Na vasem popisu situace me zaujalo max. 12GB pameti a 33%-ni vuziti (takze
 +- 4GB obsazene pameti).
 A ted moje silena domnenka:
 Java je pouze 32bit proces, tudiz dal nez za 4GB nevidi a pamet pro stack se
 alokuje mimo heapu (a samozrejme i mimo permgen). Myslim si, ze pro javu se
 v tech jejich ctyrech gigabajtech uz nenajde misto pro novy stack pro nove
 vlakno (muze tam byt os, dalsi programy, ...) a tak skonci s  OOM, idkyz je
 vlastne 66% pameti nevyuzite.
 Jestli to ale skutecne tak muze byt, si nejsem jisty.

 Hodne zdaru,
 :J

 On Thursday, April 12, 2012, Jaroslav Hurdes wrote:

 Systém má k dispozici 12 GB RAM. Využití paměti je na cca 33% CPU 20%
 Procesu cca 70, Threadu cca 5000 na cely OS, takže docela v pohodě.

 Jaroslav Hurdes

 Dne 12.4.2012 20:59, Peter Hanuliak napsal(a):

 skusali ste pozriet ako vyzeraju zdroje windows systemu? ako on vyzera
 s threadmi? pamatou a pod?


 2012/4/12 Roman Pichlíkroman.pich...@gmail.com:

 hmm je uz to opravdu jenom strelba od boku, co zkusit nastavit PermSpace?

 2012/4/12 Jaroslav Hurdesj...@ataco.cz:

 Ne, tato třída nemá s JNI nic společného. Je to jednoduchý server, který
 na
 požádání vytvoří thread, obslouží požadavek a ukonči se. Tato třída má na
 svědomí ten celkový počet spuštěných threadu, které ale žijí jen velmi
 krátce (klient se zeptá na stav aplikace a po odeslání zprávy je thread
 ukončen). Jaroslav Hurdes

 Dne 12.4.2012 20:13, Roman Pichlík napsal(a):

 Vola se to JNI v ramci CommandClientsManager$Client.start?

 2012/4/12 Jaroslav Hurdesj...@ataco.cz:

 Vláken je spuštěno pouze 26, viz výpis z dokumentace k jconsole

 Threads

 Live threads: Current number of live daemon threads plus non-daemon
 threads
 Peak: Highest number of live threads since JVM started.
 Daemon threads: Current number of live daemon threads
 Total started: Total number of threads started since JVM started
 (including
 daemon, non-daemon, and terminated).


 DLL je volána přes JNI a nemělo by tam vzniknout souběžně více vláken
 (získávání obrazu z frame grabberu).

 Jaroslav Hurdes

 Dne 12.4.2012 19:26, Roman Pichlík napsal(a):

 To je pocet celkove vytvorenych vlaken po dobu behu, nikoliv zivych,
 tech je tam relativne malo, 67 pokud dobre pocitam.

 2012/4/12 Martin Caslavskymartin-l...@geek.cz:

 Máte 2.500 vláken a další už nejde vytvořit... První odkaz v Google
 popisuje tenhle problém:


 http://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-support

                          Martin Caslavsky



 On 12 April 2012 18:08, Jaroslav Hurdesj...@ataco.cz    wrote:

 Zdravím, bojuji s vyjímkou, která nastává v mé aplikaci a nedaří se mi
 objevit příčinu. Vyjímka je následující:

 Exception in thread Thread-6 java.lang.OutOfMemoryError: unable to
 create
 new native thread
    at java.lang.Thread.start0(Native Method)
    at java.lang.Thread.start(Thread.java:640)
    at


 cz.nitta.licenceplate.server.business.communicator.CommandClientsManager$Client.start(CommandClientsManager.java:357)
    at


 cz.nitta.licenceplate.server.business.communicator.CommandClientsManager.addClient(CommandClientsManager.java:118)
    at


 cz.nitta.licenceplate.server.business.communicator.ClientsGatekeeper.addClient(ClientsGatekeeper.java:196)
    at


 cz.nitta.licenceplate.server.business.communicator.ClientsGatekeeper.acceptClient(ClientsGatekeeper.java:140)
    at


 cz.nitta.licenceplate.server.business.communicator.ClientsGatekeeper.run(ClientsGatekeeper.java:213)
    at java.lang.Thread.run(Thread.java:662)

 Prostředí je popsáno níže. V příloze je obrazovka z jconsole, kde je
 zobrazen počet threadu i stav paměti. Nesetkal se někdo s něčím podobným
 a
 nenašel řešení? Zkouším laborovat s různými parametry, ale zatím nic. 32
 bit
 javu používám z důvodu nutnosti použít 32 bit dll. Díky. Jaroslav Hurdes

 OS Windows 7, x64

 Verze javy (32 bit)
 java version 1.6.0_31
 Java(TM) SE Runtime Environment (build 1.6.0_31-b05)
 Java HotSpot(TM) Client VM (build 20.6-b01, mixed mode, sharing)

 spouštění aplikace:
 java -XX:ThreadStackSize=256 -Xss256k -XX:ReservedCodeCacheSize=64m
 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9001
 -Dcom.sun.management.jmxremote.authenticate=false
 -Dcom.sun.management.jmxremote.ssl=false -server -Xcheck:jni -Xmx1024M
 -Djava.library.path=..\common\lib\native -jar nitta-lp-rec-srv.jar ./cfg
 %*








 --
 S pozdravem Roman Dagi Pichlik

 /*



 --
 :J


Re: java.lang.OutOfMemoryError: unable to create new native thread

2012-04-13 Tema obsahu Jaroslav Hurdes
To je v pořádku, nepsal jsem, že daná aplikace je jediná na PC, Ve 
skutečnosti je tam daná aplikace spuštěna několikrát (zpracováni obrazu 
z více kamer, v tomto konkrétním případě 2x) + databáze + AS JBoss + OS 
a další programy. Jedna instance problematické aplikace má nastaveno Xmx 
na 1024m.


Jaroslav Hurdes

Dne 13.4.2012 11:03, Jiří Zůna napsal(a):

Zdravim,
Na vasem popisu situace me zaujalo max. 12GB pameti a 33%-ni vuziti 
(takze +- 4GB obsazene pameti).

A ted moje silena domnenka:
Java je pouze 32bit proces, tudiz dal nez za 4GB nevidi a pamet pro 
stack se alokuje mimo heapu (a samozrejme i mimo permgen). Myslim si, 
ze pro javu se v tech jejich ctyrech gigabajtech uz nenajde misto pro 
novy stack pro nove vlakno (muze tam byt os, dalsi programy, ...) a 
tak skonci s  OOM, idkyz je vlastne 66% pameti nevyuzite.

Jestli to ale skutecne tak muze byt, si nejsem jisty.

Hodne zdaru,
:J

On Thursday, April 12, 2012, Jaroslav Hurdes wrote:

Systém má k dispozici 12 GB RAM. Využití paměti je na cca 33% CPU
20% Procesu cca 70, Threadu cca 5000 na cely OS, takže docela v
pohodě.

Jaroslav Hurdes

Dne 12.4.2012 20:59, Peter Hanuliak napsal(a):

skusali ste pozriet ako vyzeraju zdroje windows systemu? ako
on vyzera
s threadmi? pamatou a pod?


2012/4/12 Roman Pichlíkroman.pich...@gmail.com:

hmm je uz to opravdu jenom strelba od boku, co zkusit
nastavit PermSpace?

2012/4/12 Jaroslav Hurdesj...@ataco.cz:

Ne, tato třída nemá s JNI nic společného. Je to
jednoduchý server, který na
požádání vytvoří thread, obslouží požadavek a ukonči
se. Tato třída má na
svědomí ten celkový počet spuštěných threadu, které
ale žijí jen velmi
krátce (klient se zeptá na stav aplikace a po odeslání
zprávy je thread
ukončen). Jaroslav Hurdes

Dne 12.4.2012 20:13, Roman Pichlík napsal(a):

Vola se to JNI v ramci
CommandClientsManager$Client.start?

2012/4/12 Jaroslav Hurdesj...@ataco.cz:

Vláken je spuštěno pouze 26, viz výpis z
dokumentace k jconsole

Threads

Live threads: Current number of live daemon
threads plus non-daemon
threads
Peak: Highest number of live threads since JVM
started.
Daemon threads: Current number of live daemon
threads
Total started: Total number of threads started
since JVM started
(including
daemon, non-daemon, and terminated).


DLL je volána přes JNI a nemělo by tam
vzniknout souběžně více vláken
(získávání obrazu z frame grabberu).

Jaroslav Hurdes

Dne 12.4.2012 19:26, Roman Pichlík napsal(a):

To je pocet celkove vytvorenych vlaken po dobu
behu, nikoliv zivych,
tech je tam relativne malo, 67 pokud dobre
pocitam.

2012/4/12 Martin Caslavskymartin-l...@geek.cz:

Máte 2.500 vláken a další už nejde vytvořit...
První odkaz v Google
popisuje tenhle problém:


http://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-support

 Martin Caslavsky



On 12 April 2012 18:08, Jaroslav
Hurdesj...@ataco.czwrote:

Zdravím, bojuji s vyjímkou, která nastává v mé
aplikaci a nedaří se mi
objevit příčinu. Vyjímka je následující:

Exception in thread Thread-6
java.lang.OutOfMemoryError: unable to
create
new native thread
   at java.lang.Thread.start0(Native Method)
   at java.lang.Thread.start(Thread.java:640)
   at


cz.nitta.licenceplate.server.business.communicator.CommandClientsManager$Client.start(CommandClientsManager.java:357)
   at


cz.nitta.licenceplate.server.business.communicator.CommandClientsManager.addClient(CommandClientsManager.java:118)
   at


cz.nitta.licenceplate.server.business.communicator.ClientsGatekeeper.addClient(ClientsGatekeeper.java:196)

Jak na vlákna v J2EE

2012-04-13 Tema obsahu Petr Franta
Chtěl jsem se zeptat na váš názor nebo zkušenost s prací ve vláknech J2EE
aplikací?
Četl jsem doporučení, že by se vlákna neměla v J2EE vytvářet resp., že jsou
doporučené metody jak to bezpečně dělat (pomocí různých implementací timerů
atd.).

Řeším problém, kdy vlákno (request) potřebuje udělat tři dotazy do třech
různých databází a ty sloučit do jednoho výsledku. Je velmi pomalé čekat na
doběh jednotlivých dotazů, které jsou na sobě nezávislé.
Navrhl jsem pro začátek něco takového viz. níže, ale nejsem si jist jestli
tam není nějaká záludnost:

/** definice pracovní třídy pro práci s DB (obsahuje vše potřebné k načtení
dat) */
public class DbWorker implements CallableResult {
  ...
}

/** voláno z requestu */
ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
ListFutureResult res = new ArrayListFutureInteger();

for (DbTask task : tasks) {
  // načtení dat
  res.add(executor.submit(new DbWorker(task, ...)));
}

// čekej na dokončení vláken

// Zpracování načtených dat
for (FutureInteger future : res) {
  System.out.println(future.get());
}

Petr


Re: Jak na vlákna v J2EE

2012-04-13 Tema obsahu Zdeněk Troníček
Ahoj,

dal bych prednost asynchronnim metodam v EJB 3.1.

Z.
-- 
Zdenek Tronicek
FIT CTU in Prague


Petr Franta napsal(a):
 Chtěl jsem se zeptat na váš názor nebo zkušenost s prací ve vláknech J2EE
 aplikací?
 Četl jsem doporučení, že by se vlákna neměla v J2EE vytvářet resp., že
 jsou
 doporučené metody jak to bezpečně dělat (pomocí různých implementací
 timerů
 atd.).

 Řeším problém, kdy vlákno (request) potřebuje udělat tři dotazy do třech
 různých databází a ty sloučit do jednoho výsledku. Je velmi pomalé čekat
 na
 doběh jednotlivých dotazů, které jsou na sobě nezávislé.
 Navrhl jsem pro začátek něco takového viz. níže, ale nejsem si jist jestli
 tam není nějaká záludnost:

 /** definice pracovní třídy pro práci s DB (obsahuje vše potřebné k
 načtení
 dat) */
 public class DbWorker implements CallableResult {
   ...
 }

 /** voláno z requestu */
 ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
 ListFutureResult res = new ArrayListFutureInteger();

 for (DbTask task : tasks) {
   // načtení dat
   res.add(executor.submit(new DbWorker(task, ...)));
 }

 // čekej na dokončení vláken

 // Zpracování načtených dat
 for (FutureInteger future : res) {
   System.out.println(future.get());
 }

 Petr




Re: Jak na vlákna v J2EE

2012-04-13 Tema obsahu Jiří Chaloupka
V J2EE se namísto toho využije aplikační server a pomocí message se pošle
pokyn k vykonání nějaké asynchronní operace.
Podívejte se třeba na
http://www.java2s.com/Code/Java/EJB3/EJBTutorialfromJBossdemoformessagedrivenbean.htm
Protože jste toto asi ještě nepoužil, ještě napovím, že zpráva může být
různých typů včetně java.lang.Object

Jirka Chaloupka

Dne 13. dubna 2012 14:33 Petr Franta petr.fra...@gmail.com napsal(a):

 Chtěl jsem se zeptat na váš názor nebo zkušenost s prací ve vláknech J2EE
 aplikací?
 Četl jsem doporučení, že by se vlákna neměla v J2EE vytvářet resp., že
 jsou doporučené metody jak to bezpečně dělat (pomocí různých implementací
 timerů atd.).

 Řeším problém, kdy vlákno (request) potřebuje udělat tři dotazy do třech
 různých databází a ty sloučit do jednoho výsledku. Je velmi pomalé čekat na
 doběh jednotlivých dotazů, které jsou na sobě nezávislé.
 Navrhl jsem pro začátek něco takového viz. níže, ale nejsem si jist jestli
 tam není nějaká záludnost:

 /** definice pracovní třídy pro práci s DB (obsahuje vše potřebné k
 načtení dat) */
 public class DbWorker implements CallableResult {
   ...
 }

 /** voláno z requestu */
 ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
 ListFutureResult res = new ArrayListFutureInteger();

 for (DbTask task : tasks) {
   // načtení dat
   res.add(executor.submit(new DbWorker(task, ...)));
 }

 // čekej na dokončení vláken

 // Zpracování načtených dat
 for (FutureInteger future : res) {
   System.out.println(future.get());
 }

 Petr



Re: Jak na vlákna v J2EE

2012-04-13 Tema obsahu Ondra Medek
No já myslím, že Petr bude ještě potřebovat nějakou synchronizaci až
se data načtou.

V Tvém případě v JEE prostředí můžeš použít vlákna, protože tvoje
metoda je vlastně synchronní, jen jistá část kódu se kvůli výkonu volá
asynchronně. Akorát v těch vláknech nemůžeš používat JEE věci, jako je
např. přístup k DB. Ale i tak by bylo pravděpodobně lepší použít
některý z navrhovných způsobů.

2012/4/13 Jiří Chaloupka k...@chalu.cz:
 V J2EE se namísto toho využije aplikační server a pomocí message se pošle
 pokyn k vykonání nějaké asynchronní operace.
 Podívejte se třeba na
 http://www.java2s.com/Code/Java/EJB3/EJBTutorialfromJBossdemoformessagedrivenbean.htm
 Protože jste toto asi ještě nepoužil, ještě napovím, že zpráva může být
 různých typů včetně java.lang.Object

 Jirka Chaloupka

 Dne 13. dubna 2012 14:33 Petr Franta petr.fra...@gmail.com napsal(a):

 Chtěl jsem se zeptat na váš názor nebo zkušenost s prací ve vláknech J2EE
 aplikací?
 Četl jsem doporučení, že by se vlákna neměla v J2EE vytvářet resp., že
 jsou doporučené metody jak to bezpečně dělat (pomocí různých implementací
 timerů atd.).

 Řeším problém, kdy vlákno (request) potřebuje udělat tři dotazy do třech
 různých databází a ty sloučit do jednoho výsledku. Je velmi pomalé čekat na
 doběh jednotlivých dotazů, které jsou na sobě nezávislé.
 Navrhl jsem pro začátek něco takového viz. níže, ale nejsem si jist jestli
 tam není nějaká záludnost:

 /** definice pracovní třídy pro práci s DB (obsahuje vše potřebné k
 načtení dat) */
 public class DbWorker implements CallableResult {
   ...
 }

 /** voláno z requestu */
 ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
 ListFutureResult res = new ArrayListFutureInteger();

 for (DbTask task : tasks) {
   // načtení dat
   res.add(executor.submit(new DbWorker(task, ...)));
 }

 // čekej na dokončení vláken

 // Zpracování načtených dat
 for (FutureInteger future : res) {
   System.out.println(future.get());
 }

 Petr





-- 
Ondra Medek


Re: java.lang.OutOfMemoryError: unable to create new native thread

2012-04-13 Tema obsahu Zdeněk Troníček
Ahoj,

pamet i celkovy pocet vlaken se mi zdaji v poradku. Podival bych se na
pocet otevrenych souboru. Nejsou tam nejake pracovni soubory?

Z.
-- 
Zdenek Tronicek
FIT CTU in Prague


Jaroslav Hurdes napsal(a):
 To je v pořádku, nepsal jsem, že daná aplikace je jediná na PC, Ve
 skutečnosti je tam daná aplikace spuštěna několikrát (zpracováni obrazu
 z více kamer, v tomto konkrétním případě 2x) + databáze + AS JBoss + OS
 a další programy. Jedna instance problematické aplikace má nastaveno Xmx
 na 1024m.

 Jaroslav Hurdes

 Dne 13.4.2012 11:03, Jiří Zůna napsal(a):
 Zdravim,
 Na vasem popisu situace me zaujalo max. 12GB pameti a 33%-ni vuziti
 (takze +- 4GB obsazene pameti).
 A ted moje silena domnenka:
 Java je pouze 32bit proces, tudiz dal nez za 4GB nevidi a pamet pro
 stack se alokuje mimo heapu (a samozrejme i mimo permgen). Myslim si,
 ze pro javu se v tech jejich ctyrech gigabajtech uz nenajde misto pro
 novy stack pro nove vlakno (muze tam byt os, dalsi programy, ...) a
 tak skonci s  OOM, idkyz je vlastne 66% pameti nevyuzite.
 Jestli to ale skutecne tak muze byt, si nejsem jisty.

 Hodne zdaru,
 :J

 On Thursday, April 12, 2012, Jaroslav Hurdes wrote:

 Systém má k dispozici 12 GB RAM. Využití paměti je na cca 33% CPU
 20% Procesu cca 70, Threadu cca 5000 na cely OS, takže docela v
 pohodě.

 Jaroslav Hurdes

 Dne 12.4.2012 20:59, Peter Hanuliak napsal(a):

 skusali ste pozriet ako vyzeraju zdroje windows systemu? ako
 on vyzera
 s threadmi? pamatou a pod?


 2012/4/12 Roman Pichlíkroman.pich...@gmail.com:

 hmm je uz to opravdu jenom strelba od boku, co zkusit
 nastavit PermSpace?

 2012/4/12 Jaroslav Hurdesj...@ataco.cz:

 Ne, tato třída nemá s JNI nic společného. Je to
 jednoduchý server, který na
 požádání vytvoří thread, obslouží požadavek a ukonči
 se. Tato třída má na
 svědomí ten celkový počet spuštěných threadu, které
 ale žijí jen velmi
 krátce (klient se zeptá na stav aplikace a po odeslání
 zprávy je thread
 ukončen). Jaroslav Hurdes

 Dne 12.4.2012 20:13, Roman Pichlík napsal(a):

 Vola se to JNI v ramci
 CommandClientsManager$Client.start?

 2012/4/12 Jaroslav Hurdesj...@ataco.cz:

 Vláken je spuštěno pouze 26, viz výpis z
 dokumentace k jconsole

 Threads

 Live threads: Current number of live daemon
 threads plus non-daemon
 threads
 Peak: Highest number of live threads since JVM
 started.
 Daemon threads: Current number of live daemon
 threads
 Total started: Total number of threads started
 since JVM started
 (including
 daemon, non-daemon, and terminated).


 DLL je volána přes JNI a nemělo by tam
 vzniknout souběžně více vláken
 (získávání obrazu z frame grabberu).

 Jaroslav Hurdes

 Dne 12.4.2012 19:26, Roman Pichlík napsal(a):

 To je pocet celkove vytvorenych vlaken po dobu
 behu, nikoliv zivych,
 tech je tam relativne malo, 67 pokud dobre
 pocitam.

 2012/4/12 Martin Caslavskymartin-l...@geek.cz:

 Máte 2.500 vláken a další už nejde vytvořit...
 První odkaz v Google
 popisuje tenhle problém:

 
 http://stackoverflow.com/questions/763579/how-many-threads-can-a-java-vm-support

  Martin Caslavsky



 On 12 April 2012 18:08, Jaroslav
 Hurdesj...@ataco.czwrote:

 Zdravím, bojuji s vyjímkou, která nastává v mé
 aplikaci a nedaří se mi
 objevit příčinu. Vyjímka je následující:

 Exception in thread Thread-6
 java.lang.OutOfMemoryError: unable to
 create
 new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:640)
at

 
 cz.nitta.licenceplate.server.business.communicator.CommandClientsManager$Client.start(CommandClientsManager.java:357)
at

 
 

Re: Jak na vlákna v J2EE

2012-04-13 Tema obsahu Ondra Medek
Jo a také použitím vláken ztrácíš trochu kontrolu nad aplikací. V JEE
si typicky nastavíš, že chces třeba max. 100 aktivních bean (100
vláken), ale jakmile si začneš tvořit vlákna sám, tak už žádný limit
udělat nemůžeš. Také proto by se ty vlákna něměly dělat, ale čistě
technicky to samozřejmě lze.

2012/4/13 Ondra Medek xmed...@gmail.com:
 No já myslím, že Petr bude ještě potřebovat nějakou synchronizaci až
 se data načtou.

 V Tvém případě v JEE prostředí můžeš použít vlákna, protože tvoje
 metoda je vlastně synchronní, jen jistá část kódu se kvůli výkonu volá
 asynchronně. Akorát v těch vláknech nemůžeš používat JEE věci, jako je
 např. přístup k DB. Ale i tak by bylo pravděpodobně lepší použít
 některý z navrhovných způsobů.

 2012/4/13 Jiří Chaloupka k...@chalu.cz:
 V J2EE se namísto toho využije aplikační server a pomocí message se pošle
 pokyn k vykonání nějaké asynchronní operace.
 Podívejte se třeba na
 http://www.java2s.com/Code/Java/EJB3/EJBTutorialfromJBossdemoformessagedrivenbean.htm
 Protože jste toto asi ještě nepoužil, ještě napovím, že zpráva může být
 různých typů včetně java.lang.Object

 Jirka Chaloupka

 Dne 13. dubna 2012 14:33 Petr Franta petr.fra...@gmail.com napsal(a):

 Chtěl jsem se zeptat na váš názor nebo zkušenost s prací ve vláknech J2EE
 aplikací?
 Četl jsem doporučení, že by se vlákna neměla v J2EE vytvářet resp., že
 jsou doporučené metody jak to bezpečně dělat (pomocí různých implementací
 timerů atd.).

 Řeším problém, kdy vlákno (request) potřebuje udělat tři dotazy do třech
 různých databází a ty sloučit do jednoho výsledku. Je velmi pomalé čekat na
 doběh jednotlivých dotazů, které jsou na sobě nezávislé.
 Navrhl jsem pro začátek něco takového viz. níže, ale nejsem si jist jestli
 tam není nějaká záludnost:

 /** definice pracovní třídy pro práci s DB (obsahuje vše potřebné k
 načtení dat) */
 public class DbWorker implements CallableResult {
   ...
 }

 /** voláno z requestu */
 ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
 ListFutureResult res = new ArrayListFutureInteger();

 for (DbTask task : tasks) {
   // načtení dat
   res.add(executor.submit(new DbWorker(task, ...)));
 }

 // čekej na dokončení vláken

 // Zpracování načtených dat
 for (FutureInteger future : res) {
   System.out.println(future.get());
 }

 Petr





 --
 Ondra Medek



-- 
Ondra Medek


Re: Jak na vlákna v J2EE

2012-04-13 Tema obsahu Jiří Chaloupka
Tu synchronizaci tam, kde potřebuji dělám tak, že mám informaci o nějakém
systémovém úkolu, jehož identifikátor posílám v message, a ve chvíli, kdy
se úkol dokončí, tak se k němu zapíše výsledek.

Jirka
2012/4/13 Ondra Medek xmed...@gmail.com

 No já myslím, že Petr bude ještě potřebovat nějakou synchronizaci až
 se data načtou.

 V Tvém případě v JEE prostředí můžeš použít vlákna, protože tvoje
 metoda je vlastně synchronní, jen jistá část kódu se kvůli výkonu volá
 asynchronně. Akorát v těch vláknech nemůžeš používat JEE věci, jako je
 např. přístup k DB. Ale i tak by bylo pravděpodobně lepší použít
 některý z navrhovných způsobů.

 2012/4/13 Jiří Chaloupka k...@chalu.cz:
  V J2EE se namísto toho využije aplikační server a pomocí message se pošle
  pokyn k vykonání nějaké asynchronní operace.
  Podívejte se třeba na
 
 http://www.java2s.com/Code/Java/EJB3/EJBTutorialfromJBossdemoformessagedrivenbean.htm
  Protože jste toto asi ještě nepoužil, ještě napovím, že zpráva může být
  různých typů včetně java.lang.Object
 
  Jirka Chaloupka
 
  Dne 13. dubna 2012 14:33 Petr Franta petr.fra...@gmail.com napsal(a):
 
  Chtěl jsem se zeptat na váš názor nebo zkušenost s prací ve vláknech
 J2EE
  aplikací?
  Četl jsem doporučení, že by se vlákna neměla v J2EE vytvářet resp., že
  jsou doporučené metody jak to bezpečně dělat (pomocí různých
 implementací
  timerů atd.).
 
  Řeším problém, kdy vlákno (request) potřebuje udělat tři dotazy do třech
  různých databází a ty sloučit do jednoho výsledku. Je velmi pomalé
 čekat na
  doběh jednotlivých dotazů, které jsou na sobě nezávislé.
  Navrhl jsem pro začátek něco takového viz. níže, ale nejsem si jist
 jestli
  tam není nějaká záludnost:
 
  /** definice pracovní třídy pro práci s DB (obsahuje vše potřebné k
  načtení dat) */
  public class DbWorker implements CallableResult {
...
  }
 
  /** voláno z requestu */
  ExecutorService executor = Executors.newFixedThreadPool(MAX_THREADS);
  ListFutureResult res = new ArrayListFutureInteger();
 
  for (DbTask task : tasks) {
// načtení dat
res.add(executor.submit(new DbWorker(task, ...)));
  }
 
  // čekej na dokončení vláken
 
  // Zpracování načtených dat
  for (FutureInteger future : res) {
System.out.println(future.get());
  }
 
  Petr
 
 



 --
 Ondra Medek