11
votes

Comment empêcher la chaîne d'être internétique

Ma compréhension (qui peut être fausse) est que dans C # lorsque vous créez une chaîne, elle est internée dans "Pool interne". Qui conserve une référence aux cordes de manière à ce que plusieurs chaînes puissent partager la mémoire de fonctionnement.

Cependant, je traite beaucoup de chaînes très probables, et j'ai besoin de les supprimer complètement de la mémoire de fonctionnement une fois que je suis terminé avec chacun d'eux et je ne suis pas sûr de la manière dont la référence mise en cache va être supprimée Ce collecteur des ordures peut simplement supprimer toutes les données de chaîne de la mémoire. Comment puis-je empêcher la chaîne d'être internée dans ce cache, ou comment puis-je effacer / ou supprimer une chaîne de celle-ci afin qu'elle soit sûrement retirée de la mémoire de fonctionnement?


7 commentaires

Quelle est votre motivation pour vouloir faire autre chose que le comportement par défaut?


Laissez simplement le gc faire son travail.


Toutes les cordes ne sont pas internées, Seules les chaînes littérales < / a>.


Eh bien, mais je suppose que si la référence est conservée dans ce pool interne, GC ne supprimera pas uniquement la chaîne de la mémoire de fonctionnement? Ou comment sait-il quelle chaîne peut être retirée et qui ne peut pas être?


Ma compréhension est que les chaînes ne sont internées par défaut que si elles compilent des constantes de temps ou si vous utilisez string.Intern sur eux, comme Broadcast.Orilly.com/2010/08/... explique.


Toutes les chaînes sont maintenues en mémoire, qu'ils soient internés ou non. String Internment est-il un hareng rouge?


Les chaînes constantes sont internées (par défaut). Les chaînes d'exécution ne sont pas (par défaut). Toutes vos chaînes d'exécution (internes ou non) seront supprimées par le GC. Pour plus d'informations, consultez ma réponse.


4 Réponses :


7
votes

Si vous devez supprimer les chaînes de la mémoire pour des raisons de sécurité, utilisez sécutring .

Sinon, s'il n'y a pas de références à la chaîne nulle part, le GC le nettoiera de toute façon (il ne sera plus interné) afin que vous n'ayez pas à vous soucier de vous inquiéter.

Et bien sûr, seules les littéraux de chaîne sont internés en premier lieu (ou si vous appelez String.Intern () comme indiqué ci-dessus par Petr et Autres).


4 commentaires

@downvoter: Pouvez-vous expliquer pourquoi, juste pour aider les autres qui lisent cette réponse?


Securstring n'est pas une solution. Cela semble "sécurisé" mais si je lisais sa question correctement, il n'a pas besoin de les supprimer de la mémoire, car il est attaché de pirates ou de quelque chose. Il veut juste sa mémoire de travail.


@MartinMulder Il n'est pas complètement clair de la question, d'où l'utilisation du terme " si " dans la première ligne de ma réponse.


Eh bien, malgré cela ne répond pas directement à ma question, je l'ai accepté car il ne lui permettait pas d'expliquer ce dont j'avais besoin (je n'ai pas besoin de m'occuper des chaînes d'exécution car elles ne sont pas internes, ce que je ne savais pas) , mais il introduit également un moyen universel et simple de créer une chaîne qui ne peut jamais être internée et maintenue en mémoire aussi courte que possible (et même cryptée), c'est une chose intéressante qui est définitivement bonne à savoir.



5
votes

Appliquer CompilationRelaxations Attribut à l'ensemble de l'ensemble (on dirait que la seule solution possible consiste à interdire interne sur un niveau d'assemblage) comme suit: xxx

Plus d'informations sur compilationRelaxations

mise à jour:

La documentation indique que l'attribut:

marque une assemblée comme ne nécessitant pas de protestation littérale à chaîne .

En d'autres termes, il n'empêche pas le compilateur de faire de la chaîne interne, il suffit de fournir un indice qu'il n'est pas nécessaire. Les La documentation est un peu rare dans cette zone, mais cela semble également être la conclusion dans Ce forum MSDN post .

de Cette question de ce type sur cet attribut


3 commentaires

Marque un assemblage comme ne nécessitant pas String-littéral interne ce qui n'est pas le même que de dire que la fonctionnalité doit être désactivée SOCIAL.MSDN.MICROSOFT.COMNE /FORUMS/EN-US/CLR/THTHEAD/...


@Timschmelter Réponse mise à jour avec lien + explication de la question associée et mentionné le fil MSDN. Merci


CompilationRelaxations ne s'appliquent que sur des chaînes constantes déjà en code et non des chaînes d'exécution. Petr parle de cordes d'exécution.



1
votes

Avant d'essayer d'éviter que le sort, je suggérerais d'utiliser String.isInterned () Pour savoir si les cordes que vous êtes concernés sont réellement internées du tout. Si cette fonction renvoie NULL, votre chaîne n'est pas internée.

Autant que je sache que les chaînes générées de manière dynamique au moment de l'exécution ne sont pas internées du tout, car il n'y aurait aucun avantage de performance.


0 commentaires

2
votes

Vous dites aux choses:

  • Vous traitez beaucoup de chaînes, vous parlez donc de valeurs d'exécution.
  • Vous voulez retirer les cordes de la mémoire après avoir terminé leur traitement.

    Par défaut, les valeurs d'exécution ne sont pas internées. Lorsque vous recevez une chaîne d'un fichier ou créez une chaîne vous-même, ils ont tous une instance séparée. Vous pouvez les internerez via String.Intern. Les chaînes interne prend plus de temps, mais consomme moins de mémoire. Voir: http://msdn.microsoft.com/fr- US / Bibliothèque / System.string.Intern.aspx

    Les chaînes d'exécution sont automatiquement supprimées par le GC s'il n'y a aucune référence à eux. Un interné aura plus de références, mais à la fin de votre processus, je suppose que toutes les références sont supprimées. Le mécanisme interne ne conserve pas une référence difficile, mais une référence faible. Une référence faible est ignorée par le GC, l'instance de chaîne peut donc toujours être supprimée. Voir: http://msdn.microsoft.com/en-us/ Bibliothèque / système.wakreference.aspx

    Alors ... pour résumer. Par défaut, vos chaînes d'exécution ne sont pas internées. Et s'ils seraient internés, ils sont toujours supprimés par la GC après la fin de votre travail.


0 commentaires