1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CHROME_BROWSER_MEMORY_DETAILS_H_
6 #define CHROME_BROWSER_MEMORY_DETAILS_H_
10 #include "base/memory/ref_counted.h"
11 #include "base/process/process_metrics.h"
12 #include "base/strings/string16.h"
13 #include "chrome/browser/site_details.h"
14 #include "content/public/common/process_type.h"
16 // We collect data about each browser process. A browser may
17 // have multiple processes (of course!). Even IE has multiple
18 // processes these days.
19 struct ProcessMemoryInformation
{
20 // NOTE: Do not remove or reorder the elements in this enum, and only add new
21 // items at the end. We depend on these specific values in a histogram.
22 enum RendererProcessType
{
25 RENDERER_CHROME
, // WebUI (chrome:// URL)
26 RENDERER_EXTENSION
, // chrome-extension://
27 RENDERER_DEVTOOLS
, // Web inspector
28 RENDERER_INTERSTITIAL
, // malware/phishing interstitial
29 RENDERER_BACKGROUND_APP
// hosted app background page
32 static std::string
GetRendererTypeNameInEnglish(RendererProcessType type
);
33 static std::string
GetFullTypeNameInEnglish(
35 RendererProcessType rtype
);
37 ProcessMemoryInformation();
38 ~ProcessMemoryInformation();
40 // Default ordering is by private memory consumption.
41 bool operator<(const ProcessMemoryInformation
& rhs
) const;
45 // The working set information.
46 base::WorkingSetKBytes working_set
;
47 // The committed bytes.
48 base::CommittedKBytes committed
;
49 // The process version
50 base::string16 version
;
51 // The process product name.
52 base::string16 product_name
;
53 // The number of processes which this memory represents.
55 // A process is a diagnostics process if it is rendering about:memory.
56 // Mark this specially so that it can avoid counting it in its own
59 // If this is a child process of Chrome, what type (i.e. plugin) it is.
61 // If this is a renderer process, what type it is.
62 RendererProcessType renderer_type
;
63 // A collection of titles used, i.e. for a tab it'll show all the page titles.
64 std::vector
<base::string16
> titles
;
67 typedef std::vector
<ProcessMemoryInformation
> ProcessMemoryInformationList
;
69 // Browser Process Information.
72 ProcessData(const ProcessData
& rhs
);
74 ProcessData
& operator=(const ProcessData
& rhs
);
77 base::string16 process_name
;
78 ProcessMemoryInformationList processes
;
80 // Track site data for predicting process counts with out-of-process iframes.
81 // See site_details.h.
82 BrowserContextSiteDataMap site_data
;
85 #if defined(OS_MACOSX)
86 class ProcessInfoSnapshot
;
89 // MemoryDetails fetches memory details about current running browsers.
90 // Because this data can only be fetched asynchronously, callers use
91 // this class via a callback.
95 // class MyMemoryDetailConsumer : public MemoryDetails {
97 // MyMemoryDetailConsumer() {
98 // // Anything but |StartFetch()|.
101 // // (Or just call |StartFetch()| explicitly if there's nothing else to
103 // void StartDoingStuff() {
104 // StartFetch(); // Starts fetching details.
108 // // Your other class stuff here
110 // virtual void OnDetailsAvailable() {
111 // // do work with memory info here
114 class MemoryDetails
: public base::RefCountedThreadSafe
<MemoryDetails
> {
116 enum UserMetricsMode
{
117 UPDATE_USER_METRICS
, // Update UMA memory histograms with results.
124 // Access to the process detail information. This data is only available
125 // after OnDetailsAvailable() has been called.
126 const std::vector
<ProcessData
>& processes() { return process_data_
; }
128 // Initiate updating the current memory details. These are fetched
129 // asynchronously because data must be collected from multiple threads.
130 // Updates UMA memory histograms if |mode| is UPDATE_USER_METRICS.
131 // OnDetailsAvailable will be called when this process is complete.
132 void StartFetch(UserMetricsMode user_metrics_mode
);
134 virtual void OnDetailsAvailable() = 0;
136 // Returns a string summarizing memory usage of the Chrome browser process
137 // and all sub-processes, suitable for logging.
138 std::string
ToLogString();
141 friend class base::RefCountedThreadSafe
<MemoryDetails
>;
143 virtual ~MemoryDetails();
146 // Collect child process information on the IO thread. This is needed because
147 // information about some child process types (i.e. plugins) can only be taken
148 // on that thread. The data will be used by about:memory. When finished,
149 // invokes back to the file thread to run the rest of the about:memory
151 void CollectChildInfoOnIOThread();
153 // Collect current process information from the OS and store it
154 // for processing. If data has already been collected, clears old
155 // data and re-collects the data.
156 // Note - this function enumerates memory details from many processes
157 // and is fairly expensive to run, hence it's run on the file thread.
158 // The parameter holds information about processes from the IO thread.
159 void CollectProcessData(const std::vector
<ProcessMemoryInformation
>&);
161 #if defined(OS_MACOSX)
162 // A helper for |CollectProcessData()|, collecting data on the Chrome/Chromium
163 // process with PID |pid|. The collected data is added to the state of the
164 // object (in |process_data_|).
165 void CollectProcessDataChrome(
166 const std::vector
<ProcessMemoryInformation
>& child_info
,
168 const ProcessInfoSnapshot
& process_info
);
171 // Collect child process information on the UI thread. Information about
172 // renderer processes is only available there.
173 void CollectChildInfoOnUIThread();
175 // Updates the global histograms for tracking memory usage.
176 void UpdateHistograms();
178 #if defined(OS_CHROMEOS)
179 void UpdateSwapHistograms();
182 // Returns a pointer to the ProcessData structure for Chrome.
183 ProcessData
* ChromeBrowser();
185 std::vector
<ProcessData
> process_data_
;
187 UserMetricsMode user_metrics_mode_
;
189 #if defined(OS_CHROMEOS)
190 base::SwapInfo swap_info_
;
193 DISALLOW_COPY_AND_ASSIGN(MemoryDetails
);
196 #endif // CHROME_BROWSER_MEMORY_DETAILS_H_