2008-11-17 10 views
0

J'ai un problème similaire à this person. La principale différence étant que l'application n'est PAS destinée à un environnement de développement, et donc j'ai besoin de savoir comment optimiser l'espace utilisé par Sql Server (éventuellement par machine en fonction des spécifications).Demande de mémoire pour votre application

J'ai été intrigué par Ricardo C's réponse, en particulier les éléments suivants:

Extrait il fromt SQL Server documentation:

mémoire serveur maximum (en Mo)

Indique la quantité maximale de mémoire SQL Server peut allouer quand démarre et pendant son exécution. Cette option de configuration peut être réglé à une valeur spécifique si vous savez qu'il ya plusieurs applications en cours d'exécution au même temps que SQL Server et que vous souhaitez pour garantir que ces applications une mémoire suffisante pour fonctionner. Si ces autres applications, tels que Web ou serveurs de messagerie, demande la mémoire uniquement selon les besoins, puis ne définissez pas l'option, car SQL Server va libérer la mémoire selon les besoins. Cependant, applications utilisent souvent la mémoire est disponible quand ils commencent et font ne pas demander plus si nécessaire. Si une application qui se comporte de cette manière fonctionne sur le même ordinateur à en même temps que SQL Server, définissez l'option à une valeur qui garantit que la mémoire requise par l'application n'est pas affecté par SQL Server.

Ma question est: comment une application demande-t-elle de la mémoire à partir du système d'exploitation quand elle en a besoin? Est-ce quelque chose intégré dans la compilation ou quelque chose géré par le développeur? Les deux principales applications fonctionnant sur cette machine sont Sql Server et l'application C# (assez lourde) que je développe, et je suis presque certain que nous n'avons rien fait pour demander de l'espace à l'OS. Y a-t-il une manière correcte/nécessaire de faire ceci?

Répondre

1

Certaines applications allouent beaucoup de mémoire au démarrage, puis exécutent leur propre système de gestion de la mémoire. Cela peut être utile pour les applications qui ont des modèles d'allocation particuliers et qui pensent pouvoir faire un meilleur travail que le gestionnaire de mémoire plus générique fourni par le système d'exécution.

De nombreux jeux le font, car ils ont souvent une très bonne idée de l'apparence de leur modèle d'utilisation de la mémoire et sont souvent fortement optimisés. L'allocateur par défaut/système est général et pas toujours assez rapide.Doom did this, et est assez bien connu pour cela et bien sûr son code est disponible et largement discuté.

Dans les langages «gérés» comme C#, je pense que c'est très rare et que vous n'avez rien à craindre.

+0

page non disponible :( –

+0

@MickeyPerlstein Imaginez que 6 ans plus tard, Adobe a cassé son schéma d'URL, dommage, je l'ai réécrit et j'ai changé le lien pour quelque chose de plus cool. – unwind

0

Chaque fois que vous créez un nouvel objet, vous demandez au garbage collector .NET de vous donner de la mémoire. Si le GC n'a pas assez de mémoire sur le tas géré, il demandera plus d'informations au système d'exploitation. Comme le dit l'autre question, bien que le serveur SQL soit censé rendre la mémoire, il ne semble pas très bien le faire. Il n'y aura pas de règles strictes ici, vous devrez deviner un paramètre pour le serveur SQL, puis tester les performances. Si vous postez quelques informations sur le serveur, la taille de la base de données, la quantité de mémoire que votre application semble avoir besoin, je suis sûr que les gens seront heureux de vous donner quelques suggestions pour une configuration de départ. Un avertissement cependant, je pense que changer ses limites de mémoire nécessite un redémarrage du service.

0

Cela dépendra de quelques facteurs, notamment du système d'exploitation et de la langue utilisée. Par exemple, sous MacOS Classic, il était impossible d'avoir plus de mémoire allouée après le démarrage - auparavant, nous devions aller modifier la quantité de mémoire allouée à l'aide du Finder, puis redémarrer l'application. C'était le mauvais vieux temps.

Les systèmes d'exploitation modernes permettront aux processus en cours de demander plus de mémoire - par exemple, en C, vous pouvez utiliser alloc(), malloc(), realloc() ou similaire pour demander des blocs de mémoire. Dans les langages dynamiques, vous créez simplement des objets ou des variables, et plus de mémoire est allouée. En Java, il y a une limite quant à la quantité de mémoire à laquelle la JVM a accès - et cela peut être changé en redémarrant simplement la JVM, et en lui passant des arguments (ça sonne comme le mauvais vieux temps, il?).

En Objective-C, en plus de la famille malloc() de fonctions, vous pouvez également créer des objets sur le tas, en utilisant

[object alloc]; 

qui est plus souvent considérée comme

[[object alloc] init]; 

Notez que ceci est légèrement différent de la création d'objets sur la pile - si vous êtes sérieux au sujet de l'apprentissage de la programmation, la différence entre ces deux peut également être utile :)

En résumé - la Le programmeur doit demander au système d'exploitation plus de mémoire. Cela peut être implicite (dans les langages dynamiques, en créant des objets, ou en créant des objets sur le tas) ou explicitement, comme en C en utilisant alloc()/malloc()/etc.

Questions connexes