2012-01-17 13 views
7

È possibile creare un sottoinsieme di thread (ad esempio da ThreadPool specifico) allocare memoria dal proprio heap? Per esempio. la maggior parte dei thread si sta allocando da un normale heap condiviso e pochi thread di lavoro si stanno allocando da singoli heap (1: 1 per thread).Allocazione heap specifica del filetto

L'intento è quello di garantire l'esecuzione sicura del codice in ambiente condiviso - il lavoratore tipico è senza stato ed è in esecuzione su un thread separato, l'elaborazione di una richiesta non dovrebbe consumare più di 4 MB di heap.

Update # 1 Re: Ma perché ti preoccupi "esecuzione sicura" e imprevedibile aumento del consumo mucchio?

Il punto riguarda l'hosting sicuro di codice java di terze parti arbitrario all'interno del mio processo. Una volta i punti è di non ottenere "Memoria insufficiente" per il mio intero processo a causa di bug nel codice di terze parti.

Aggiornamento # 2 Re: Come di limitare l'utilizzo della memoria per thread, in Java il linguaggio è impossibile

Secondo la mia indagine prima che ho postato questa domanda la mia opinione è la stessa, ho spero solo che mi manchi qualcosa.

Le uniche possibili soluzioni alternative per il caso d'uso secondo me adesso sono ...

1) How much memory does my java thread take? - utilizzo della memoria filo traccia in qualche filo regolatore e terminare cattivi filati

2) Run Java code on my own JVM - Sì, è possibile. È possibile scaricare un'implementazione open source JVM, modificarlo ... :)

+1

No, l'idea dietro ai thread deve essere il più leggera possibile, in modo che condividano lo stesso heap; inoltre renderebbe la sincronizzazione più difficile se consentita.Ma perché sei preoccupato per "esecuzione sicura" e aumento imprevedibile del consumo di heap? – Viruzzo

+1

Le tipiche implementazioni JVM utilizzano i thread TLAB (Thread Local Allocation Buffers), in cui ogni thread ha una propria piccola area per effettuare piccole allocazioni senza troppo sovraccarico di thread-safety. Questo però non affronta la disponibilità. RTSJ ha alcune cose relative a thread e heap, ma si tratta di latenza. –

risposta

2

No. Non esiste alcun concetto di questo in Java. C'è un 'heap' dal quale è possibile allocare new. L'allocazione Java è thread-safe. E perché pensi che fare più heap possa far consumare meno memoria?

Se si desidera controllare l'utilizzo della memoria in un thread, non allocare oggetti.

Si potrebbe, in teoria, creare pool di oggetti riutilizzabili per uno scopo come questo, ma le prestazioni sarebbero quasi certamente peggiori rispetto all'ovvia alternativa.

3

Partenza Java nonblocking memory allocation - i thread di solito allocano già la memoria dai propri blocchi di allocazione. Quindi se la velocità è preoccupante, Sun l'ha fatto per te.

Come limitare l'utilizzo della memoria per thread, in Java il linguaggio è impossibile. Se è possibile (o ha senso) in JVM e Java, la piattaforma è una domanda interessante. Ovviamente puoi farlo anche con lo the same way as any memory profiler does, ma temo che il sistema di gestione supererà presto l'applicazione stessa.

2

I thread in base alla progettazione condividono tutto l'heap e altre aree di memoria. Solo lo stack è veramente thread locale e questo spazio può essere limitato.

Se si dispone di attività che si desidera eseguire nella propria memoria e/o possono essere interrotte, è necessario eseguirle come processo separato.