| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 /// A script to track the high water-mark of memory usage of an application. | 5 /// A script to track the high water-mark of memory usage of an application. |
| 6 /// To monitor how much memory dart2js is using, run dart2js as follows: | 6 /// To monitor how much memory dart2js is using, run dart2js as follows: |
| 7 /// | 7 /// |
| 8 /// DART_VM_OPTIONS=--observe dart2js ... | 8 /// DART_VM_OPTIONS=--observe dart2js ... |
| 9 /// | 9 /// |
| 10 /// and run this script immediately after. | 10 /// and run this script immediately after. |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 /// Resumes the main isolate if it was paused on start. | 56 /// Resumes the main isolate if it was paused on start. |
| 57 _resumeMainIsolateIfPaused() async { | 57 _resumeMainIsolateIfPaused() async { |
| 58 var vm = await _sendMessage('getVM'); | 58 var vm = await _sendMessage('getVM'); |
| 59 var isolateId = vm['isolates'][0]['id']; | 59 var isolateId = vm['isolates'][0]['id']; |
| 60 var isolate = await _sendMessage('getIsolate', {'isolateId': isolateId}); | 60 var isolate = await _sendMessage('getIsolate', {'isolateId': isolateId}); |
| 61 bool isPaused = isolate['pauseEvent']['kind'] == 'PauseStart'; | 61 bool isPaused = isolate['pauseEvent']['kind'] == 'PauseStart'; |
| 62 if (isPaused) _resumeIsolate(isolateId); | 62 if (isPaused) _resumeIsolate(isolateId); |
| 63 } | 63 } |
| 64 | 64 |
| 65 /// Send a message to the vm service. | 65 /// Send a message to the vm service. |
| 66 Future _sendMessage(String method, [Map args= const {}]) { | 66 Future _sendMessage(String method, [Map args = const {}]) { |
| 67 var id = _requestId++; | 67 var id = _requestId++; |
| 68 _pendingResponses[id] = new Completer(); | 68 _pendingResponses[id] = new Completer(); |
| 69 socket.add(JSON.encode({ | 69 socket.add(JSON.encode( |
| 70 'jsonrpc': '2.0', | 70 {'jsonrpc': '2.0', 'id': '$id', 'method': '$method', 'params': args,})); |
| 71 'id': '$id', | |
| 72 'method': '$method', | |
| 73 'params': args, | |
| 74 })); | |
| 75 return _pendingResponses[id].future; | 71 return _pendingResponses[id].future; |
| 76 } | 72 } |
| 77 | 73 |
| 78 /// Handle all responses | 74 /// Handle all responses |
| 79 _handleResponse(String s) { | 75 _handleResponse(String s) { |
| 80 var json = JSON.decode(s); | 76 var json = JSON.decode(s); |
| 81 if (json['method'] != 'streamNotify') { | 77 if (json['method'] != 'streamNotify') { |
| 82 var id = json['id']; | 78 var id = json['id']; |
| 83 if (id is String) id = int.parse(id); | 79 if (id is String) id = int.parse(id); |
| 84 if (id == null || !_pendingResponses.containsKey(id)) return; | 80 if (id == null || !_pendingResponses.containsKey(id)) return; |
| 85 _pendingResponses.remove(id).complete(json['result']); | 81 _pendingResponses.remove(id).complete(json['result']); |
| 86 return; | 82 return; |
| 87 } | 83 } |
| 88 | 84 |
| 89 // isolate pauses on exit automatically. We detect this to stop and exit. | 85 // isolate pauses on exit automatically. We detect this to stop and exit. |
| 90 if (json['params']['streamId'] == 'Debug') { | 86 if (json['params']['streamId'] == 'Debug') { |
| 91 _handleDebug(json); | 87 _handleDebug(json); |
| 92 } else if (json['params']['streamId'] == 'Isolate') { | 88 } else if (json['params']['streamId'] == 'Isolate') { |
| 93 _handleIsolate(json); | 89 _handleIsolate(json); |
| 94 } else if (json['params']['streamId'] == 'GC') { | 90 } else if (json['params']['streamId'] == 'GC') { |
| 95 _handleGC(json); | 91 _handleGC(json); |
| 96 } | 92 } |
| 97 } | 93 } |
| 98 | 94 |
| 99 /// Handle a `Debug` notification. | 95 /// Handle a `Debug` notification. |
| 100 _handleDebug(Map json) { | 96 _handleDebug(Map json) { |
| 101 var isolateId = json['params']['event']['isolate']['id']; | 97 var isolateId = json['params']['event']['isolate']['id']; |
| 102 if (json['params']['event']['kind'] == 'PauseStart') { | 98 if (json['params']['event']['kind'] == 'PauseStart') { |
| 103 _resumeIsolate(isolateId); | 99 _resumeIsolate(isolateId); |
| 104 } if (json['params']['event']['kind'] == 'PauseExit') { | 100 } |
| 101 if (json['params']['event']['kind'] == 'PauseExit') { |
| 105 _resumeIsolate(isolateId); | 102 _resumeIsolate(isolateId); |
| 106 } | 103 } |
| 107 } | 104 } |
| 108 | 105 |
| 109 /// Handle a `Isolate` notification. | 106 /// Handle a `Isolate` notification. |
| 110 _handleIsolate(Map json) { | 107 _handleIsolate(Map json) { |
| 111 if (json['params']['event']['kind'] == 'IsolateExit') { | 108 if (json['params']['event']['kind'] == 'IsolateExit') { |
| 112 print(''); | 109 print(''); |
| 113 socket.close(); | 110 socket.close(); |
| 114 } | 111 } |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 184 _printHeader() { | 181 _printHeader() { |
| 185 print(''' | 182 print(''' |
| 186 Memory usage: | 183 Memory usage: |
| 187 new generation | old generation | total | max | 184 new generation | old generation | total | max |
| 188 in-use/capacity | in-use/capacity | in-use/capacity | in-use/capacity '''); | 185 in-use/capacity | in-use/capacity | in-use/capacity | in-use/capacity '''); |
| 189 } | 186 } |
| 190 | 187 |
| 191 const _RED = '\x1b[31m'; | 188 const _RED = '\x1b[31m'; |
| 192 const _GREEN = '\x1b[32m'; | 189 const _GREEN = '\x1b[32m'; |
| 193 const _NONE = '\x1b[0m'; | 190 const _NONE = '\x1b[0m'; |
| OLD | NEW |