The Memory Savings of Shared Libraries


A recent thread in the FreeBSD ports mailing list discusses the benefits and drawbacks of static builds. How can we measure the memory savings of shared libraries?

Here is a Perl script I used for providing concrete data for the benefits of shared libraries in my book Code Quality.


# Map from .so inodes to file names
open(IN, q{locate .so | grep -v obj | xargs ls -li | grep -v -e '->'|}) || die;
while (<IN>) {
	@F = split;
	$fname{$F[0]} = $F[9];

# Get a list of all shared objects
open(IN, q{fstat -m | grep mmap | sed 's/rw$/ r/' | sort -u|}) || die;
while (<IN>) {
	@F = split;
	if (defined($fname{$F[5]})) {
		$size{$fname{$F[5]}} = $F[7];
		$unshared += $F[7];

for $fname (keys %size) {
	$ssize += $size{$fname};

print "$nobj shared objects sharing $ssize of memory with $mmap mappings.
Without shared libraries $unshared bytes would be needed.\n";
I rerun today the script on a web server running FreeBSD 6.2, and I found 98 shared objects sharing 16,790,901 bytes of memory through 1,002 mappings. Without shared libraries the corresponding binaries would require 198,815,270 bytes - an order of magnitude more memory.

On the FreeBSD project shell login server I found 58 shared objects sharing 11,285,262 bytes of memory through 2,127 mappings. Without shared libraries the corresponding binaries would require 515,107,268 bytes - 50 times more.

These are not just memory savings, but, more importantly on a modern system, they contribute to improved locality in the code cache.

Comments   Toot! Share

Last modified: Saturday, October 6, 2007 9:16 pm

Creative Commons Licence BY NC

Unless otherwise expressly stated, all original material on this page created by Diomidis Spinellis is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.