Ho un'applicazione .NET 3,5Elaborazione di stringhe grandi, questa frammentazione di heap di oggetti di grandi dimensioni?
- Una funzione è in esecuzione un milione di volte
- Sta facendo ricerca & sostituire & operazioni regex nelle stringhe 1MB + (stringhe di dimensioni diverse)
Quando il profiling l'applicazione posso confermare che queste stringhe sono memorizzate in LOH ma in seguito vengono recuperate da GC, quindi in un dato momento solo 10 di esse sono in LOH (10 thread è in esecuzione).
La mia comprensione è, questi grandi archi si trovano a LOH, ottenendo quindi riutilizzato per GC, ma eppure in qualche modo a causa delle loro posizioni di allocazione (e di essere in LOH in modo da non ottenere compattato) questo fa sì che la frammentazione. Questo sta accadendo nonostante non ci siano perdite di memoria nell'operazione.
Non causa un problema in ~ 100K volte, tuttavia quando raggiunge 1 M + fornisce eccezioni di memoria insufficiente.
sto usando ANTS Profiler di memoria e questo è il risultato che ho ottenuto nei primi esecuzioni:
.NET Using 70MB of 210MB total private bytes allocated in to the application
Number of Fragments: 59
Number of Large Fragments : 48 (99.6% of free memory)
Largest Fragment: 9MB
Free Space: 52% of total memory (37MB)
Unmanaged Memory: 66% of total private memory (160MB)
- Pensi che la mia diagnosi sono corrette in base ai dati in mano?
- Se è così, come posso risolvere questo problema di frammentazione LOH? Devo elaborare quelle stringhe e sono grandi stringhe. Dovrei trovare un modo per dividerli e lavorare in quel modo? In quel caso l'esecuzione di espressioni regolari, ecc. In stringhe divise, sarà davvero difficile.
Un'altra possibile soluzione: fare un processo separato che fa la manipolazione di stringhe, e utilizzare un nuovo processo per ogni stringa (o ogni 100K se che sembra bene per voi le stringhe, ecc). Ogni processo inizia con una lavagna pulita. Questo è uno dei motivi per cui IIS ricicla i pool di app: la frammentazione. – vcsjones
@vcsjones, ci ho pensato prima che lo realizzassi e lo eccessi :) Voglio essere sicuro che questa sia la causa. Sono nuovo per i dettagli di GC, quindi non voglio ore e più tardi per scoprire che in realtà non ho risolto nulla! Il problema è riprodurre il problema reale è piuttosto difficile, potrebbe essere necessario un giorno o due, se sono fortunato. Quindi prendo la parola di profiler per la maggior parte del tempo. –
Si potrebbe provare a eseguire il programma in modalità 64 bit. Questo risolverebbe il problema perché lo spazio virtuale è molto più grande. – xanatos