dckrooney
dckrooney

Reputation: 3121

Getting in-memory size of an object in Powershell

I've got a (long-running) script that I'm trying execute. Unfortunately, as it runs, the memory usage of powershell begins to creep up. The script is relatively simple, and I can't see any obvious memory leaks. However, I am using an API which may be poorly behaved.

Is there an easy way to get the in-memory size of an object from within powershell, so I can see if my suspicions are correct?

Upvotes: 6

Views: 13651

Answers (3)

js2010
js2010

Reputation: 27491

This looks right, from reddit. At least for simple types.

using namespace System.Runtime.InteropServices
$tmp = 1234567890 # int32
[Marshal]::SizeOf($tmp)

4


$tmp = 12345678900 # int64
[Marshal]::SizeOf($tmp)

8


$tmp = 12345678900000000000 # decimal
[Marshal]::SizeOf($tmp)

16


[Marshal]::SizeOf

OverloadDefinitions
-------------------
static int SizeOf(System.Object structure)
static int SizeOf(type t)
static int SizeOf[T](T structure)
static int SizeOf[T]()

Upvotes: 0

CB.
CB.

Reputation: 60938

Another approx way:

$before = [gc]::GetTotalMemory($true)
$s = "A new string object"
$after = [gc]::GetTotalMemory($true)

($after - $before)/1kb # return the delta in KBytes

Upvotes: 6

Andy Arismendi
Andy Arismendi

Reputation: 52639

Perhaps a crude way to do would be something like this:

$memBefore = (Get-Process -id $pid).WS
# Create object here...
$memAfter = (Get-Process -id $pid).WS
($memAfter - $memBefore) / 1KB

If it is a memory leak you might be able to mitigate it with:

[gc]::Collect()

Upvotes: 9

Related Questions