The data contained in this repository can be downloaded to your computer using one of several clients.
Please see the documentation of your version control software client for more information.

Please select the desired protocol below to get the URL.

This URL has Read-Only access.

Statistics
| Branch: | Revision:

main_repo / deps / v8 / src / heap-profiler.cc @ f230a1cf

History | View | Annotate | Download (6.45 KB)

1
// Copyright 2009-2010 the V8 project authors. All rights reserved.
2
// Redistribution and use in source and binary forms, with or without
3
// modification, are permitted provided that the following conditions are
4
// met:
5
//
6
//     * Redistributions of source code must retain the above copyright
7
//       notice, this list of conditions and the following disclaimer.
8
//     * Redistributions in binary form must reproduce the above
9
//       copyright notice, this list of conditions and the following
10
//       disclaimer in the documentation and/or other materials provided
11
//       with the distribution.
12
//     * Neither the name of Google Inc. nor the names of its
13
//       contributors may be used to endorse or promote products derived
14
//       from this software without specific prior written permission.
15
//
16
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27

    
28
#include "v8.h"
29

    
30
#include "deoptimizer.h"
31
#include "heap-profiler.h"
32
#include "heap-snapshot-generator-inl.h"
33

    
34
namespace v8 {
35
namespace internal {
36

    
37
HeapProfiler::HeapProfiler(Heap* heap)
38
    : snapshots_(new HeapSnapshotsCollection(heap)),
39
      next_snapshot_uid_(1),
40
      is_tracking_allocations_(false) {
41
}
42

    
43

    
44
HeapProfiler::~HeapProfiler() {
45
  delete snapshots_;
46
}
47

    
48

    
49
void HeapProfiler::DeleteAllSnapshots() {
50
  Heap* the_heap = heap();
51
  delete snapshots_;
52
  snapshots_ = new HeapSnapshotsCollection(the_heap);
53
}
54

    
55

    
56
void HeapProfiler::DefineWrapperClass(
57
    uint16_t class_id, v8::HeapProfiler::WrapperInfoCallback callback) {
58
  ASSERT(class_id != v8::HeapProfiler::kPersistentHandleNoClassId);
59
  if (wrapper_callbacks_.length() <= class_id) {
60
    wrapper_callbacks_.AddBlock(
61
        NULL, class_id - wrapper_callbacks_.length() + 1);
62
  }
63
  wrapper_callbacks_[class_id] = callback;
64
}
65

    
66

    
67
v8::RetainedObjectInfo* HeapProfiler::ExecuteWrapperClassCallback(
68
    uint16_t class_id, Object** wrapper) {
69
  if (wrapper_callbacks_.length() <= class_id) return NULL;
70
  return wrapper_callbacks_[class_id](
71
      class_id, Utils::ToLocal(Handle<Object>(wrapper)));
72
}
73

    
74

    
75
HeapSnapshot* HeapProfiler::TakeSnapshot(
76
    const char* name,
77
    v8::ActivityControl* control,
78
    v8::HeapProfiler::ObjectNameResolver* resolver) {
79
  HeapSnapshot* result = snapshots_->NewSnapshot(name, next_snapshot_uid_++);
80
  {
81
    HeapSnapshotGenerator generator(result, control, resolver, heap());
82
    if (!generator.GenerateSnapshot()) {
83
      delete result;
84
      result = NULL;
85
    }
86
  }
87
  snapshots_->SnapshotGenerationFinished(result);
88
  return result;
89
}
90

    
91

    
92
HeapSnapshot* HeapProfiler::TakeSnapshot(
93
    String* name,
94
    v8::ActivityControl* control,
95
    v8::HeapProfiler::ObjectNameResolver* resolver) {
96
  return TakeSnapshot(snapshots_->names()->GetName(name), control, resolver);
97
}
98

    
99

    
100
void HeapProfiler::StartHeapObjectsTracking() {
101
  snapshots_->StartHeapObjectsTracking();
102
}
103

    
104

    
105
SnapshotObjectId HeapProfiler::PushHeapObjectsStats(OutputStream* stream) {
106
  return snapshots_->PushHeapObjectsStats(stream);
107
}
108

    
109

    
110
void HeapProfiler::StopHeapObjectsTracking() {
111
  snapshots_->StopHeapObjectsTracking();
112
}
113

    
114

    
115
size_t HeapProfiler::GetMemorySizeUsedByProfiler() {
116
  return snapshots_->GetUsedMemorySize();
117
}
118

    
119

    
120
int HeapProfiler::GetSnapshotsCount() {
121
  return snapshots_->snapshots()->length();
122
}
123

    
124

    
125
HeapSnapshot* HeapProfiler::GetSnapshot(int index) {
126
  return snapshots_->snapshots()->at(index);
127
}
128

    
129

    
130
SnapshotObjectId HeapProfiler::GetSnapshotObjectId(Handle<Object> obj) {
131
  if (!obj->IsHeapObject())
132
    return v8::HeapProfiler::kUnknownObjectId;
133
  return snapshots_->FindObjectId(HeapObject::cast(*obj)->address());
134
}
135

    
136

    
137
void HeapProfiler::ObjectMoveEvent(Address from, Address to, int size) {
138
  snapshots_->ObjectMoveEvent(from, to, size);
139
}
140

    
141

    
142
void HeapProfiler::NewObjectEvent(Address addr, int size) {
143
  snapshots_->NewObjectEvent(addr, size);
144
}
145

    
146

    
147
void HeapProfiler::UpdateObjectSizeEvent(Address addr, int size) {
148
  snapshots_->UpdateObjectSizeEvent(addr, size);
149
}
150

    
151

    
152
void HeapProfiler::SetRetainedObjectInfo(UniqueId id,
153
                                         RetainedObjectInfo* info) {
154
  // TODO(yurus, marja): Don't route this information through GlobalHandles.
155
  heap()->isolate()->global_handles()->SetRetainedObjectInfo(id, info);
156
}
157

    
158

    
159
void HeapProfiler::StartHeapAllocationsRecording() {
160
  StartHeapObjectsTracking();
161
  is_tracking_allocations_ = true;
162
  DropCompiledCode();
163
  snapshots_->UpdateHeapObjectsMap();
164
}
165

    
166

    
167
void HeapProfiler::StopHeapAllocationsRecording() {
168
  StopHeapObjectsTracking();
169
  is_tracking_allocations_ = false;
170
  DropCompiledCode();
171
}
172

    
173

    
174
void HeapProfiler::RecordObjectAllocationFromMasm(Isolate* isolate,
175
                                                  Address obj,
176
                                                  int size) {
177
  isolate->heap_profiler()->NewObjectEvent(obj, size);
178
}
179

    
180

    
181
void HeapProfiler::DropCompiledCode() {
182
  Isolate* isolate = heap()->isolate();
183
  HandleScope scope(isolate);
184

    
185
  if (FLAG_concurrent_recompilation) {
186
    isolate->optimizing_compiler_thread()->Flush();
187
  }
188

    
189
  Deoptimizer::DeoptimizeAll(isolate);
190

    
191
  Handle<Code> lazy_compile =
192
      Handle<Code>(isolate->builtins()->builtin(Builtins::kLazyCompile));
193

    
194
  heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask,
195
                            "switch allocations tracking");
196

    
197
  DisallowHeapAllocation no_allocation;
198

    
199
  HeapIterator iterator(heap());
200
  HeapObject* obj = NULL;
201
  while (((obj = iterator.next()) != NULL)) {
202
    if (obj->IsJSFunction()) {
203
      JSFunction* function = JSFunction::cast(obj);
204
      SharedFunctionInfo* shared = function->shared();
205

    
206
      if (!shared->allows_lazy_compilation()) continue;
207
      if (!shared->script()->IsScript()) continue;
208

    
209
      Code::Kind kind = function->code()->kind();
210
      if (kind == Code::FUNCTION || kind == Code::BUILTIN) {
211
        function->set_code(*lazy_compile);
212
        shared->set_code(*lazy_compile);
213
      }
214
    }
215
  }
216
}
217

    
218

    
219
} }  // namespace v8::internal