home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #27 / NN_1992_27.iso / spool / comp / lang / perl / 7098 < prev    next >
Encoding:
Text File  |  1992-11-22  |  4.0 KB  |  116 lines

  1. Path: sparky!uunet!snorkelwacker.mit.edu!bloom-picayune.mit.edu!senator-bedfellow.mit.edu!athena.mit.edu!jik
  2. From: jik@athena.mit.edu (Jonathan I. Kamens)
  3. Newsgroups: comp.lang.perl
  4. Subject: 4.035 memory leak in very basic functionality
  5. Date: 23 Nov 1992 04:33:29 GMT
  6. Organization: Massachusetts Institute of Technology
  7. Lines: 104
  8. Distribution: world
  9. Message-ID: <1epmupINN21a@senator-bedfellow.MIT.EDU>
  10. NNTP-Posting-Host: pit-manager.mit.edu
  11.  
  12. When I run this perl script:
  13.  
  14. #!/usr/local/bin/perl
  15.  
  16. open(TERMCAP, "/etc/termcap") || die;
  17.  
  18. foreach (1..100) {
  19.     system("ps aux$$");
  20.     if ($_ % 2 == 0) {
  21.     while (<TERMCAP>) {
  22.     }
  23.     seek(TERMCAP, 0, 0);
  24.     }
  25.     else {
  26.     }
  27. }
  28.  
  29. I get this output:
  30.  
  31. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  32. jik       3108  2.2  1.9  438  382 p0 S     0:00  (perl)
  33. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  34. jik       3108  0.4  1.6  438  320 p0 S     0:00  (perl)
  35. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  36. jik       3108  4.5  1.6  470  310 p0 S     0:01  (perl)
  37. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  38. jik       3108  2.4  1.6  470  300 p0 S     0:02  (perl)
  39. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  40. jik       3108  5.7  1.5  486  286 p0 S     0:04  (perl)
  41. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  42. jik       3108  3.4  1.5  486  276 p0 S     0:04  (perl)
  43. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  44. jik       3108  5.5  1.5  502  268 p0 S     0:06  (perl)
  45. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  46. jik       3108  3.7  1.5  502  266 p0 S     0:07  (perl)
  47. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  48. jik       3108  6.6  1.5  518  268 p0 S     0:07  (perl)
  49. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  50. jik       3108  4.2  1.7  518  328 p0 S     0:08  (perl)
  51.  
  52. I generally don't let it run for all 100 iterations, but as far as I've let
  53. it, the trend you see continues -- the size of the process grows by 18k every
  54. other time through the loop.  Note that I only do the reading every other
  55. time through the loop in order to make sure that the system() isn't what's
  56. causing the growth.
  57.  
  58. Here's a C program which does exactly the same thing as the perl script above:
  59.  
  60. #include <stdio.h>
  61.  
  62. main()
  63. {
  64.      int i;
  65.      char cmd_buf[BUFSIZ];
  66.      FILE *termcap;
  67.      char read_buf[BUFSIZ];
  68.  
  69.      sprintf(cmd_buf, "ps aux%d", getpid());
  70.  
  71.      if (! (termcap = fopen("/etc/termcap", "r"))) {
  72.       perror("fopen");
  73.       exit(-1);
  74.      }
  75.      
  76.      for (i = 0; i < 100; i++) {
  77.       system(cmd_buf);
  78.       if (i % 2 == 0) {
  79.            while (fgets(read_buf, sizeof(read_buf), termcap)) {
  80.            }
  81.            fseek(read_buf, 0L, 0);
  82.       }
  83.       else {
  84.       }
  85.      }
  86. }     
  87.  
  88. When I compile and run it, I get this output:
  89.  
  90. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  91. jik       3212  0.7  0.3   36   32 p0 S     0:00  (a.out)
  92. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  93. jik       3212  1.7  0.4   46   40 p0 S     0:00  (a.out)
  94. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  95. jik       3212  0.7  0.4   46   40 p0 S     0:00  (a.out)
  96. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  97. jik       3212  0.3  0.4   46   40 p0 S     0:00  (a.out)
  98. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  99. jik       3212  0.1  0.4   46   40 p0 S     0:00  (a.out)
  100. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  101. jik       3212  0.1  0.4   46   40 p0 S     0:00  (a.out)
  102. USER       PID %CPU %MEM   SZ  RSS TT STAT  TIME COMMAND
  103. jik       3212  0.0  0.4   46   40 p0 S     0:00  (a.out)
  104.  
  105. As you can see, it does *not* grow after any initial growth.
  106.  
  107. Therefore, the growth in the perl process while the script is running can't be
  108. due to stdio bugs on my platform, because a C program using the same stdio
  109. routines that perl should be using does not grow.  It seems to me that it must
  110. be a perl bug, but it is surprising to me that a memory leak should exist in
  111. perl in something as simple as reading a file in a loop.
  112.  
  113. -- 
  114. Jonathan Kamens                                         jik@MIT.Edu
  115. MIT Information Systems/Athena              Moderator, news.answers
  116.