heapy 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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