Quero saber o tamanho ocupado por um objeto JavaScript.
Execute a seguinte função:
function Marks(){
this.maxMarks = 100;
}
function Student(){
this.firstName = "firstName";
this.lastName = "lastName";
this.marks = new Marks();
}
Agora instanciamos o student
:
var stud = new Student();
para que eu possa fazer coisas como
stud.firstName = "new Firstname";
alert(stud.firstName);
stud.marks.maxMarks = 200;
etc.
Agora, o stud
objeto ocupará algum tamanho na memória. Possui alguns dados e mais objetos.
Como descubro quanta memória o stud
objeto ocupa? Algo como um sizeof()
em JavaScript? Seria realmente incrível se eu pudesse descobrir isso em uma única chamada de função como sizeof(stud)
.
Venho pesquisando na Internet há meses - não consegui encontrá-la (solicitada em alguns fóruns - sem respostas).
javascript
memory
object
sizeof
user4642212
fonte
fonte
Respostas:
Eu refiz o código na minha resposta original . Eu removi a recursão e a sobrecarga de existência assumida.
fonte
"よんもじ".length
tem 4 em Javascript, mas você tem certeza de que tem 8 bytes, conforme o código o retorna?var a={n:1}; var b={a:function(){return a}}; roughSizeOfObject(b)
- aquib
mantém referência aa
, masroughSizeOfObject()
retorna0
.O Google Chrome Heap Profiler permite que você inspecione o uso da memória do objeto.
Você precisa localizar o objeto no rastreamento, o que pode ser complicado. Se você fixar o objeto na janela global, é muito fácil encontrá-lo no modo de listagem "Contenção".
Na captura de tela anexada, criei um objeto chamado "testObj" na janela. Eu então localizei no criador de perfil (depois de fazer uma gravação) e ele mostra o tamanho total do objeto e tudo em "tamanho retido".
Mais detalhes sobre as falhas de memória .
Na captura de tela acima, o objeto mostra um tamanho retido de 60. Acredito que a unidade seja bytes aqui.
fonte
comparison
visualização na parte inferior. Torna óbvio quais objetos foram criados entre os dois instantâneos.Shallow size
parece 40 para os objetos{ a:"55c2067aee27593c03b7acbe", b:"55c2067aee27593c03b7acbe", c:null, d:undefined }
e{ c:null, d:undefined }
. Tudo bem?node --inspect
e no Chrome, digiteabout:inspect
na barra de URLs e procure abrir o inspetor de nós . Crie seu objeto na CLI do nó e, em seguida, tire uma captura instantânea de heap.Eu acabei de escrever isso para resolver um problema (ish) semelhante. Ele não faz exatamente o que você está procurando, ou seja, não leva em consideração como o intérprete armazena o objeto.
Mas, se você estiver usando o V8, ele deverá fornecer uma aproximação razoavelmente correta, pois as incríveis prototipagens e classes ocultas lambem a maior parte da sobrecarga.
fonte
Às vezes eu uso isso para sinalizar objetos realmente grandes que podem estar indo para o cliente a partir do servidor. Não representa o espaço ocupado na memória. Ele fornece a você aproximadamente o custo de enviá-lo ou armazená-lo.
Observe também que é lento, apenas para desenvolvedores. Mas, para obter uma resposta aproximada com uma linha de código, isso tem sido útil para mim.
fonte
VM1409:1 Uncaught TypeError: Converting circular structure to JSON
:( ainda útil emboraAqui está uma solução um pouco mais compacta para o problema:
fonte
typeof ...
, não funcionariam.Há um módulo NPM para obter o tamanho do objeto ; você pode instalá-lo com
npm install object-sizeof
fonte
Este é um método hacky, mas eu tentei duas vezes com números diferentes e parece ser consistente.
O que você pode fazer é tentar alocar um grande número de objetos, como um ou dois milhões de objetos do tipo que você deseja. Coloque os objetos em uma matriz para impedir que o coletor de lixo os libere (observe que isso adicionará uma pequena sobrecarga de memória por causa da matriz, mas espero que isso não importe e, além disso, se você vai se preocupar com objetos que estão na memória , você as armazena em algum lugar). Adicione um alerta antes e depois da alocação e, em cada alerta, verifique quanta memória o processo do Firefox está consumindo. Antes de abrir a página com o teste, verifique se você tem uma nova instância do Firefox. Abra a página, observe o uso da memória após o alerta "antes" ser exibido. Feche o alerta, aguarde a memória ser alocada. Subtraia a nova memória da antiga e divida-a pela quantidade de alocações.
Eu tentei isso no meu computador e o processo tinha 48352K de memória quando o alerta "antes" foi exibido. Após a alocação, o Firefox tinha 440236K de memória. Para alocações de 2 milhões, isso é cerca de 200 bytes para cada objeto.
Tentei novamente com alocações de 1 milhão e o resultado foi semelhante: 196 bytes por objeto (suponho que os dados extras em 2mill foram usados para Array).
Então, aqui está um método hacky que pode ajudá-lo. O JavaScript não fornece um método "sizeof" por um motivo: cada implementação de JavaScript é diferente. No Google Chrome, por exemplo, a mesma página usa cerca de 66 bytes para cada objeto (a julgar pelo gerenciador de tarefas, pelo menos).
fonte
Desculpe por não poder comentar, então continuo o trabalho de errado. Esta versão aprimorada não conta o objeto mais de uma vez, portanto, não há loop infinito. Além disso, acho que a chave de um objeto também deve ser contada, aproximadamente.
fonte
typeof value === 'object'
não é suficiente e você terá exceções se o valor fornull
.level
contém dados, masroughSizeOfObject(level)
retorna zero. (Meu nível de variável não deve ser confundido com seu argumento, é claro. Não acho que o sombreamento de variáveis deva causar um problema aqui e, também, quando renomeio o 'nível' em seu script, obtenho o mesmo resultado.) : snipboard.io/G7E5yj.jpgTendo o mesmo problema. Eu pesquisei no Google e quero compartilhar com a comunidade stackoverflow esta solução.
Importante :
O que você acha disso?
fonte
Na sequência deste comentário, eis o que você deve fazer: Tente produzir um problema de memória - escreva um código que crie todos esses objetos e aumente graudalmente o limite superior até encontrar um problema (falha do navegador, congelamento do navegador ou um problema de falta de armazenamento). erro de memória). Idealmente, você deve repetir esse experimento com diferentes navegadores e diferentes sistemas operacionais.
Agora, existem duas opções: opção 1 - Você não conseguiu produzir o problema de memória. Portanto, você está se preocupando por nada. Você não tem um problema de memória e seu programa está bom.
opção 2 - você teve um problema de memória. Agora, pergunte-se se o limite em que o problema ocorreu é razoável (em outras palavras: é provável que essa quantidade de objetos seja criada no uso normal do seu código). Se a resposta for 'Não', você está bem. Caso contrário, agora você sabe quantos objetos seu código pode criar. Retrabalhe o algoritmo de forma que ele não ultrapasse esse limite.
fonte
Se sua principal preocupação for o uso de memória da extensão do Firefox, sugiro que verifique com os desenvolvedores do Mozilla.
A Mozilla fornece em seu wiki uma lista de ferramentas para analisar vazamentos de memória .
fonte
Essa biblioteca Javascript
sizeof.js
faz a mesma coisa. Inclua assimA função sizeof usa um objeto como parâmetro e retorna seu tamanho aproximado em bytes. Por exemplo:
A função sizeof pode manipular objetos que contêm várias referências a outros objetos e referências recursivas.
Publicado originalmente aqui .
fonte
As ferramentas de desenvolvedor do Chrome têm essa funcionalidade. Achei este artigo muito útil e faz exatamente o que você deseja: https://developers.google.com/chrome-developer-tools/docs/heap-profiling
fonte
Muito obrigado a todos que estiveram trabalhando no código para isso!
Eu só queria acrescentar que estava procurando exatamente a mesma coisa, mas no meu caso, é para gerenciar um cache de objetos processados para evitar a necessidade de analisar e processar novamente objetos de chamadas ajax que podem ou não ter sido armazenadas em cache pelo navegador. Isso é especialmente útil para objetos que exigem muito processamento, geralmente qualquer coisa que não esteja no formato JSON, mas pode ficar muito caro manter essas coisas armazenadas em cache em um projeto grande ou em um aplicativo / extensão que permanece em execução por um longo período. Tempo.
De qualquer forma, eu uso para algo como:
É um exemplo simplista e pode ter alguns erros, mas dá a ideia, pois você pode usá-lo para segurar objetos estáticos (o conteúdo não muda) com algum grau de inteligência. Isso pode reduzir significativamente os requisitos de processamento caros que o objeto teve que ser produzido em primeiro lugar.
fonte
fonte
Uso a guia Linha do tempo das ferramentas de desenvolvimento do Chrome , instanciamos quantidades cada vez maiores de objetos e obtenho boas estimativas como essa. Você pode usar html como este abaixo, como clichê, e modificá-lo para simular melhor as características de seus objetos (número e tipos de propriedades, etc ...). Você pode clicar no ícone da lixeira na parte inferior dessa guia de ferramentas de desenvolvimento, antes e depois de uma execução.
A instanciação de 2 milhões de objetos de apenas uma propriedade cada (como neste código acima) leva a um cálculo aproximado de 50 bytes por objeto, no meu Chromium, no momento. Alterar o código para criar uma sequência aleatória por objeto adiciona cerca de 30 bytes por objeto, etc. Espero que isso ajude.
fonte
Se você precisar verificar programaticamente por aprox. tamanho dos objetos, você também pode verificar esta biblioteca http://code.stephenmorley.org/javascript/finding-the-memory-usage-of-objects/ que pude usar para o tamanho dos objetos.
Caso contrário, sugiro usar o Chrome / Firefox Heap Profiler.
fonte
Eu acredito que você esqueceu de incluir 'array'.
fonte
Eu sei isto não é absolutamente o caminho certo para fazê-lo, ainda it've me ajudou algumas vezes no passado para obter o tamanho aproximado arquivo objeto:
Escreva seu objeto / resposta no console ou em uma nova guia, copie os resultados para um novo arquivo de bloco de notas, salve-o e verifique o tamanho do arquivo. O arquivo do bloco de notas em si tem apenas alguns bytes; portanto, você terá um tamanho de arquivo de objeto bastante preciso.
fonte