コードでメモリリークを防ぐことができます -- javascript フィールド と ajax フィールド と memory-leaks フィールド 関連 問題

Preventing memory leak with my code












0
vote

問題

日本語

このコードを使用しているIM:

<事前> <コード> <!-- Progress bar holder --> <div id="progress" style="width:300px; height:20px; border:1px solid #ccc; float: right; margin-top: 7px; margin-right: 7px;"></div> <!-- Progress information --> <div id="information" style="width; text-align: center; margin-top: 7px;"></div></div>

whileループ内の内側:

<事前> <コード> // Javascript for updating the progress bar and information echo '<script language="javascript"> document.getElementById("progress").innerHTML="<div style="width:'.$percent.';background-color:#ddd;">&nbsp;</div>"; document.getElementById("information").innerHTML="'.$i.' av '.$no_lines.' rader processade."; </script>'; // This is for the buffer achieve the minimum size in order to flush data echo str_repeat(' ',1024*64); // Send output to browser immediately flush();

$ I whileループが何かをしているたびに+1で増えますが、これは非常に大きくなる可能性があります。 300Kの上向き。そして現在コードが~14000でクラッシュしている(メモリ使用量は1GB RAMを超えています)。それはまた約30%のCPU使用率でホバースし、アップロード中にインターネット使用を非常に不快にします。

IVEは前にJavaScriptで働いていません、そしてIveはJavaScriptでメモリリークを読み上げますが、それは私がこれを防ぐ方法で私を助けません。私は私のコードを私のコードに適用する方法がわからないいくつかのリンクを見つけました http:// javascript.info/tutorial/Memory-Leaks たとえば、empty()、remove()、redvedata()。 私はこの投稿も見ました: http://www.javascriptkit.com/javatutors/closuresLeak/dund >何が起こったのか理解するのは有益でしたが、私が間違ったことを理解することはできませんでした。 現在、$ I%100 == 0の場合にのみコードをやっています。その "Solution"を誇りにしません。

あなたのコードで私のコードのメモリリークを防ぐのに役立つことができますか?

英語

im using this code:

<!-- Progress bar holder --> <div id="progress" style="width:300px; height:20px; border:1px solid #ccc; float: right; margin-top: 7px; margin-right: 7px;"></div> <!-- Progress information --> <div id="information" style="width; text-align: center; margin-top: 7px;"></div></div> 

inside a while loop:

// Javascript for updating the progress bar and information echo '<script language="javascript">  document.getElementById("progress").innerHTML="<div style="width:'.$percent.';background-color:#ddd;">&nbsp;</div>"; document.getElementById("information").innerHTML="'.$i.' av '.$no_lines.' rader processade."; </script>';  // This is for the buffer achieve the minimum size in order to flush data echo str_repeat(' ',1024*64);  // Send output to browser immediately flush(); 

$i will increase with +1 every time the while loop does something, this can be very large. upwards of 300k. and currently the code crashes at ~14000 (memory usage is above 1gb ram then). it also hovers at around 30% cpu usage and makes internet usage very unpleasant while uploading

ive never worked with javascript before, and ive read up about memory leaks in javascript, however it doesnt help me with how i prevent this. i found some links which help me sort of, however i dont know how to apply them to my code http://javascript.info/tutorial/memory-leaks for example: empty(), remove(), removeData(). i also looked at this post: http://www.javascriptkit.com/javatutors/closuresleak/ it was helpful to understand what was happening but couldnt figure out what i did wrong. currently im only doing the code if $i % 100 == 0 which is so bad im not even proud of that "solution".

could anyone of you help me prevent the memory leak in my code?

</div
        
     
     

回答リスト

2
 
vote

(免責事項:私はInternet Explorer JavaScript Engine "Chakra"で動作するMicrosoftのソフトウェアエンジニアです):

あなたのJavaScriptコードには新しいオブジェクトを作成するループが含まれていませんので、Direct DOM操作の代わりに innerHTML を使用するとパフォーマンス最適化の機会が表示されますが、メモリが漏れる危険性はありません。 innerHTML を使用すると、テキストを解析して処理し、これは安価な操作ではなく、<コード> setAttribute("style", "width: ... は Lot より安いです。私のコメントに書いたときに質問への返信を書いているので、あなたがクライアントに進捗状況アップデートを送信するために使用しているアプローチをお勧めしません。このアプローチはCOMETとして知られています(> http://en.wikipedia.org/wiki/comet_% 28プログラミング%29 )。しかし、代替アプローチを助言することはトピックであり、この背景について説明していない - コードが実行されているので、もう一度コメントを控えてください。

 

(Disclaimer: I'm a software engineer at Microsoft who works on the Internet Explorer Javascript engine "Chakra"):

Your Javascript code does not contain any loops which create new objects, so there is no risk of you leaking memory, though your use of innerHTML instead of direct DOM manipulation presents an opportunity for performance optimization (as using innerHTML causes the text to be parsed and processed which isn't a cheap operation, calling setAttribute("style", "width: ... is a lot cheaper.

As I wrote in my comment-reply to the question, I don't recommend the approach you're using to send progress updates to the client. This approach is known as Comet ( http://en.wikipedia.org/wiki/Comet_%28programming%29 ). But advising alternative approaches is off-topic and you haven't explained any details about this background-operation your code is executing so I'll refrain from further comment.

</div
 
 
0
 
vote

何が起こっているのかは、<コード> document にますます <script> タグを追加しています。代わりに、このコードを<コード> while :

に配置してみてください。 <事前> <コード> <script language="javascript"> var progress = document.getElementById('progress'), information = document.getElementById('information'); progress.style.width = $percent; information.innerHTML= $i + ' av ' + $no_lines + ' rader processade.'; </script>

変数名と関数名を見ると、JavaScriptではなくPHPのように見えます。この場合、 while の代わりに setTimeout 関数を使用し、Ajaxを介して進捗更新を要求する必要があります。

 

It looks that what is happening, is you are appending more and more <script> tags to your document. Instead, try placing this code in your while:

<script language="javascript">     var progress = document.getElementById('progress'),         information = document.getElementById('information');      progress.style.width = $percent;     information.innerHTML= $i + ' av ' + $no_lines + ' rader processade.'; </script> 

Looking at your variables and function names, it also looks like PHP, not the javascript. In this case, you should use setTimeout function instead of while and request progress update via AJAX.

</div
 
 
 
 
0
 
vote

クライアントにスクリプトブロックを継続的に送信するので、マークアップは永遠に成長します。

実際には、おそらく、必要なデータを取得するためにPHPページ(またはサーバーテクノロジであれ)を呼び出すためにAjaxを使用する必要があります。

このアプローチはまた、PHPプロセスが「ビジー」であるのでHTTPリクエストを継続的に保持しているので停止するのを停止します。

jQueryとAjaxを使用した場合は、X秒ごとに呼び出す関数が必要です。

<事前> <コード> var myTimer = setInterval(2000, getData); function getData() { $.ajax({ url: "http://getData.php", dataType: json}) .done(function( data ) { // data is the parsed json $("#progress").html(data.percentage); $("#information").html(data.information); } }); }

JSONが

のように見える場所 <事前> <コード> innerHTML0

もっと「リアルタイム」アップデートが必要な場合は、彗星を実装する方法の1つを使用する必要があります。上記のように長期のHTTPリクエストを使用するだけで、URLを再要求するタイムアウト(PHPには優れていません。その他のテクノロジーの場合は優れています)。

 

You're continuously sending script blocks to the client, so your markup will grow forever.

In reality, you should probably use AJAX to call to a PHP page (or whatever server technology) to get the data you require.

This approach also stops the PHP process from being so "busy" continuously keeping an HTTP request alive.

If you used jQuery and AJAX, you just need a function that calls every X seconds e.g.

var myTimer = setInterval(2000, getData);  function getData() {     $.ajax({         url: "http://getData.php",         dataType: json})         .done(function( data ) { // data is the parsed json             $("#progress").html(data.percentage);             $("#information").html(data.information);          }     });    } 

Where the json looks something like

{     percentage : 80,     information : "some more info" } 

If you need a more "real-time" update, then you should use one of the methods of implementing COMET. You could just use a long-held HTTP request in the case above, with a timeout that re-requests the URL (which isn't great for PHP, better for other technologies).

</div
 
 
         
         

関連する質問

176  「メモリリーク」の解剖学  ( Anatomy of a memory leak ) 
.NETの観点: メモリリーク? アプリケーションが漏洩するかどうかを判断するにはどうすればよいですか。効果は何ですか? メモリリークを防ぐにはどうすればいいですか? アプリケーションがメモリリークがある場合は、プロセスが終了するか、または殺されたときに...

3  Scan-Buildを実行するときは、「CCC-Analyzer」を検出できませんでした。  ( Error couldnt discover the ccc analyzer when running scan build ) 
私のプロジェクトの漏れを見つけるためにトライインしています chibi-orm ツールの使い方他のスレッドで提案されているようにスキャンビルドの。 しかし端末から実行すると: <事前> <コード> /Users/mamcx/Downloads/checker-...

26  どのプロセスがメモリの漏れがあるのを見つけますか? [閉まっている]  ( How do i find which process is leaking memory ) 
閉じたこの質問はオフトピックです。現在答えを受け付けていません。 この質問を改善したいですか?質問を更新するので、スタックオーバ...

3  メモリリークを確認する方法  ( How to check memory leak ) 
コードに入らずにメモリリークを確認することは可能です。私は私と一緒に申し込みを持っていて、私はメモリリークがあるかどうかを確認したいです。 私の現在の組織では、アプリケーションの実行前後のCPU使用率と、アプリケーションのプロセスのCPU使用状況を確認します。...

0  PHPの可能なメモリリーク  ( Php possible memory leak ) 
GD&AMPで変換する画像用データベースをループするスクリプトがあります。 Imagick。 各ループ間にすべての変数とオブジェクトを設定解除または置き換えます。 各ループの場合、get_memory_usage(1)はそのスクリプトによって使用される同時額...

3  なぜ「ボックス外」のSharePointナビゲーションがメモリの漏洩のように見えますか  ( Why does my out of the box sharepoint navigation look like it is leaking memor ) 
私のサイトにはかなりのナビゲーション構造があり、かなり頻繁には、箱のナビゲーションがメモリ、特にSPWebオブジェクトの漏れがあります。 ログメッセージはのように見えます 現在のスレッド5の潜在的に過剰な数のSPREQUESTオブジェクト(14)5.このオブ...

18  以下のコードはC ++でメモリリークを引き起こしますか  ( Will the below code cause memory leak in c ) 
<事前> <コード> class someclass {}; class base { int a; int *pint; someclass objsomeclass; someclass* psomeclass; publ...

0  いくつかの音の割り当て  ( Allocation of several sounds ) 
このコードをよく書いたらよくわかりません(ボタンを迅速にクリックするとクリック): <事前> <コード> Register7 ...

6  Objective-Cの標準オブジェクト初期化はメモリリークにつながるのではありませんか?  ( Doesnt the standard object initialization in objective c lead to memory leaks ) 
Objective-Cでオブジェクトを作成するための標準的な方法: <事前> <コード> MyClass* object = [[MyClass alloc] init]; myclass の init メソッドの標準的な実装は、次のようになります。...

9  Boost :: Shared_PTRサイクリック参照を見つける  ( Finding boostshared ptr cyclic references ) 
Shared_PTRの巡回参照を見つけるためのヒント/トリックはありますか? これは私が見つけようとしているものの例です - 残念ながら私は私のコードのループを見つけることはできません。 <事前> <コード> struct A { boost::shar...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有