/* * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * The MemorySampler class samples a number of internal and external memory * metrics every second while running. Sample data is written to a log file. * Sampling occurs over a duration specified when started. If duration is set * to 0 (default), the memory sampler will run indefinitely until the stop * function is called. MemorySampler allows the option of sampling "in use" * memory (committed memory minus free list byte count) or committed memory for * any allocator which keeps a free list. This includes FastMalloc and the * JavaScriptCore heap at this time. * The following memory metrics are recorded: * * WebCore * - FastMalloc allocations bytes (in use or committed) * JavaScriptCore * - Garbage collector heap bytes (in use or committed) * - Stack bytes (committed only!) * - JIT Code bytes (committed only!) * Malloc zones * - In use bytes for the following zones: * * Default zone (in use or committed) * * DispCon zone (in use or committed) * * Purgable zone (in use or committed) * Task Info * - Resident size memory (RSIZE) */ #ifndef WebMemorySampler_h #define WebMemorySampler_h #if ENABLE(MEMORY_SAMPLER) #include "SandboxExtension.h" #include <WebCore/Timer.h> #include <WebCore/FileSystem.h> #include <wtf/Noncopyable.h> #include <wtf/RefPtr.h> #include <wtf/text/WTFString.h> #include <wtf/Vector.h> namespace WebKit { struct SystemMallocStats; struct WebMemoryStatistics { Vector<String> keys; Vector<size_t> values; }; class WebMemorySampler { WTF_MAKE_NONCOPYABLE(WebMemorySampler); public: static WebMemorySampler* shared(); void start(const double interval=0); void start(const SandboxExtension::Handle&, const String&, const double interval=0); void stop(); bool isRunning() const; private: WebMemorySampler(); ~WebMemorySampler(); void initializeTempLogFile(); void initializeSandboxedLogFile(const SandboxExtension::Handle&, const String&); void writeHeaders(); void initializeTimers(double); void sampleTimerFired(WebCore::Timer<WebMemorySampler>*); void stopTimerFired(WebCore::Timer<WebMemorySampler>*); void appendCurrentMemoryUsageToFile(WebCore::PlatformFileHandle&); SystemMallocStats sampleSystemMalloc() const; size_t sampleProcessCommittedBytes() const; WebMemoryStatistics sampleWebKit() const; String processName() const; WebCore::PlatformFileHandle m_sampleLogFile; String m_sampleLogFilePath; String m_separator; WebCore::Timer<WebMemorySampler> m_sampleTimer; WebCore::Timer<WebMemorySampler> m_stopTimer; bool m_isRunning; double m_runningTime; RefPtr<SandboxExtension> m_sampleLogSandboxExtension; }; } #endif #endif