.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.43) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Devel::MAT::Tool::Sizes 3pm" .TH Devel::MAT::Tool::Sizes 3pm "2023-03-26" "perl v5.36.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" "Devel::MAT::Tool::Sizes" \- calculate sizes of SV structures .SH "DESCRIPTION" .IX Header "DESCRIPTION" This \f(CW\*(C`Devel::MAT\*(C'\fR tool calculates the sizes of the structures around SVs. The individual size of each individual \s-1SV\s0 is given by the \f(CW\*(C`size\*(C'\fR method, though in several cases SVs can be considered to be part of larger structures of a combined aggregate size. This tool calculates those sizes and adds them to the \s-1UI.\s0 .PP The structural size is calculated from the basic size of the \s-1SV,\s0 added to which for various types is: .IP "\s-1ARRAY\s0" 2 .IX Item "ARRAY" Arrays add the basic size of every non-mortal element \s-1SV.\s0 .IP "\s-1HASH\s0" 2 .IX Item "HASH" Hashes add the basic size of every non-mortal value \s-1SV.\s0 .IP "\s-1CODE\s0" 2 .IX Item "CODE" Codes add the basic size of their padlist and constant value, and all their padnames, pads, constants and globrefs. .PP The owned size is calculated by starting at the given \s-1SV\s0 and accumulating the set of every strong outref whose refcount is 1. This is the set of all SVs the original directly owns. .SH "SV METHODS" .IX Header "SV METHODS" This tool adds the following \s-1SV\s0 methods. .SS "structure_set" .IX Subsection "structure_set" .Vb 1 \& @svs = $sv\->structure_set .Ve .PP Returns the total set of the \s-1SV\s0's structure. .SS "structure_size" .IX Subsection "structure_size" .Vb 1 \& $size = $sv\->structure_size .Ve .PP Returns the size, in bytes, of the structure that the \s-1SV\s0 contains. .SS "owned_set" .IX Subsection "owned_set" .Vb 1 \& @svs = $sv\->owned_set .Ve .PP Returns the set of every \s-1SV\s0 owned by the given one. .SS "owned_size" .IX Subsection "owned_size" .Vb 1 \& $size = $sv\->owned_size .Ve .PP Returns the total size, in bytes, of the SVs owned by the given one. .SH "COMMANDS" .IX Header "COMMANDS" .SS "size" .IX Subsection "size" Prints the sizes of a given \s-1SV\s0 .PP .Vb 5 \& pmat> size defstash \& STASH(61) at 0x556e47243e10=defstash consumes: \& 2.1 KiB directly \& 11.2 KiB structurally \& 54.2 KiB including owned referrants .Ve .SS "largest" .IX Subsection "largest" .Vb 9 \& pmat> largest \-owned \& STASH(61) at 0x55e4317dfe10: 54.2 KiB: of which \& | GLOB(%*) at 0x55e43180be60: 16.9 KiB: of which \& | | STASH(40) at 0x55e43180bdd0: 16.7 KiB \& | | GLOB(&*) at 0x55e4318ad330: 2.8 KiB \& | | others: 15.0 KiB \& | GLOB(%*) at 0x55e4317fdf28: 4.1 KiB: of which \& | | STASH(34) at 0x55e4317fdf40: 4.0 KiB bytes \& ... .Ve .PP Finds and prints the largest SVs by size. The 5 largest SVs are shown. .PP If counting sizes in a way that includes referred SVs, a tree is printed showing the 3 largest SVs within these, and of those the 2 largest referred SVs again. This should help identify large memory occupiers. .PP Takes the following named options: .IP "\-\-struct" 4 .IX Item "--struct" Count SVs using the structural size. .IP "\-\-owned" 4 .IX Item "--owned" Count SVs using the owned size. .PP By default, only the individual \s-1SV\s0 size is counted. .SH "AUTHOR" .IX Header "AUTHOR" Paul Evans