FIX: perdita di memoria virtuale con un numero elevato di oggetti Recordset simultaneo Apri

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

312575
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
Sintomi
Un'applicazione o un servizio con un numero elevato (più di 500) recordset ActiveX Data Objects (ADO) simultaneamente aperti che sono aperto e chiuso spesso potrebbe verificarsi una perdita di memoria virtuale che consente la frammentazione della memoria ed errori di esaurimento della memoria.

Questo problema può verificarsi in qualsiasi versione di Microsoft Data Access Components (MDAC) tra 2,5 RTM (2.50.4403.12) e SP1 2.6 (2.61.7326.6). Questo problema non si verifica in MDAC 2.7.

Questo problema non è specifico del provider, può verificarsi con il provider nativo di SQL Server (SQLOLEDB.dll), il provider Oracle nativo (Msdaora.dll), il provider ODBC (MSDASQL.dll), il motore del cursore client e qualsiasi componente che utilizza il codice di memoria condivisa.
Cause
Quando vengono rilasciati i recordset, le routine di gestione memoria MDAC salvare la memoria allocata per essi in un elenco di "look-aside" anziché effettivamente liberare la memoria. Questa operazione viene eseguita per evitare il sovraccarico generato dalla completamente liberare e riallocazione di memoria.

Per impostazione predefinita, il codice di gestione di memoria condivisa utilizzato da MDAC 2.5 (Msdatl2.dll) e MDAC 2.6 (Msdatl3.dll) verrà salvato fino a 500 di queste allocazioni, nulla in tale intervallo viene liberato tramite chiamate alla funzione VirtualFree .

Un errore di codifica nel codice di gestione memoria effettua una chiamata non corretta a VirtualFree , in modo che la memoria non viene effettivamente rilasciata. Il codice restituito da VirtualFree non è selezionato e l'applicazione non riceve alcuna indicazione che la memoria è stato perso.
Risoluzione
Per risolvere il problema, ottenere il service pack più recente per Microsoft MDAC 2.5. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
293312INFORMAZIONI: Come ottenere il più recente MDAC 2.5 Service Pack
La versione inglese di questa correzione deve essere di avere i seguenti attributi di file o versioni successive:

MDAC 2.5 SP2
   Date          Version      Size      File name        -------------------------------------------------   25-Oct-2001   2.52.8025.0   78,096   Msdatl2.dll		   25-Oct-2001   2.52.8025.0   53,520   Msdatt.dll		   25-Oct-2001   2.52.8025.0  303,376   Msdasql.dll	   25-Oct-2001   2.52.8025.0   16,384   Msdasqlr.dll   15-Nov-2001                          Q312575_MDAC25_SP2_x86_en.exe				
per MDAC 2.5 solo: Per risolvere questo problema è necessario ottenere la versione più recente del service pack per Windows 2000. Per ulteriori informazioni, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
260910Come ottenere Windows 2000 Service Pack più recente
MDAC 2.6 SP1
   Date          Version      Size      File name        -------------------------------------------------   25-Oct-2001   2.61.8025.0   94,480   Msdatl3.dll	   25-Oct-2001   2.61.8025.0   24,848   Msdatt.dll	   25-Oct-2001   2.61.8025.0  307,472   Msdasql.dll	   25-Oct-2001   2.61.8025.0   16,384   Msdasqlr.dll   15-Nov-2001                          Q312575_MDAC26_SP1_x86_en.exe					

Workaround
Per risolvere questo problema, è possibile progettare l'applicazione o servizio in modo che inferiore a 500 recordset aperti contemporaneamente.

È possibile risolvere il problema regolando le impostazioni seguenti nel Registro di sistema:
    HKLM\Software\Microsoft\MDAC         MaxReservedBlocks    HKLM\Software\Microsoft\MDAC         ReservedMemorySize				
nota che queste voci del Registro di sistema non sono disponibili per impostazione predefinita; è necessario quindi aggiungere manualmente. Entrambe le voci sono valori DWORD.

Il valore predefinito MaxReservedBlocks è 500. Se si aumenta tale valore, ulteriori blocchi verranno salvati nell'elenco look-aside del gestore della memoria (e comportano pertanto maggiore utilizzo della memoria dell'applicazione) ma verranno riutilizzati i blocchi. Se si riduce il valore, si aumenterà la velocità con cui perdita memoria.

Il valore predefinito per ReservedMemorySize è 1 MB. È possibile ridurre questo valore per limitare le dimensioni delle allocazioni di memoria virtuale; tuttavia, questo potrebbe influire sulle prestazioni se maggiore quantità di memoria è richiesto da che cosa è disponibile nei blocchi di memoria.
Status
Microsoft ha confermato che questo problema riguarda i prodotti Microsoft elencati all'inizio di questo articolo.

MDAC 2.5

Questo problema è stato innanzitutto corretto in Microsoft MDAC 2.5 Service Pack 3.Questo problema è stato innanzitutto corretto in Windows 2000 Service Pack 3.
Informazioni
In MDAC 2.5, le allocazioni di memoria persa sarà costituito memoria riservata e non avrà Nessuna pagina di cui è stato eseguito il commit, ad esempio:
08230000,      Private,    1048576,     1, -RW-,          08230000, Reserve,    1048576,,       -RW- --,08330000,      Private,    1048576,     1, -RW-,          08330000, Reserve,    1048576,,       -RW- --,08430000,      Private,    1048576,     1, -RW-,          08430000, Reserve,    1048576,,       -RW- --,08530000,      Private,    1048576,     1, -RW-,          08530000, Reserve,    1048576,,       -RW- --,				
in MDAC 2.6 le allocazioni di memoria persa conterrà almeno 10 KB (65536 byte) di commit pagine, ad esempio:
1BF60000,      Private,    1048576,     2, -RW-,          1BF60000, Private,      65536,,       -RW- --,     1BF70000, Reserve,     983040,,       -RW- --,1C060000,      Private,    1048576,     2, -RW-,          1C060000, Private,      65536,,       -RW- --,     1C070000, Reserve,     983040,,       -RW- --,1C160000,      Private,    1048576,     2, -RW-,          1C160000, Private,      65536,,       -RW- --,     1C170000, Reserve,     983040,,       -RW- --,				
in entrambi i casi, monitoraggio l'applicazione o il servizio con prestazioni è illustrato un utilizzo eccessivo di byte virtuali.
kbMDAC memoria virtuale riservata perdita maxreservedblocks reservedmemorysize grande numero Recordset contemporaneamente contemporaneamente aprire la frammentazione 500 esaurito

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 312575 - Ultima revisione: 02/24/2014 12:54:14 - Revisione: 4.1

  • Microsoft Data Access Components 2.5
  • Microsoft Data Access Components 2.5 Service Pack 1
  • Microsoft Data Access Components 2.5 Service Pack 2
  • Microsoft Data Access Components 2.6
  • Microsoft Data Access Components 2.6 Service Pack 1
  • kbnosurvey kbarchive kbmt kbqfe kbhotfixserver kbmdac250sp3fix kbbug kbfix kbmdac260fix kbwin2000sp3fix KB312575 KbMtit
Feedback