Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/tools/heapstat.py
2723 views
1
#!/usr/bin/python3
2
# This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
3
4
# Given a heap snapshot, this tool gathers basic statistics about the allocated objects
5
# To generate a snapshot, use luaC_dump, ideally preceded by luaC_fullgc
6
7
import json
8
import sys
9
from collections import defaultdict
10
11
def updatesize(d, k, s):
12
oc, os = d.get(k, (0, 0))
13
d[k] = (oc + 1, os + s)
14
15
def sortedsize(p):
16
return sorted(p, key = lambda s: s[1][1], reverse = True)
17
18
def getkey(heap, obj, key):
19
pairs = obj.get("pairs", [])
20
for i in range(0, len(pairs), 2):
21
if pairs[i] and heap[pairs[i]]["type"] == "string" and heap[pairs[i]]["data"] == key:
22
if pairs[i + 1] and heap[pairs[i + 1]]["type"] == "string":
23
return heap[pairs[i + 1]]["data"]
24
else:
25
return None
26
return None
27
28
with open(sys.argv[1]) as f:
29
dump = json.load(f)
30
heap = dump["objects"]
31
32
size_type = {}
33
size_udata = {}
34
size_category = {}
35
36
for addr, obj in heap.items():
37
updatesize(size_type, obj["type"], obj["size"])
38
39
if obj.get("cat") != None:
40
updatesize(size_category, str(obj["cat"]), obj["size"])
41
42
if obj["type"] == "userdata" and "metatable" in obj:
43
metatable = heap[obj["metatable"]]
44
typemt = getkey(heap, metatable, "__type") or "unknown"
45
updatesize(size_udata, typemt, obj["size"])
46
47
print("objects by type:")
48
for type, (count, size) in sortedsize(size_type.items()):
49
print(type.ljust(10), str(size).rjust(8), "bytes", str(count).rjust(5), "objects")
50
51
print()
52
53
print("userdata by __type:")
54
for type, (count, size) in sortedsize(size_udata.items()):
55
print(type.ljust(20), str(size).rjust(8), "bytes", str(count).rjust(5), "objects")
56
57
if len(size_category) != 0:
58
print()
59
60
print("objects by category:")
61
for type, (count, size) in sortedsize(size_category.items()):
62
cat = dump["stats"]["categories"][type]
63
name = cat["name"] if "name" in cat else str(type)
64
print(name.ljust(30), str(size).rjust(8), "bytes", str(count).rjust(5), "objects")
65
66