Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

232
Vistas
¿Cuál es la diferencia entre el montón administrado y el montón nativo en la aplicación c#?

De este http://blogs.msdn.com/b/visualstudioalm/archive/2014/04/02/diagnosing-memory-issues-with-the-new-memory-usage-tool-in-visual-studio.aspx

  1. Administrado: para las aplicaciones administradas, el generador de perfiles solo recopila información del montón administrado de forma predeterminada. La creación de perfiles de almacenamiento dinámico administrado se realiza mediante la captura de un conjunto de eventos CLR ETW en el generador de perfiles.
  2. Nativo: para las aplicaciones nativas, el generador de perfiles solo recopila información de almacenamiento dinámico nativo. Para recopilar información de almacenamiento dinámico nativo, habilitamos el seguimiento de pila y la recopilación de seguimientos de almacenamiento dinámico (ETW), que son muy detallados y crearán archivos de sesión de diagnóstico de gran tamaño.

Mi pregunta es en mi programa c# (solo tengo código c# con archivos xaml), ¿qué tipo de objeto irá al montón administrado y qué tipo va al montón nativo? ¿Y cómo puedo especificar el tamaño máximo de cada montón cuando se ejecuta mi aplicación? Supongo que GC solo se ejecuta en un montón administrado, ¿es correcto?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Cuando crea un objeto usando el operador new en C# (o el operador correspondiente en cualquier otro lenguaje CLR), el tiempo de ejecución de .NET asigna memoria en el "montón administrado" (simplemente un montón administrado por el tiempo de ejecución de .NET + el recolector de elementos no utilizados) . Este es, en realidad, uno de los dos montones: uno destinado a objetos de menos de 85K de tamaño y el otro a objetos más grandes (matrices grandes y similares). De cualquier manera, cuando se asigna un objeto de este tipo, no obtiene un puntero real que describa la dirección del espacio asignado como lo haría en código nativo. Lo que obtienes de vuelta es un "mango", que representa una indirección a esa dirección de memoria. Esta indirección existe porque la ubicación real de la memoria puede cambiar cuando el GC recopila y compacta el montón.

Sin embargo, cuando desee hablar con código no administrado/nativo que espera un puntero, debe usar punteros, no identificadores. .NET proporciona dos métodos para convertir un identificador de .NET en un puntero sin procesar que se puede pasar a código no administrado.

  1. Asigne memoria en el montón de NT (o nativa o no administrada) usando Marshal.AllocHGlobal o Marshal.AllocCoTaskMem y use un bloque fijo o IntPtr.ToInt32 / ToInt64 para obtener el puntero subyacente. Asegúrese de llamar a Marshal.FreeHGlobal / Marshal.FreeCoTaskMem o de que el código no administrado libere la memoria correctamente (FreeAlloc/CoTaskMemFree en Windows).
  2. Si sus datos son blittables (que es probablemente el caso cuando interopera con código nativo), simplemente puede anclar estos datos administrados con GCHandle.Alloc y luego llamar al código nativo con el puntero sin procesar obtenido de GCHandle.AddrOfPinnedObject , liberando el pinning ( usando GCHandle.Free ) cuando haya terminado. También puede obtener la dirección del puntero subyacente real de un objeto administrado y anclar temporalmente dentro de un bloque " fijo " en C#.

¡Espero que esto ayude!

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda