2009-04-27 5 views
2

J'ai des problèmes avec le tas de ColdFusion. Voici un petit exemple d'application que j'expérimente. J'ai pensé après cfinvoke appelant la méthode init qu'il détruit toutes les variables locales au composant. Mais apparemment ce n'est pas le cas. L'application fonctionne comme ci-dessous mais si j'ajoute un zéro à la boucle dans index.cfm elle casse. Qu'est-ce qui est stocké dans le tas pour provoquer cela? Y a-t-il un moyen de contourner ceci?CFINVOKE vs java.lang.OutOfMemoryError dans ColdFusion

index.cfm:

<cfloop from="1" to="1000" index="i"> 
    <cfinvoke component="test" method="init" returnvariable="x"> 
</cfloop> 
<cfoutput><p>#x#</p></cfoutput> 

test.cfc:

<cfcomponent output="false"> 
    <cffunction name="init" returntype="string"> 
     <cfset var test = structNew()> 
     <cfloop from="1" to="1000" index="i"> 
      <cfset test[i] = i> 
     </cfloop> 
     <cfreturn Now()> 
    </cffunction> 
</cfcomponent> 

Et voici le message d'erreur:

SEVERE: Servlet.service() for servlet CfmServlet threw exception 
javax.servlet.ServletException: ROOT CAUSE: 
java.lang.OutOfMemoryError: Java heap space` 

Toute aide être apprécié.

+0

vous devez ajouter la version de ColdFusion vous êtes en cours d'exécution afin que ce soit des informations pertinentes dans le futur. –

Répondre

3

Ceci est un problème connu et ACTUELLEMENT il n'y a aucun moyen de contourner le problème. Il semble que les FC ne gèrent PAS correctement la collecte des ordures. Autant que je sache, il ne détruira pas et ne libèrera pas la mémoire utilisée par le composant tant que la requête n'est pas terminée. Pour cette raison, en fonction du nombre de propriétés de vos composants, vous pouvez déterminer combien d'entre eux vous pouvez créer jusqu'à ce que vous obteniez l'erreur de segment.

Je sais que cela n'aide pas votre problème, mais au moins maintenant vous pouvez prendre des mesures pour l'empêcher.

+0

Je me rends compte que c'est une question assez ancienne, mais pouvez-vous citer vos sources pour cette prétendue issue connue en '09? –

+0

http://rip747.wordpress.com/2008/09/29/help-force-coldfusion-to-release-memory/ – rip747

+0

Ceci est juste un lien vers quelqu'un demandant comment forcer la récupération des ordures parce qu'il * pense * qu'il y a un bug - mais comme c'est souvent le cas, la cause première est très souvent associée à un mauvais code. Cela a-t-il déjà été identifié/résolu par Adobe? –

2

rio747 est correct, la mémoire n'est pas libérée tant que la requête n'est pas terminée, vous manquez donc de mémoire. Je me risquerais à dire que vous pouvez probablement l'exécuter et obtenir l'erreur, supprimer le 0 et il va fonctionner; la collection garbage java est en cours d'exécution, mais pas avant la fin de la requête. Vos seules options de résolution sont de ne pas créer autant d'objets dans une seule requête (peut-être plus d'informations sur pourquoi cela est nécessaire?) Ou d'augmenter la quantité de mémoire disponible pour coldfusion.

Je ne pense pas que ce soit vraiment un problème ou CF ne gère pas correctement la collecte des ordures; à partir d'un point de vue Java tant que cette requête est active, l'objet peut toujours être utilisé et référencé. Je veux dire, vous avez raison sur le cfinvoke et comment cela fonctionne, mais cela ne signifie pas que le jvm peut réellement exécuter le garbage collection sur ces emplacements de mémoire jusqu'à ce que la demande soit terminée.

0

Je viens posté une nouvelle entrée de blog qui montre comment vous pouvez faire la collecte des ordures programmes si votre mémoire est en dessous d'un certain seuil .. Hope it helps: -

[http://www.beetrootstreet.com/blog/index.cfm/2009/6/25/Clearing-ColdFusion-memory-using-garbage-collection-when-memory-gets-low][1]

+0

votre message est correct dans cette force le garbage collector, mais il n'aide toujours pas le problème de tas lors de la création de nombreux objets car ils ne seront pas marqués pour la récupération de place tant que la requête n'est pas terminée. – rip747