-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
-Xss<size> set 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ík<roman.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 Hurdes<j...@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 Hurdes<j...@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
>>>>> (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 Caslavsky<martin-l...@geek.cz
<mailto:martin-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 Hurdes<j...@ataco.cz
<mailto:j...@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
>>
>> /* http://dagblog.cz/ Blog pro kodery */