Enforce the minimum perl version requirement in the Makefile.PL
[p5sagit/Devel-Size.git] / lib / Devel / Size.pm
CommitLineData
e98cedbf 1package Devel::Size;
2
e98cedbf 3use strict;
9fc9ab86 4use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $warn $dangle);
e98cedbf 5
9fc9ab86 6require 5.008;
e98cedbf 7require Exporter;
568039a0 8require XSLoader;
e98cedbf 9
568039a0 10@ISA = qw(Exporter);
e98cedbf 11
9fc9ab86 12# This allows declaration use Devel::Size ':all';
a6ea0805 13%EXPORT_TAGS = ( 'all' => [ qw(
9fc9ab86 14 size total_size
e98cedbf 15) ] );
16
a6ea0805 17@EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
e98cedbf 18
0430b7f7 19@EXPORT = qw( );
0d46c0bd 20$VERSION = '0.72_50';
e98cedbf 21
568039a0 22XSLoader::load( __PACKAGE__);
e98cedbf 23
78dfb4e7 24$warn = 1;
9fc9ab86 25$dangle = 0; ## Set true to enable warnings about dangling pointers
ebb2c5b9 26
e98cedbf 271;
28__END__
e98cedbf 29
6ea94d90 30=pod
31
e98cedbf 32=head1 NAME
33
0bff12d8 34Devel::Size - Perl extension for finding the memory usage of Perl variables
e98cedbf 35
36=head1 SYNOPSIS
37
0bff12d8 38 use Devel::Size qw(size total_size);
e98cedbf 39
0bff12d8 40 my $size = size("A string");
41
42 my @foo = (1, 2, 3, 4, 5);
43 my $other_size = size(\@foo);
44
45 my $foo = {a => [1, 2, 3],
9fc9ab86 46 b => {a => [1, 3, 4]}
5c2e1b12 47 };
5a83b7cf 48 my $total_size = total_size($foo);
5c2e1b12 49
e98cedbf 50=head1 DESCRIPTION
51
5a83b7cf 52This module figures out the real size of Perl variables in bytes, as
53accurately as possible.
54
0bff12d8 55Call functions with a reference to the variable you want the size
56of. If the variable is a plain scalar it returns the size of
5a83b7cf 57this scalar. If the variable is a hash or an array, use a reference
0bff12d8 58when calling.
59
60=head1 FUNCTIONS
61
62=head2 size($ref)
e98cedbf 63
5c2e1b12 64The C<size> function returns the amount of memory the variable
0bff12d8 65returns. If the variable is a hash or an array, it only reports
66the amount used by the structure, I<not> the contents.
67
68=head2 total_size($ref)
5c2e1b12 69
0bff12d8 70The C<total_size> function will traverse the variable and look
71at the sizes of contents. Any references contained in the variable
72will also be followed, so this function can be used to get the
73total size of a multidimensional data structure. At the moment
74there is no way to get the size of an array or a hash and its
75elements without using this function.
5c2e1b12 76
b98fcdb9 77=head1 EXPORT
e98cedbf 78
0bff12d8 79None but default, but optionally C<size> and C<total_size>.
e98cedbf 80
b98fcdb9 81=head1 UNDERSTANDING MEMORY ALLOCATION
82
83Please note that the following discussion of memory allocation in perl
84is based on the perl 5.8.0 sources. While this is generally
85applicable to all versions of perl, some of the gory details are
86omitted. It also makes some presumptions on how your system memory
87allocator works so, while it will be generally correct, it may not
88exactly reflect your system. (Generally the only issue is the size of
89the constant values we'll talk about, not their existence)
90
91=head2 The C library
92
9fc9ab86 93It's important first to understand how your OS and libraries handle
b98fcdb9 94memory. When the perl interpreter needs some memory, it asks the C
95runtime library for it, using the C<malloc()> call. C<malloc> has one
96parameter, the size of the memory allocation you want, and returns a
97pointer to that memory. C<malloc> also makes sure that the pointer it
98returns to you is properly aligned. When you're done with the memory
99you hand it back to the library with the C<free()> call. C<free> has
9fc9ab86 100one parameter, the pointer that C<malloc> returned.
101There are a couple of interesting ramifications to this.
b98fcdb9 102
103Because malloc has to return an aligned pointer, it will round up the
104memory allocation to make sure that the memory it returns is aligned
105right. What that alignment is depends on your CPU, OS, and compiler
106settings, but things are generally aligned to either a 4 or 8 byte
107boundary. That means that if you ask for 1 byte, C<malloc> will
108silently round up to either 4 or 8 bytes, though it doesn't tell the
109program making the request, so the extra memory can't be used.
110
111Since C<free> isn't given the size of the memory chunk you're
112freeing, it has to track it another way. Most libraries do this by
113tacking on a length field just before the memory it hands to your
114program. (It's put before the beginning rather than after the end
115because it's less likely to get mangled by program bugs) This size
116field is the size of your platform integer, Generally either 4 or 8
117bytes.
118
119So, if you asked for 1 byte, malloc would build something like this:
120
121 +------------------+
122 | 4 byte length |
123 +------------------+ <----- the pointer malloc returns
124 | your 1 byte |
125 +------------------+
126 | 3 bytes padding |
127 +------------------+
128
129As you can see, you asked for 1 byte but C<malloc> used 8. If your
130integers were 8 bytes rather than 4, C<malloc> would have used 16 bytes
131to satisfy your 1 byte request.
132
133The C memory allocation system also keeps a list of free memory
134chunks, so it can recycle freed memory. For performance reasons, some
135C memory allocation systems put a limit to the number of free
136segments that are on the free list, or only search through a small
137number of memory chunks waiting to be recycled before just
138allocating more memory from the system.
139
140The memory allocation system tries to keep as few chunks on the free
141list as possible. It does this by trying to notice if there are two
142adjacent chunks of memory on the free list and, if there are,
143coalescing them into a single larger chunk. This works pretty well,
144but there are ways to have a lot of memory on the free list yet still
145not have anything that can be allocated. If a program allocates one
146million eight-byte chunks, for example, then frees every other chunk,
147there will be four million bytes of memory on the free list, but none
148of that memory can be handed out to satisfy a request for 10
149bytes. This is what's referred to as a fragmented free list, and can
150be one reason why your program could have a lot of free memory yet
151still not be able to allocate more, or have a huge process size and
152still have almost no memory actually allocated to the program running.
153
154=head2 Perl
155
156Perl's memory allocation scheme is a bit convoluted, and more complex
0430b7f7 157than can really be addressed here, but there is one common spot where Perl's
b98fcdb9 158memory allocation is unintuitive, and that's for hash keys.
159
160When you have a hash, each entry has a structure that points to the
161key and the value for that entry. The value is just a pointer to the
162scalar in the entry, and doesn't take up any special amount of
163memory. The key structure holds the hash value for the key, the key
164length, and the key string. (The entry and key structures are
165separate so perl can potentially share keys across multiple hashes)
166
167The entry structure has three pointers in it, and takes up either 12
168or 24 bytes, depending on whether you're on a 32 bit or 64 bit
169system. Since these structures are of fixed size, perl can keep a big
170pool of them internally (generally called an arena) so it doesn't
171have to allocate memory for each one.
172
173The key structure, though, is of variable length because the key
174string is of variable length, so perl has to ask the system for a
175memory allocation for each key. The base size of this structure is
1768 or 16 bytes (once again, depending on whether you're on a 32 bit or
17764 bit system) plus the string length plus two bytes.
178
179Since this memory has to be allocated from the system there's the
180malloc size-field overhead (4 or 8 bytes) plus the alignment bytes (0
181to 7, depending on your system and the key length)
182that get added on to the chunk perl requests. If the key is only 1
183character, and you're on a 32 bit system, the allocation will be 16
184bytes. If the key is 7 characters then the allocation is 24 bytes on
185a 32 bit system. If you're on a 64 bit system the numbers get even
186larger.
187
b98fcdb9 188=head1 DANGERS
189
c037a281 190Since version 0.72, Devel::Size uses a new pointer tracking mechanism
9fc9ab86 191that consumes far less memory than was previously the case. It does this
192by using a bit vector where 1 bit represents each 4- or 8-byte aligned pointer
193(32- or 64-bit platform dependant) that could exist. Further, it segments
194that bit vector and only allocates each chunk when an address is seen within
30fe4f47 195that chunk. Since version 0.73, chunks are allocated in blocks of 2**16 bits
196(ie 8K), accessed via a 256-way tree. The tree is 2 levels deep on a 32 bit
197system, 6 levels deep on a 64 bit system. This avoids having make any
198assumptions about address layout on 64 bit systems or trade offs about sizes
199to allocate. It assumes that the addresses of allocated pointers are reasonably
200contiguous, so that relevant parts of the tree stay in the CPU cache.
9fc9ab86 201
202Besides saving a lot of memory, this change means that Devel::Size
203runs significantly faster than previous versions.
204
5073b933 205=head1 Messages: texts originating from this module.
206
207=head2 Errors
208
209=over 4
210
9fc9ab86 211=item "Devel::Size: Unknown variable type"
212
213The thing (or something contained within it) that you gave to
5073b933 214total_size() was unrecognisable as a Perl entity.
215
216=back
217
218=head2 warnings
219
9fc9ab86 220These messages warn you that for some types, the sizes calculated may not include
221everything that could be associated with those types. The differences are usually
5073b933 222insignificant for most uses of this module.
223
224These may be disabled by setting
225
9fc9ab86 226 $Devel::Size::warn = 0
5073b933 227
228=over 4
229
9fc9ab86 230=item "Devel::Size: Calculated sizes for CVs are incomplete"
231
232=item "Devel::Size: Calculated sizes for FMs are incomplete"
5073b933 233
9fc9ab86 234=item "Devel::Size: Calculated sizes for compiled regexes are incompatible, and probably always will be"
235
236=back
237
c037a281 238=head2 New warnings since 0.72
9fc9ab86 239
240Devel::Size has always been vulnerable to trapping when traversing Perl's
241internal data structures, if it encounters uninitialised (dangling) pointers.
242
1a36ac09 243MSVC provides exception handling able to deal with this possibility, and when
244built with MSVC Devel::Size will now attempt to ignore (or log) them and
245continue. These messages are mainly of interest to Devel::Size and core
246developers, and so are disabled by default.
9fc9ab86 247
248They may be enabled by setting
249
250 $Devel::Size::dangle = 0
251
252=over 4
253
254=item "Devel::Size: Can't determine class of operator OPx_XXXX, assuming BASEOP\n"
255
256=item "Devel::Size: Encountered bad magic at: 0xXXXXXXXX"
257
258=item "Devel::Size: Encountered dangling pointer in opcode at: 0xXXXXXXXX"
259
260=item "Devel::Size: Encountered invalid pointer: 0xXXXXXXXX"
5073b933 261
5073b933 262=back
263
e98cedbf 264=head1 BUGS
265
fea63ffa 266Doesn't currently walk all the bits for code refs, formats, and
6a9ad7ec 267IO. Those throw a warning, but a minimum size for them is returned.
e98cedbf 268
b98fcdb9 269Devel::Size only counts the memory that perl actually allocates. It
270doesn't count 'dark' memory--memory that is lost due to fragmented free lists,
271allocation alignments, or C library overhead.
272
e98cedbf 273=head1 AUTHOR
274
275Dan Sugalski dan@sidhe.org
276
98ecbbc6 277Small portion taken from the B module as shipped with perl 5.6.2.
278
9fc9ab86 279New pointer tracking & exception handling by BrowserUK
280
0430b7f7 281Maintained now by Tels <http://bloodgate.com>
282
98ecbbc6 283=head1 COPYRIGHT
284
6ea94d90 285Copyright (C) 2005 Dan Sugalski, Copyright (C) 2007-2008 Tels
98ecbbc6 286
287This module is free software; you can redistribute it and/or modify it
5a83b7cf 288under the same terms as Perl v5.8.8.
98ecbbc6 289
e98cedbf 290=head1 SEE ALSO
291
0430b7f7 292perl(1), L<Devel::Size::Report>.
e98cedbf 293
294=cut