자바스크립에선 메모리 관리가 어떻게 되나요?

addnull의 이미지

http://erik.eae.net/archives/2005/08/04/21.38.18

이 문서를 읽다가 JS의 메모리 관리가 궁금해지더군요.
정확하게는 JS로 할당된 메모리가 언제까지 유효한지 궁금합니다.

0. 브라우져가 종료될때까지
1. 탭브라우져 상에서 해당 탭이 종료될때까지
2. 다른 싸이트로 이동할때까지 (a.com -> b.com)
3. 같은 싸이트라고 해도 다른 페이지로 이동할때까지. (a.com/a.htm -> a.com/b.htm)

문서상에서는 상호참조하는 객체집단은 브라우저가 종료될때까지
가비지컬렉터에 의해 해제되지 않고 계속 남아있게 된다고 했는데,
단순히 3번처럼 페이지만 바뀌여도 전부다 해제되는게 아니였나요?

2005년 11월 10일.

lacovnk의 이미지

음. 스크립트니까 스크립트가 끝나면 모두 소멸되는 것이라고 생각했는데..

다른 싸이트로 가면 스크립트가 명백히 종료되는게 아닌가요?

역시 참 신기하군요 -o-

HotPotato의 이미지

에, 뭐죠? JScript는 정통 자바스크립트가 아닌 걸로 알고 있는데요.
단지 IE가 삐리할 때 Netscape의 Javascript와 호환성을 맞추려고 만든 것이지요. 게다가 이제는 아예 되먹듯이 쓰고 있지만요.
(그게 여기서 큰 문제거리는 아니고..)

lacovnk님의 생각에 동의하고 있었는데, 정 그게 아니라면 쿠키와 캐시를 지웠을 때야말로 완전히 날아가지 않을까요?

--
즐 Tux~

sh.의 이미지

js엔진 구현에 따라 다를것 같긴 하지만...
일반적인 스크립팅에 사용된 변수나 객체는 페이지가 이동할때 혹은 gc에 의해 적절한 타이밍에 소멸되겠지만 Window 라던가 Navigator, History등의 객체는 계속 유지되는게 맞지 않나요?

addnull의 이미지

HotPotato wrote:
에, 뭐죠? JScript는 정통 자바스크립트가 아닌 걸로 알고 있는데요.
단지 IE가 삐리할 때 Netscape의 Javascript와 호환성을 맞추려고 만든 것이지요. 게다가 이제는 아예 되먹듯이 쓰고 있지만요.
(그게 여기서 큰 문제거리는 아니고..)

lacovnk님의 생각에 동의하고 있었는데, 정 그게 아니라면 쿠키와 캐시를 지웠을 때야말로 완전히 날아가지 않을까요?

음.. ? (JScript != java script) 였나요?
요즘은 자바스크립 언어를 네스케이프에서 개발하는지,
아니면 M$인지 잘모르겠습니다.

다만, mozilla development center의 reference를 기준으로 코딩하는데..
거기선 1.6이 최신 버전으로 나오네요..
네스케이프에선 reference도 관리않하는듯..?

2005년 11월 11일.

lifthrasiir의 이미지

어니스트 wrote:
HotPotato wrote:
에, 뭐죠? JScript는 정통 자바스크립트가 아닌 걸로 알고 있는데요.
단지 IE가 삐리할 때 Netscape의 Javascript와 호환성을 맞추려고 만든 것이지요. 게다가 이제는 아예 되먹듯이 쓰고 있지만요.
(그게 여기서 큰 문제거리는 아니고..)

lacovnk님의 생각에 동의하고 있었는데, 정 그게 아니라면 쿠키와 캐시를 지웠을 때야말로 완전히 날아가지 않을까요?

음.. ? (JScript != java script) 였나요?
요즘은 자바스크립 언어를 네스케이프에서 개발하는지,
아니면 M$인지 잘모르겠습니다.

다만, mozilla development center의 reference를 기준으로 코딩하는데..
거기선 1.6이 최신 버전으로 나오네요..
네스케이프에선 reference도 관리않하는듯..?

2005년 11월 11일.

기본적으로 넷스케이프의 자바스크립트가 첫 구현이고, 그걸 따라한 게 마이크로소프트의 JScript이며, 통틀어서 보통 자바스크립트라고 많이 합니다. 이것의 표준화된 버전은 ECMAScript고요.

- 토끼군

addnull의 이미지

그렇군요.
하지만 Java Script(비IE) 건 JScript(IE) 건 양쪽다 메모리 누수 문제가 있는 것 같습니다.

http://jibbering.com/faq/faq_notes/closures.html#clMem
http://www.quirksmode.org/blog/archives/2005/02/javascript_memo.html

Quote:
할당된 메모리가 유효한 기간이

0. 브라우져가 종료될때까지
1. 탭브라우져 상에서 해당 탭이 종료될때까지
2. 다른 싸이트로 이동할때까지 (a.com -> b.com)
3. 같은 싸이트라고 해도 다른 페이지로 이동할때까지. (a.com/a.htm -> a.com/b.htm)

3번이라면 큰 문제가 없겠지만,
0번이라면 문제가 심각할지도 모르겠군요.
대부분의 브라우저유저들이(특히 IE) 여러개의 창을 띄우지 않고
하나의 창에서 계속 서핑을 하니까요.

저도 자바스크립에선 메모리 관리는 신경을 안썼는데,
이제보니 아주 위험한 행동이였네요.

2005년 11월 11일.

소타의 이미지

자바스크립트.. 메모리 신경 엄청 써줘야 합니다 -.-;
전에 위지윅 홈빌더를 맹그는데 메모리를 90메가까지 잡아먹어서 이게 무슨 스타크래프트냐는 소리를 들었음;;

sh.의 이미지

또 다른 메모리누수에 관한 글입니다.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ietechcol/dnwebgen/ie_leak_patterns.asp
http://www.bazon.net/mishoo/articles.epl?art_id=824

문득 기억이 나서 찾아보니 요즘 인기있는 js 라이브러리인 prototype에도 중간에

....
unloadCache: function() {
  if (!Event.observers) return;
  for (var i = 0; i < Event.observers.length; i++) {
    Event.stopObserving.apply(this, Event.observers[i]);
    Event.observers[i][0] = null;
  }
  Event.observers = false;
},
......
/* prevent memory leaks in IE */
Event.observe(window, 'unload', Event.unloadCache, false);

이렇게 명시적으로 해제하네요

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.