memory_profiler 0.9.6 → 0.9.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +33 -0
- data/README.md +0 -30
- data/lib/memory_profiler/helpers.rb +1 -1
- data/lib/memory_profiler/polychrome.rb +0 -4
- data/lib/memory_profiler/reporter.rb +19 -34
- data/lib/memory_profiler/results.rb +5 -1
- data/lib/memory_profiler/top_n.rb +6 -7
- data/lib/memory_profiler/version.rb +1 -1
- metadata +5 -74
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b3f841c1bfcbaecdaccf8359aa37a7d42605c485
|
4
|
+
data.tar.gz: 599119026dfb887ffc810d81da2b17a9e71f29cf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac957555ecad713d83c891c87bf118f1a00dcf0633d1f18b3d38181b472f654db5218eb3c6494d66ae7b3a5da8bdd9425a4457a3c5e77f69514d8628490cba98
|
7
|
+
data.tar.gz: 54eb5dc1456d906452b152b000abcaca1d6b229d70e259ca54b2bad36476d69a94edbb2666daa603595a174f468ea7edf619e8afe6554ad3e2606443fbd1d11a
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Changelog
|
2
|
+
|
3
|
+
## 0.9.7
|
4
|
+
- Improved class name detection for proxy objects, BasicObject objects, and
|
5
|
+
other edge cases @inossidabile @Hamdiakoguz @dgynn
|
6
|
+
|
7
|
+
## 0.9.6
|
8
|
+
- FIX: pretty_print was failing under some conditions @vincentwoo
|
9
|
+
- FIX: if #class is somehow nil don't crash @vincentwoo
|
10
|
+
|
11
|
+
## 0.9.5
|
12
|
+
- Improved stability and performance @dgynn
|
13
|
+
|
14
|
+
## 0.9.4
|
15
|
+
- FIX: remove incorrect RVALUE offset on 2.2 @dgynn
|
16
|
+
- FEATURE: add total memory usage @dgynn
|
17
|
+
|
18
|
+
## 0.9.3
|
19
|
+
- Add class reporting
|
20
|
+
|
21
|
+
## 0.9.2
|
22
|
+
- Fix incorrect syntax in rescue clause
|
23
|
+
|
24
|
+
## 0.9.0
|
25
|
+
- This is quite stable, upping version to reflect
|
26
|
+
- Fixed bug where it would crash when location was nil for some reason
|
27
|
+
|
28
|
+
## 0.0.4
|
29
|
+
- Added compatibility with released version of Ruby 2.1.0
|
30
|
+
- Cleanup to use latest APIs available in 2.1.0
|
31
|
+
|
32
|
+
## 0.0.3
|
33
|
+
- Added string analysis
|
data/README.md
CHANGED
@@ -362,33 +362,3 @@ Memory profiler also performs some String analysis to help you find strings that
|
|
362
362
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
363
363
|
4. Push to the branch (`git push origin my-new-feature`)
|
364
364
|
5. Create new Pull Request
|
365
|
-
|
366
|
-
## Changelog
|
367
|
-
|
368
|
-
### 0.9.6
|
369
|
-
- FIX: pretty_print was failing under some conditions @vincentwoo
|
370
|
-
- FIX: if #class is somehow nil don't crash @vincentwoo
|
371
|
-
|
372
|
-
### 0.9.5
|
373
|
-
- Improved stability and performance @dgynn
|
374
|
-
|
375
|
-
### 0.9.4
|
376
|
-
- FIX: remove incorrect RVALUE offset on 2.2 @dgynn
|
377
|
-
- FEATURE: add total memory usage @dgynn
|
378
|
-
|
379
|
-
### 0.9.3
|
380
|
-
- Add class reporting
|
381
|
-
|
382
|
-
### 0.9.2
|
383
|
-
- Fix incorrect syntax in rescue clause
|
384
|
-
|
385
|
-
### 0.9.0
|
386
|
-
- This is quite stable, upping version to reflect
|
387
|
-
- Fixed bug where it would crash when location was nil for some reason
|
388
|
-
|
389
|
-
### 0.0.4
|
390
|
-
- Added compatibility with released version of Ruby 2.1.0
|
391
|
-
- Cleanup to use latest APIs available in 2.1.0
|
392
|
-
|
393
|
-
### 0.0.3
|
394
|
-
- Added string analysis
|
@@ -48,14 +48,8 @@ module MemoryProfiler
|
|
48
48
|
|
49
49
|
ObjectSpace.each_object do |obj|
|
50
50
|
next unless ObjectSpace.allocation_generation(obj) == generation
|
51
|
-
|
52
|
-
|
53
|
-
retained[obj.__id__] = found if found
|
54
|
-
rescue
|
55
|
-
# __id__ is not defined on BasicObject, skip it
|
56
|
-
# we can probably transplant the object_id at this point,
|
57
|
-
# but it is quite rare
|
58
|
-
end
|
51
|
+
found = allocated[obj.__id__]
|
52
|
+
retained[obj.__id__] = found if found
|
59
53
|
end
|
60
54
|
ObjectSpace.trace_object_allocations_clear
|
61
55
|
|
@@ -70,52 +64,43 @@ module MemoryProfiler
|
|
70
64
|
# Stores results along with meta data of objects collected.
|
71
65
|
def object_list(generation)
|
72
66
|
|
73
|
-
objs = []
|
74
|
-
|
75
|
-
ObjectSpace.each_object do |obj|
|
76
|
-
next unless ObjectSpace.allocation_generation(obj) == generation
|
77
|
-
begin
|
78
|
-
if !trace || trace.include?(obj.class)
|
79
|
-
objs << obj
|
80
|
-
end
|
81
|
-
rescue
|
82
|
-
# may not respond to class so skip
|
83
|
-
end
|
84
|
-
end
|
85
|
-
|
86
67
|
rvalue_size = GC::INTERNAL_CONSTANTS[:RVALUE_SIZE]
|
87
68
|
rvalue_size_adjustment = RUBY_VERSION < '2.2' ? rvalue_size : 0
|
88
69
|
helper = Helpers.new
|
89
70
|
|
90
71
|
result = StatHash.new.compare_by_identity
|
91
72
|
|
92
|
-
|
73
|
+
ObjectSpace.each_object do |obj|
|
74
|
+
next unless ObjectSpace.allocation_generation(obj) == generation
|
75
|
+
|
93
76
|
file = ObjectSpace.allocation_sourcefile(obj) || "(no name)".freeze
|
94
77
|
next if @ignore_files && @ignore_files =~ file
|
95
78
|
next if @allow_files && !(@allow_files =~ file)
|
96
79
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
80
|
+
klass = obj.class rescue nil
|
81
|
+
unless Class === klass
|
82
|
+
# attempt to determine the true Class when .class returns something other than a Class
|
83
|
+
klass = Kernel.instance_method(:class).bind(obj).call
|
84
|
+
end
|
85
|
+
next if @trace && !trace.include?(klass)
|
103
86
|
|
104
87
|
begin
|
105
|
-
|
88
|
+
line = ObjectSpace.allocation_sourceline(obj)
|
89
|
+
location = helper.lookup_location(file, line)
|
90
|
+
class_name = helper.lookup_class_name(klass)
|
91
|
+
gem = helper.guess_gem(file)
|
92
|
+
|
93
|
+
string = '' << obj if klass == String
|
106
94
|
|
107
95
|
memsize = ObjectSpace.memsize_of(obj) + rvalue_size_adjustment
|
108
96
|
# compensate for API bug
|
109
97
|
memsize = rvalue_size if memsize > 100_000_000_000
|
110
|
-
result[
|
98
|
+
result[obj.__id__] = MemoryProfiler::Stat.new(class_name, gem, file, location, memsize, string)
|
111
99
|
rescue
|
112
|
-
#
|
100
|
+
# give up if any any error occurs inspecting the object
|
113
101
|
end
|
114
102
|
end
|
115
103
|
|
116
|
-
# Although `objs` will go out of scope, clear the array so objects can definitely be GCd
|
117
|
-
objs.clear
|
118
|
-
|
119
104
|
result
|
120
105
|
end
|
121
106
|
end
|
@@ -63,7 +63,11 @@ module MemoryProfiler
|
|
63
63
|
# @param [Hash] options the options for output
|
64
64
|
# @option opts [String] :to_file a path to your log file
|
65
65
|
# @option opts [Boolean] :color_output a flag for whether to colorize output
|
66
|
-
def pretty_print(io =
|
66
|
+
def pretty_print(io = $stdout, **options)
|
67
|
+
# Handle the special case that Ruby PrettyPrint expects `pretty_print`
|
68
|
+
# to be a customized pretty printing function for a class
|
69
|
+
return io.pp_object(self) if defined?(PP) && io.is_a?(PP)
|
70
|
+
|
67
71
|
io = File.open(options[:to_file], "w") if options[:to_file]
|
68
72
|
|
69
73
|
color_output = options.fetch(:color_output) { io.respond_to?(:isatty) && io.isatty }
|
@@ -2,16 +2,15 @@ module MemoryProfiler
|
|
2
2
|
module TopN
|
3
3
|
# Fast approach for determining the top_n entries in a Hash of Stat objects.
|
4
4
|
# Returns results for both memory (memsize summed) and objects allocated (count) as a tuple.
|
5
|
-
def top_n(max,
|
5
|
+
def top_n(max, metric_method)
|
6
6
|
|
7
|
-
|
7
|
+
stat_totals = self.values.group_by(&metric_method).map do |metric, stats|
|
8
|
+
[metric, stats.reduce(0) { |sum, stat| sum + stat.memsize }, stats.size]
|
9
|
+
end
|
8
10
|
|
9
|
-
|
10
|
-
map { |key, values| [key, values.reduce(0) { |sum, item| _key, memsize = item ; sum + memsize }, values.size] }
|
11
|
-
|
12
|
-
stats_by_memsize = stat_totals.sort_by! { |metric, memsize, _count| [-memsize, metric] }.first(max).
|
11
|
+
stats_by_memsize = stat_totals.sort_by! { |metric, memsize, _count| [-memsize, metric] }.take(max).
|
13
12
|
map! { |metric, memsize, _count| { data: metric, count: memsize } }
|
14
|
-
stats_by_count = stat_totals.sort_by! { |metric, _memsize, count| [-count, metric] }.
|
13
|
+
stats_by_count = stat_totals.sort_by! { |metric, _memsize, count| [-count, metric] }.take(max).
|
15
14
|
map! { |metric, _memsize, count| { data: metric, count: count } }
|
16
15
|
|
17
16
|
[stats_by_memsize, stats_by_count]
|
metadata
CHANGED
@@ -1,85 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memory_profiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Saffron
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.3'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '1.3'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - ">="
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: minitest
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: guard
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ">="
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - ">="
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: guard-minitest
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
11
|
+
date: 2016-11-06 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
83
13
|
description: Memory profiling routines for Ruby 2.1+
|
84
14
|
email:
|
85
15
|
- sam.saffron@gmail.com
|
@@ -87,6 +17,7 @@ executables: []
|
|
87
17
|
extensions: []
|
88
18
|
extra_rdoc_files: []
|
89
19
|
files:
|
20
|
+
- CHANGELOG.md
|
90
21
|
- LICENSE.txt
|
91
22
|
- README.md
|
92
23
|
- lib/memory_profiler.rb
|
@@ -119,7 +50,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
50
|
version: '0'
|
120
51
|
requirements: []
|
121
52
|
rubyforge_project:
|
122
|
-
rubygems_version: 2.
|
53
|
+
rubygems_version: 2.5.1
|
123
54
|
signing_key:
|
124
55
|
specification_version: 4
|
125
56
|
summary: Memory profiling routines for Ruby 2.1+
|