unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
Cc: emacs-devel@gnu.org
Subject: Re: Debugging memory leaks/stale references
Date: Mon, 27 Sep 2004 15:52:06 -0400	[thread overview]
Message-ID: <jwv655zqyy1.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <871xgnmree.fsf@deneb.enyo.de> (Florian Weimer's message of "Mon, 27 Sep 2004 21:40:57 +0200")

> while they are traversed.  Unfortunately, no major leak turned up,
> just a few thousand cons cells which can't cause the massive leak I
> see (in the order of dozens of megabytes after entering/exiting a
> large NNTP group with Gnus).

I think it would be worthwhile to start with the basic info returned by
`garbage-collect' and such stuff.  See `memory-usage.el' below.
[ I thought you already tried that, but the few lines above make me think
that you don't even know whether the extra MBs are made up of cons cells, or
strings, or non-elisp-data, or ...]

> Is there a method to determine the (approximate) size of a buffer?

See buffer-size-bytes below.

> Are there any other objects that can change their size after
> allocation?  (I'm pretty sure that there are no additional Lisp
> objects allocated, but maybe an existing object grows without bounds.)

Yes.  Things like the specpdl "stack", the matrices used in display, maybe
the text-property-tree nodes, ...


        Stefan


;;; memory-usage.el --- Analyze the memory usage of Emacs in various ways

;; Copyright (C) 2002, 2004  Free Software Foundation, Inc.

;; Author: Stefan Monnier <monnier@cs.yale.edu>
;; Keywords: maint

;; This file is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.

;; This file is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING.  If not, write to
;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
;; Boston, MA 02111-1307, USA.

;;; Commentary:

;; 

;;; Code:

(defun buffer-size-bytes (b)
  "Return total number of bytes in the buffer contents."
  (with-current-buffer b
    (save-restriction
      (widen)
      (- (position-bytes (point-max)) (position-bytes (point-min))))))

(defun buffer-gap-bytes (b)
  "Return total number of bytes in the buffer gap."
  (with-current-buffer b
    (gap-size)))

(defun buffer-total-bytes (b)
  "Return total number of ralloc bytes used by buffer."
  (with-current-buffer b
    (save-restriction
      (widen) 
      (+ (position-bytes (point-max))
	 (- (position-bytes (point-min)))
	 (gap-size)))))

;;;###autoload
(defun memory-usage ()
  "List all buffers and their memory usage."
  (interactive)
  (pop-to-buffer (get-buffer-create "*Buffer Details*"))
  (erase-buffer)
  (let* ((bufs (buffer-list))
	 (num (length bufs))
	 (gc-stats (garbage-collect))
	 (conses (nth 0 gc-stats))
	 (symbols (nth 1 gc-stats))
	 (markers (nth 2 gc-stats))
	 (strings (nth 3 gc-stats))
	 (vectors (nth 4 gc-stats))
	 (floats (nth 5 gc-stats))
	 (intervals (nth 6 gc-stats)))
    (insert (format "Garbage collection stats:\n%s\n\n =>" gc-stats))
    (insert (format "\t%d bytes in cons cells\n" (* 8 (+ (car conses) (cdr conses)))))
    (insert (format "\t%d bytes in symbols\n" (* 24 (+ (car symbols) (cdr symbols)))))
    (insert (format "\t%d bytes in markers\n" (* 20 (+ (car markers) (cdr markers)))))
    (insert (format "\t%d bytes of string chars\n" strings))
    (insert (format "\t%d bytes of vector slots\n" (* 4 vectors)))
    (insert (format "\t%d bytes in floats\n" (* 12 (+ (car floats) (cdr floats)))))
    (insert (format "\t%d bytes in intervals\n" (* 28 (+ (car intervals) (cdr intervals)))))

    (insert (format "\nTotal bytes in lisp objects (not counting string and vector headers): %d\n\n"
		    (+ (* 8 (+ (car conses) (cdr conses)))
		       (* 24 (+ (car symbols) (cdr symbols)))
		       (* 20 (+ (car markers) (cdr markers)))
		       strings
		       vectors
		       (* 12 (+ (car floats) (cdr floats)))
		       (* 28 (+ (car intervals) (cdr intervals))))))

    (insert (format "Buffer ralloc memory usage:\n%d buffers\n%d bytes total (%d in gaps)\n"
		    num
		    (apply #'+ (mapcar #'buffer-total-bytes bufs))
		    (apply #'+ (mapcar #'buffer-gap-bytes bufs))))
    (insert (format "%10s\t%s\t%s\n\n" "Size" "Gap" "Name"))
    (insert (mapconcat
	     (lambda (b)
	       (format "%10d\t%s\t%s"
		       (buffer-size-bytes b)
		       (buffer-gap-bytes b)
		       (buffer-name b)))
	     (sort bufs (lambda (b1 b2)
			  (> (buffer-size-bytes b1) (buffer-size-bytes b2))))
	     "\n"))
    (insert "\n"))
  (goto-char (point-min)))


(provide 'memory-usage)
;; arch-tag: 04e012f0-3c59-4319-8d1a-e86204671ec5
;;; memory-usage.el ends here

  reply	other threads:[~2004-09-27 19:52 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-09-21 17:38 Debugging memory leaks/stale references Florian Weimer
2004-09-21 19:49 ` Simon Josefsson
2004-09-27 19:40   ` Florian Weimer
2004-09-27 19:52     ` Stefan Monnier [this message]
2004-09-27 20:36       ` Florian Weimer
2004-09-27 20:49         ` Stefan Monnier
2004-09-27 20:48       ` Simon Josefsson
2004-09-28 15:20     ` Richard Stallman
2004-09-28 21:00       ` Florian Weimer
2004-09-28 21:51         ` Florian Weimer
2004-09-29 16:39         ` Richard Stallman
2004-09-29 23:51         ` Kenichi Handa
2004-09-28 21:40       ` Kim F. Storm
2004-09-21 19:57 ` Stefan Monnier
2004-09-21 21:01   ` Florian Weimer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=jwv655zqyy1.fsf-monnier+emacs@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).