Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Control Del Consumo de Recursos y Mejora Del Rendimiento
Control Del Consumo de Recursos y Mejora Del Rendimiento
rendimiento
.NET Framework (current version)
Otras versiones
Estos controles están diseñados para proporcionar una mitigación rápida contra ciertos tipos de ataques
o para mejorar métrica de rendimiento tal como el consumo de memoria, el tiempo de inicio, etc.Sin
embargo, dependiendo de la aplicación, estos controles pueden impedir el rendimiento de la aplicación
del servicio o evitar que la aplicación funcione.Por ejemplo, una aplicación diseñada para transmitir
secuencias de vídeo puede superar con facilidad la propiedad
TransportBindingElement.MaxReceivedMessageSize predeterminada.En este tema se proporciona un
resumen de los diferentes controles aplicados a las aplicaciones en todos los niveles de WCF, describe
varias maneras para obtener más información sobre si un valor está entorpeciendo su aplicación, y
describe maneras de corregir varios problemas.La mayoría de los aceleradores y algunas cuotas están
disponibles en el nivel de aplicación, incluso cuando la propiedad base es una serialización o una
restricción de transporte.Por ejemplo, puede establecer la propiedad
DataContractSerializer.MaxItemsInObjectGraph utilizando la propiedad
ServiceBehaviorAttribute.MaxItemsInObjectGraph en la clase de servicio.
Nota
Si tiene un problema determinado, debería leer primero Inicio rápido de solución de problemas de
WCF para ver si su problema (y una solución) aparecen en la lista.
Las propiedades que restringen los procesos de serialización están listadas en Consideraciones de
seguridad para datos.Las propiedades que restringen el consumo de recursos relacionadas con
transportes están listadas en Cuotas de transporte.Las propiedades que restringen el consumo de
recursos en el nivel de aplicación son los miembros de la clase ServiceThrottle.
Independientemente de las funciones de su entorno de desarrollo, puede utilizar las funciones de traza
de WCF y registro de mensajes para depurar todas las excepciones y ajustar el rendimiento de sus
aplicaciones.Para obtener más información, vea Uso del seguimiento para solucionar problemas de su
aplicación.
Problemas de rendimiento y XmlSerializer
Los servicios y las aplicaciones cliente que usan tipos de datos que son serializables mediante
XmlSerializer generan y compilan el código de serialización de los tipos de datos en tiempo de
ejecución, lo que se puede traducir en un rendimiento de inicio lento.
Nota
El código de serialización generado previamente solo puede usarse en aplicaciones cliente, no en
servicios.
Ver también
Administración y diagnóstico
Datos de gran tamaño y secuencias
Mejorar el rendimiento de la recolección de
elementos no utilizados
2017-2-8 9 minutos para leer
[ Actualizado para aplicaciones para UWP en Windows 10. Para leer más artículos sobre Windows 8.x,
consulta el archivo ]
Generación 0. Esta generación contiene los objetos asignados recientemente, a menos que su tamaño
sea de 85KB o superior, en cuyo caso forman parte del montón de objetos grandes. El montón de
objetos grandes se recolecta con las recolecciones de generación 2. Las recolecciones de generación 0
son el tipo de recolección más frecuente y limpian los objetos de corta duración, como las variables
locales.
Generación 1. Esta generación contiene objetos que han sobrevivido a las recolecciones de generación
0. Sirve como búfer entre las generaciones 0 y 2. Las recolecciones de generación 1 tienen lugar con
menor frecuencia que las de generación 0 y limpian los objetos temporales que se encontraban activos
durante las recolecciones de generación 0 anteriores. Las recolecciones de generación 1 también
recolectan la generación 0.
Generación 2. Esta generación contiene los objetos de larga duración que han sobrevivido a las
recolecciones de las generaciones 0 y 1. Las colecciones de generación 2 son las menos frecuentes y
recolectan todo el montón administrado, incluido el montón de objetos de gran tamaño que contiene
objetos cuyo tamaño es de 85KB o superior.
Puedes medir el rendimiento del recolector de elementos no usados en relación con dos aspectos: el
tiempo que tarda la recolección de elementos no usados y el consumo de memoria del montón
administrado. Si tienes una aplicación pequeña con un tamaño de montón inferior a 100MB, céntrate en
reducir el consumo de memoria. Si tienes una aplicación con un montón administrado superior a
100MB, céntrate solo en reducir el tiempo de la recolección de elementos no usados. A continuación se
muestra cómo mejorar el rendimiento del recolector de elementos no usados de .NET.
Reducir el consumo de memoria
Liberar las referencias
Si un objeto de tu aplicación tiene una referencia, dicho objeto y todos los objetos a los que hace
referencia no pueden recolectarse. El compilador de .NET realiza un buen trabajo al detectar cuándo
una variable ya no se usa. De este modo, los objetos que contienen esa variable se habilitarán para la
recolección. Pero, en algunos casos, es posible que no sea evidente que algunos objetos tienen una
referencia a otros objetos, porque parte del gráfico de objeto puede pertenecer a bibliotecas que usa tu
aplicación. Para conocer las herramientas y las técnicas que te permiten averiguar qué objetos
sobreviven a una recolección de elementos no usados, consulta Recolección de elementos no usados y
rendimiento.
Para inducir una recolección de elementos no usados de una generación, llama a GC.Collect(n), donde
n es la generación que quieres recolectar (0, 1 o 2).
Las recolecciones de elementos no usados frecuentes pueden contribuir a un mayor consumo de CPU
(y, por lo tanto, de energía), tiempos de carga más prolongados o una menor velocidad de fotogramas
en la aplicación. A continuación se ofrecen algunas técnicas que puedes usar para reducir el tiempo de
recolección de elementos no usados y las pausas relacionadas con la recolección en tu aplicación para
UWP.
Si en algunas secciones de tu aplicación no quieres que haya ningún tipo de pausa, puedes preasignar
los objetos necesarios con antelación durante un momento en que el rendimiento no sea tan importante.
Por ejemplo, un juego podría asignar todos los objetos necesarios para la partida durante la pantalla de
carga de un nivel en lugar de realizar las asignaciones durante la partida propiamente dicha. Esto evita
pausas mientras el usuario está jugando y da como resultado una velocidad de fotogramas más alta y
coherente.
Si con frecuencia creas objetos que tienen una duración temporal, pero duran lo suficiente como para
avanzar a la generación 2, se producirán más recolecciones de generación 2, las cuales consumen más
recursos. Es posible que puedas reducir el tiempo de las recolecciones de generación 2 si reciclas los
objetos existentes o si los eliminas con mayor rapidez.
Un ejemplo común de objetos de mediana duración son los objetos que se usan para mostrar elementos
en una lista por la que se desplaza un usuario. Si se crean objetos cuando aparecen los elementos de la
lista y se deja de hacer referencia a ellos tan pronto como se desplazan fuera de la vista, tu aplicación
tendrá una gran cantidad de recolecciones de generación 2. En este tipo de situaciones, puedes
preasignar un conjunto de objetos y reutilizarlos para los datos que se muestran al usuario de manera
activa y usar objetos de corta duración para cargar la información a medida que aparecen los elementos
de la lista.
Reducir recolecciones de generación 2 al evitar objetos de gran tamaño con duraciones cortas
Los objetos de 85KB o mayores se asignan al montón de objetos grandes (LOH) y se recolectan como
parte de la generación 2. Si tienes variables temporales como, por ejemplo, búferes, cuyo tamaño
supera los 85KB, una recolección de generación 2 las eliminará. Al limitar las variables temporales a
menos de 85KB, se reduce el número de recolecciones de generación 2 en la aplicación. Una técnica
común consiste en crear una grupo de búferes y volver a usar los objetos del grupo para evitar
asignaciones temporales de gran tamaño.
El recolector de elementos no utilizados sigue las referencias entre los objetos desde las raíces de la
aplicación para determinar qué objetos están activos. Para más información, consulta el tema que
explica lo que sucede durante una recolección de elementos no utilizados. Si un objeto contiene muchas
referencias, el recolector de elementos no utilizados deberá realizar una mayor cantidad de trabajo. Una
técnica común (especialmente con los objetos grandes) consiste en convertir los objetos con muchas
referencias en objetos sin referencias (por ejemplo, en lugar de almacenar una referencia, almacena un
índice). Obviamente, esta técnica solo funciona cuando es posible hacerlo de forma lógica.
El reemplazo de referencias de objeto por índices puede implicar una modificación complicada y
perjudicial en la aplicación, y es más eficaz en objetos grandes con una gran cantidad de referencias.
Hazlo solamente si notas tiempos de recolección de elementos no utilizados prolongados en la
aplicación relacionados con objetos con muchas referencias.
Liberar memoria ram de aplicación en visual basic.net
Hace tiempo estuve en contacto con el colega @Cristian. Tuvimos una platica muy apasionada sobre
el mundo de Visual Basic .Net y de un momento a otro me comentó que había encontrado un código
que me llamaría la atención.
Él inicio con una pregunta: ¿Qué sucede después de que una aplicación entra en un proceso muy
pesado?. Mi respuesta (después de analizar por un rato la pregunta) fue: Es probable que la
aplicación se quede consumiendo mucha memoria RAM. Y sí, coincidimos los 2 en esa parte.
El código que había encontrado @Cristian ayuda a que se liberen recursos que la aplicación ya no
utiliza, ya que obliga a que entre de inmediato el Garbage Collector.
End Try
End Sub
End Class