[webkit-dev] Memory profiler

Darin Adler darin at apple.com
Tue Feb 3 16:27:46 PST 2009

Some quick thoughts on your message.

On Feb 3, 2009, at 1:07 PM, Raul wrote:

> In WebCore the glue code is generated using python script from an  
> IDL file.

A perl script.

> The script can be changed to create ClassInfo structures that also  
> contain the sizeof().

The sizeof on the DOM classes from WebCore won't include all the  
memory accounted for by the element. Many of these elements have  
auxiliary data structures such as vectors or hash maps.

> Special cases that use large amount of memory like String,  
> HashTables, Arrays, Functions, Images, Canvas, CSS, DOM Elements can  
> be added a size() function.

It’s going to be challenging to write and maintain these functions.  
Also, the name "size()" won’t be available, since it’s already used in  
the DOM, so this will have to have a more specific name.

> This function will be declared in the IDL file and the python script  
> will generate a special function in the JSObject glue code.

The IDL file declares the public interface to a DOM class. It wouldn’t  
make sense to add something internal like this to the IDL file as a  
new function. It might make sense to add something to the IDL file  
that's a property saying "has custom size function", but this would  
not be a function in the IDL file. It’d be a keyword modifying the  
class’s interface definition.

> When a new JSCell is created its CallStack can be recorded in a  
> hashtable for later use. The CallStack can be stored in a per thread  
> global variable as (WebKit is using a collector for each page, so  
> the "new" operator also have an ExecState argument that can be used  
> to get the callstack). When it is destroyed, the hashtable should be  
> updated accordingly.

This seems like it would be slow. It’s important that we find a way to  
do this without slowing down normal operation. And even when the  
profiler is running, we need to make sure it doesn’t make things  
unusably slow.

> Each JSObject should have an unique id per session.

I don’t understand this. Where would this be stored?

> Another issue in javascript is that objects defined by the user code  
> do not hold a ClassName. Their ClassInfo is simply "Object". Another  
> virtual function can be added on JSCell to return the actual type.  
> In this case the type can be the Function name that generated the  
> object (javascript constructor) or the FileName.js at LineNumber in  
> case of anonymous functions.

There are also plenty of objects that don't have constructors.

Most of what you say here sounds fine. I’m not much of an expert on  
how our tools are done generally. It seems critical to do this project  
in a way that would produce results early. We don’t want to hook up a  
lot of machinery before we are using it for anything.

You should also think about how to test this and how we’d maintain its  
correctness in the future. It sounds like there would be a lot of  
handwritten code that could easily get out of sync with how much  
memory is actually used.

     -- Darin

More information about the webkit-dev mailing list