heapy 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b131d0e81d19b2300e8394621ac69b9d1c807799
4
- data.tar.gz: 5b97ee60930ac796ed435cd80d94890f4f5c4357
3
+ metadata.gz: 56f148e16da6c3dd3e07b1db360eb39e3ff9d076
4
+ data.tar.gz: a00043f1abb083c6902f5ad9a113c877a2de1857
5
5
  SHA512:
6
- metadata.gz: b82a202eed50c2666af6a1189c26a19b9db3769e5ffe3399e4fdf1f18130a553a962673e8517968a88c52a270279411e2d8d5f390de8ba617440d300c159e72b
7
- data.tar.gz: e36598de3f6b07f3b7651433686db9214c93c249ab29c94f0f14c5f6fd15249a00f0fae1f80d5e09e981bb3908953220b241fc6cd19ce03b36419e358cd38cf5
6
+ metadata.gz: 7afc522e6d2fe8f666ebf00bfa8f002be1bc38c98891fdfee88f5cb407d45ec3701fa09f4c2adcf1f6a98466f48cd0332f9479888e927bc2c53457560ab1300f
7
+ data.tar.gz: ea9e2a37f6e00973b820f526b894cfb4637e15f20135a5aceed2b87ad71634290b004c13c67542f050f6473145a180bf2e2d17207d46e9a1faf98c045f5826b1
@@ -0,0 +1,4 @@
1
+ ## 0.1.1
2
+
3
+ - Less memory retention when parsing large heap dumps.
4
+ - Improved output format.
data/README.md CHANGED
@@ -44,11 +44,14 @@ $ heapy read tmp/2015-10-01T10:18:59-05:00-heap.dump 17
44
44
  Analyzing Heap (Generation: 17)
45
45
  -------------------------------
46
46
 
47
- allocated by memory (in bytes)
47
+ allocated by memory (44061517) (in bytes)
48
48
  ==============================
49
- /Users/richardschneeman/Documents/projects/codetriage/app/views/layouts/application.html.slim:1 (Memory: 377065, Count: 1 )
50
- /Users/richardschneeman/.gem/ruby/2.2.3/gems/actionview-4.2.3/lib/action_view/template.rb:296 (Memory: 35814, Count: 67 )
51
- /Users/richardschneeman/.gem/ruby/2.2.3/gems/activerecord-4.2.3/lib/active_record/attribute.rb:5 (Memory: 30672, Count: 426 )
49
+ 39908512 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/timeout.rb:79
50
+ 1284993 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/openssl/buffering.rb:182
51
+ 201068 /app/vendor/bundle/ruby/2.2.0/gems/json-1.8.3/lib/json/common.rb:223
52
+ 189272 /app/vendor/bundle/ruby/2.2.0/gems/newrelic_rpm-3.13.2.302/lib/new_relic/agent/stats_engine/stats_hash.rb:39
53
+ 172531 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/net/http/header.rb:172
54
+ 92200 /app/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.3/lib/active_support/core_ext/numeric/conversions.rb:131
52
55
  ```
53
56
 
54
57
  You can also use T-Lo's online JS based [Heap Analyzer](http://tenderlove.github.io/heap-analyzer/) for visualizations.
data/Rakefile CHANGED
@@ -4,3 +4,4 @@ require "rspec/core/rake_task"
4
4
  RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  task :default => :spec
7
+ task :test => :spec
@@ -34,12 +34,14 @@ generation:
34
34
  Analyzing Heap (Generation: 17)
35
35
  -------------------------------
36
36
 
37
- allocated by memory (in bytes)
38
- ==============================
39
- /Users/richardschneeman/Documents/projects/codetriage/app/views/layouts/application.html.slim:1 (Memory: 377065, Count: 1 )
40
- /Users/richardschneeman/.gem/ruby/2.2.3/gems/actionview-4.2.3/lib/action_view/template.rb:296 (Memory: 35814, Count: 67 )
41
- /Users/richardschneeman/.gem/ruby/2.2.3/gems/activerecord-4.2.3/lib/active_record/attribute.rb:5 (Memory: 30672, Count: 426 )
42
-
37
+ allocated by memory (44061517) (in bytes)
38
+ ==============================
39
+ 39908512 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/timeout.rb:79
40
+ 1284993 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/openssl/buffering.rb:182
41
+ 201068 /app/vendor/bundle/ruby/2.2.0/gems/json-1.8.3/lib/json/common.rb:223
42
+ 189272 /app/vendor/bundle/ruby/2.2.0/gems/newrelic_rpm-3.13.2.302/lib/new_relic/agent/stats_engine/stats_hash.rb:39
43
+ 172531 /app/vendor/ruby-2.2.3/lib/ruby/2.2.0/net/http/header.rb:172
44
+ 92200 /app/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.3/lib/active_support/core_ext/numeric/conversions.rb:131
43
45
  HALP
44
46
  end
45
47
 
@@ -74,41 +76,46 @@ HALP
74
76
  puts ""
75
77
 
76
78
  generation = Integer(generation)
77
- data = []
79
+
80
+ #
81
+ memsize_hash = Hash.new { |h, k| h[k] = 0 }
82
+ count_hash = Hash.new { |h, k| h[k] = 0 }
78
83
  File.open(@filename) do |f|
79
84
  f.each_line do |line|
80
- parsed = JSON.parse(line)
81
- data << parsed if parsed["generation"] == generation
85
+ begin
86
+ parsed = JSON.parse(line)
87
+ if parsed["generation"] == generation
88
+ key = "#{ parsed["file"] }:#{ parsed["line"] }"
89
+ memsize_hash[key] += parsed["memsize"]
90
+ count_hash[key] += 1
91
+ end
92
+ rescue JSON::ParserError
93
+ puts "Could not parse #{line}"
94
+ end
82
95
  end
83
96
  end
84
97
 
98
+ total_memsize = memsize_hash.inject(0){|count, (k, v)| count += v}
85
99
 
86
100
  # /Users/richardschneeman/Documents/projects/codetriage/app/views/layouts/application.html.slim:1"=>[{"address"=>"0x7f8a4fbf2328", "type"=>"STRING", "class"=>"0x7f8a4d5dec68", "bytesize"=>223051, "capacity"=>376832, "encoding"=>"UTF-8", "file"=>"/Users/richardschneeman/Documents/projects/codetriage/app/views/layouts/application.html.slim", "line"=>1, "method"=>"new", "generation"=>36, "memsize"=>377065, "flags"=>{"wb_protected"=>true, "old"=>true, "long_lived"=>true, "marked"=>true}}]}
87
-
88
- memsize_hash = {}
89
- data.group_by { |row| "#{row["file"]}:#{row["line"]}" }.
90
- each do |(k, v)|
91
- memsize_hash[k] = {
92
- count: v.count,
93
- memsize: v.inject(0) { |sum, obj| sum + Integer(obj["memsize"]) }
94
- }
95
- end
96
-
97
-
98
- puts "allocated by memory (in bytes)"
101
+ puts "allocated by memory (#{total_memsize}) (in bytes)"
99
102
  puts "=============================="
100
- memsize_hash.sort {|(k1, v1), (k2, v2)| v2[:memsize] <=> v1[:memsize] }.
101
- each do |k,v|
102
- puts "#{k} (Memory: #{v[:memsize]}, Count: #{v[:count]} ) "
103
- end
103
+ memsize_hash = memsize_hash.sort {|(k1, v1), (k2, v2)| v2 <=> v1 }
104
+ longest = memsize_hash.first[1].to_s.length
105
+ memsize_hash.each do |file_line, memsize|
106
+ puts " #{memsize.to_s.rjust(longest)} #{file_line}"
107
+ end
108
+
109
+ total_count = count_hash.inject(0){|count, (k, v)| count += v}
104
110
 
105
111
  puts ""
106
- puts "object count"
112
+ puts "object count (#{total_count})"
107
113
  puts "============"
108
- memsize_hash.sort {|(k1, v1), (k2, v2)| v2[:count] <=> v1[:count] }.
109
- each do |k,v|
110
- puts "#{k} (Memory: #{v[:memsize]}, Count: #{v[:count]} ) "
111
- end
114
+ count_hash = count_hash.sort {|(k1, v1), (k2, v2)| v2 <=> v1 }
115
+ longest = count_hash.first[1].to_s.length
116
+ count_hash.each do |file_line, memsize|
117
+ puts " #{memsize.to_s.rjust(longest)} #{file_line}"
118
+ end
112
119
  end
113
120
 
114
121
  def analyze
@@ -116,18 +123,26 @@ HALP
116
123
  puts "Analyzing Heap"
117
124
  puts "=============="
118
125
 
119
- data = []
126
+ # generation number is key, value is count
127
+ data = Hash.new {|h, k| h[k] = 0 }
128
+
120
129
  File.open(@filename) do |f|
121
130
  f.each_line do |line|
122
- data << JSON.parse(line)
131
+ begin
132
+ line = line.chomp
133
+ json = JSON.parse(line)
134
+ data[json["generation"]||0] += 1
135
+ rescue JSON::ParserError
136
+ puts "Could not parse #{line}"
137
+ end
123
138
  end
124
139
  end
125
140
 
126
- data.group_by{ |row| row["generation"] }.
127
- sort { |a, b| a[0].to_i <=> b[0].to_i }.
128
- each do |k,v|
129
- puts "Generation: #{k || " 0"} object count: #{v.count}"
130
- end
141
+ data = data.sort
142
+ max_length = data.last[0].to_s.length
143
+ data.each do |generation, count|
144
+ puts "Generation: #{ generation.to_s.rjust(max_length) } object count: #{ count }"
145
+ end
131
146
  end
132
147
  end
133
148
  end
@@ -1,3 +1,3 @@
1
1
  module Heapy
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heapy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - schneems
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-10-05 00:00:00.000000000 Z
11
+ date: 2015-10-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -64,6 +64,7 @@ files:
64
64
  - ".gitignore"
65
65
  - ".rspec"
66
66
  - ".travis.yml"
67
+ - CHANGELOG.md
67
68
  - CODE_OF_CONDUCT.md
68
69
  - Gemfile
69
70
  - LICENSE.txt