420 likes | 488 Views
Uma arquitetura objeto-ciente da memória. Sumário
E N D
Sumário • Apesar de sua dominância, a computação orientação a objeto recebeu a atenção scant da comunidade da arquitetura. Nós propomos uma arquitetura da memória da novel que suporte objetos e coleção do lixo (GC). Nossa arquitetura co-é projetada com um JavaTM Máquina virtual (JVMTM) 1 para melhorar a funcionalidade e a eficiência da gerência da memória do heap. A arquitetura é baseada em um espaço de endereço para objetos alcançou usando o objeto IDs traçado por um tradutor aos endereços físicos. Para suportar isto, o sistema inclui caches objeto-dirigidos, uma barreira do GC da ferragem para permitir o GC do em-cache dos objetos, e uma estrutura exposta do cache controlada cooperativa pelo JVM. Estes estendem uma arquitetura convencional, sem compatibilidade ou desempenho comprometendo para binaries do legacy. Nossas inovações permitem várias melhorias como: uma técnica da novela para a coleção paralela e simultânea do lixo, sem reque alguma sincronização global; um coletor do lixo do em-cache, que nunca alcance a memória principal; compactação simultâneo dos objetos; e eliminação de a maioria de overheads da barreira da loja do GC. Nós comparamos o comportamento de nosso sistema de encontro àquele de um coletor gerenciador convencional do lixo, com e sem uma operação explícita do aloc-em-cache que elimine muitos escrevem a falta. Nosso esquema negocia adicionalmente a falta L2 para operações do em-cache, e fornece a ação indireta traçando requerida para a compactação simultânea. c Sun Microsystems Inc. 2006 publicou por Elsevier B.V. Todos os direitos reservados. palavra-chave: Coleção do lixo; Máquinas virtuais; Memória do objeto 1. Introdução e motivação • A programação orientada a objeto é o paradigma dominante do desenvolvimento do software, e realizou-se assim para a última década. As línguas de programação orientada a objeto, tais como JavaTM e C#, convergiram em um modelo comum do objeto cujas raízes podem ser encontradas no Smalltalk [1]. Para nossas finalidades nós podemos sumariar o modelo com três propriedades. Em primeiro lugar, os objetos são pequenos, barato e abundante. Em segundo lugar, o armazenamento do objeto é recuperado automaticamente através da coleção do lixo (GC). em terceiro lugar, embora a referência do objeto seja imprescindível, todas as permissões são controladas através das verificações feitas em classloading ou compilar o tempo (a língua de Java combina o tipo de estática segurança com os controles de acesso pacotes-baseados). Embora nosso trabalho focaliza em Java que é igualmente aplicável a outras línguas com um modelo similar; nós anotamos que não pode • Autor correspondente. Telefone.: +1 650 786 6568. Endereços do E-mail: Greg.Wright@Sun.com (G. Wright), Matthew.Seidl@Sun.com (M.L. Seidl), Mario.Wolczko@Sun.com (M. Wolczko). 1 Java e todas as marcas Java-baseadas são as marcas registradas ou as marcas registradas de Sun Microsystems, Inc., nos Estados Unidos e em outros países. 0167-6423/$ - ver o exame preliminar c Sun Microsystems Inc. 2006 publicou por Elsevier B.V. Todos os direitos reservados. • /Ciência do computador que programa 62 (2006) 145-163 fornecer todos os benefícios para alguns outros modelos da língua (o mais notavelmente C++ e o subconjunto inseguro de C#, que permitem a aritmética arbitrária do ponteiro).
A arquitetura de computador ignorou na maior parte este modelo do objeto. No detalhe as exigências, e nos confinamentos de sobre, o sistema da memória são completamente diferentes daquelas de um plano, memória virtual paginada - por exemplo, os objetos pequenos reduzem a eficácia das linhas longas do cache e do TLBs [2] porque a localidade do interobjeto não é assegurada. O desempenho do sistema da memória é importante no mercado comercial do usuário, onde as aplicações de Java podem requeri muitos gigabytes do espaço do heap. A relação arquitetural preliminar às aplicações de Java está no nível virtual da máquina (JVM), e esta dá a liberdade considerável para inovasse através do limite da ferragem/software. Nós estamos investigando como sustentação da ferragem para objetos, co-projetada com a máquina virtual, podemos conduzir para melhorar o desempenho do sistema da memória e também permitir os algoritmos novos da gerência da memória que não podem atualmente ser executado eficientemente no software. Nós supomos que as mudanças podem ser feitas à máquina virtual, ao sistema se operando e à ferragem, mas nós não consideramos completamente um ‘projeto da folha limpa’: as aplicações do legacy devem funcionar imutável no mesmo sistema. Nós estendemos conseqüentemente uma arquitetura convencional do jogo de instrução onde apropriado, retendo para trás a compatibilidade. As modificações arquiteturais são somente sustentação para os algoritmos do software; nós propomos as estruturas da ferragem somente onde oferecem a funcionalidade ou a eficiência que o software não pode combinar, e deixam tanta flexibilidade como possível para uma inovação mais atrasada do software. No detalhe, nós não estamos propondo execuções de ferragem dos coletores completos do lixo [3.4], da execução do bytecode [5.6], ou na proteção fine-grained [7-9]. Nossa aproximação é centrada em torno de duas idéias: sustentação para objetos como entidades primeira classe no sistema da memória, e colaboração entre a ferragem e o software para a gerência da memória. O fundamento do propostos à arquitetura é apresentado na seção 2, e as extensões GC-relacionadas são descritas na seção 3. As comparações com trabalho relacionado estão na seção 4, a seguir a seção 5 descreve nossa metodologia da avaliação e a seção 6 apresenta os resultados de nossa avaliação inicial. Na seção 7 nós apresentamos conclusões, e a seção 8 sugere o trabalho futuro.
2. Uma hierarquia da memória para objetos • Uso que atual de JVMs da produção uma representação direta do ponteiro para o objeto referenciado: cada objeto referenciado por seu endereço virtual baixo. O sistema convencional da memória virtual traça virtual aos endereços físicos. Isto está no contraste às máquinas virtuais adiantadas, tais como o Smalltalk VMs dos 80’s [1], que usaram uma representação indireta: os objetos foram consultados pertos a um objeto posição-independente ID (OID), realmente um índice em uma tabela do objeto. A entrada da tabela do objeto de um objeto (OTE dependente) da carga de a no acesso do campo pelo mutator (código da aplicação, a diferencia do coletor ) conteve o endereço de memória virtual do objeto. A representação direta conserva a instrução (do lixo); a representação indireta faz o realocação mais fácil porque o endereço de memória de um objeto é armazenado em somente um lugar. O Realocagem é um componente importante de uma variedade de funções da gerência da memória, o mais notavelmente a compactação do heap que supera a fragmentação. Entretanto, desde 80’s atrasados o acesso direto foi o método da escolha, porque as despesas gerais da ação indireta da tabela do objeto foram demasiado elevadas [10]. As propriedades temporal de algoritmos da gerência da memória são importantes quando scaling aos heaps grandes: é desejável ter o throughput médio bom do mutator, isto é, despesas gerais de gerência baixas da memória, e assegurar-se também esse as pausas, durante que o trabalho do mutator é suspendido, são mantidas dentro dos limites aceitáveis. O Concurrent, ou mostlyconcurrent [11], coleção do lixo são muito atrativos para evitar pausas longas ao operar-se no multi-gigabyte heaps: aqui o coletor funciona ao mesmo tempo que o mutator, com alguns mecanismos da sincronização (barreiras, suspensão da linha do mutator, etc.) para assegurar a exatidão. O compactação simultâneo é mais difícil: um objeto deve realocado com o atomacidade aparente ao mutator. Com uma representação direta do ponteiro isto significa atualizar todas as referências a um objeto “em uma vez” (e é estritamente mais duro do que meramente determinando que um objeto é resgatado, que requeira somente a leitura de uma única referência). Uma representação indireta executada em uma arquitetura convencional ainda requer a sincronização extra no mutator porque a carga-carga ou carga-armazena a ação indireta através da tabela do objeto não é atômica. A sustentação Arquitetural para objetos pode fornecer o melhor de ambos os mundos: acesso rápido aos objetos no caso comum, com realocaçõa fácil. Com pouca sustentação da ferragem nós podemos também executar o realocação sincronizado com nenhumas despesas gerais no mutator: isto permite o compactação verdadeiramente simultâneo. Com realocação simultâneo nós podemos mover os objetos quando todas as linhas do mutator forem ativas, assim permitindo que os vários otimização sejam executados no heap e melhorando os tamanhos do heap do máximo que podem ser segurados sem induzir a coleção inaceitável pauses.2.007 do lixo • G. Wright e outros. /Ciência do computador que programa 62 (2006) 145-163 147 1. Encontrando uma referência físico-etiquetada em um cache convencional.
Fig. 1. Finding a physically-tagged datum in a conventional cache.
2.1. cache Objetos-dirigidos • Em um sistema convencional a instrução para carregar um campo do objeto faz exame de dois operandos da fonte: a referência ao objeto (isto é, seu endereço virtual baixo) e o campo deslocaram dentro do objeto. O ponteiro e o offset são somados para produzir o endereço virtual do campo que é alimentado ao TLB e L1 (físico-etiquetado) o cache (1). Um cache objeto-dirigido [12] tem preferivelmente as linhas do cache etiquetadas diretamente com (OID, offset) os endereços, e assim contem partes dos objetos melhor que blocos da memória física (2). Esta organização é similar à virtualidade de endereço o cache, a não ser que aquela o OID e os bocados offset seja concatenada melhor que somada (uma simplificação ligeira para agora, ver mais detalhes na seção 2.2 abaixo); não há nenhum aliasing de endereços do objeto. Uma instrução da objeto-carga faz exame dos mesmos dois operandos da fonte que a carga convencional, mas melhor que sendo adicionado contorneiam o TLB e ir diretamente à ferragem do fósforo do end do cache. Os Tag de um cache objeto-dirigido devem ser mais longos segurar o tamanho (virtual) desejado do espaço do objeto. O tamanho máximo do objeto pode ser restrito: 10 bocados offset (256 campos de 4 bytes cada um) cobrem a maioria dos objetos na prática, e uns objetos mais longos podem ser compostos pela máquina virtual no muito a mesma maneira que um sistema de lima fornece o ilusão de limas contíguas grandes usando blocos pequenos do disco. Os endereços e os Tag do objeto podem conseqüentemente ser somente alguns bocados mais por muito tempo do que os endereços físicos segurados já em sistemas upcoming. O espaço de endereço de OID é (non-virtualized) um recurso compartilhado, mas os processos múltiplos do aplicação-nível podem residir dentro de um único JVM [13]. Nós supomos que o sistema se operando coordena dividir do espaço de OID se diverso JVMs for requerido. Alternativamente, o espaço de OID podia ser virtualizado com a adição da ferragem extra, em alguma penalidade no custo e no desempenho
. • 148 G. Wright e outros. /Ciência do computador que programa 62 (2006) 145-163 2. Um cache objeto-dirigido (simplificado). Cada linha do cache do objeto contem a parte de somente um objeto; os objetos podem medir linhas múltiplas do cache, mas a maioria de objetos ocuparão somente um (dado 64 linhas do cache do byte). Algum espaço nas extremidades de linhas será não utilizado (fragmentação externa). A fragmentação tem dois efeitos potencial negativos no sistema. Firstly, reduz a capacidade eficaz do cache: com a embalagem mais densa mais objetos caberiam no cache. , remove a possibilidade que um prefetch da vontade da falta de cache um objeto adjacente. A embalagem e prefetching confiam no localização espacial entre os objetos: em sua ausência os objetos adjacentes não são usados e não fornecem nenhum benefício. Em nosso sistema, os objetos são alocados diretamente no cache (seção 2.3); o efeito prefetching é somente relevante para os objetos velhos bastante evite previamente do cache. Alguns estudos demonstraram o localização espacial entre objetos recente-alocados mas pouco para uns objetos mais velhos [14], assim nós não esperaríamos muito benefício dos objetos mais velhos prefetching em nenhum caso. Ambos estes efeitos naturalmente são refletidos em nossos resultados: são os custos que nós pagamos na troca pelos outros benefícios de nosso sistema. Um benefício adicional de um cache do objeto é que impossibilita compartilhar falso entre objetos diferentes. Depois de nosso princípio que objeta a funcionalidade estende meramente um sistema existente, nós permite o ordinário physicallytagged linhas do cache para coexistir no cache do objeto com as linhas objeto-etiquetadas do cache. Contanto que os Tag não colidirem, assegurado por exemplo encaixando os endereços do objeto em uma escala de endereço mais elevada do que a memória física (por exemplo, um bocado high-order do jogo), a ferragem do cache opera-se na maneira usual depois que o estágio da geração do endereço e é-se inconsciente que está tratando dos objetos. Nós usaremos o endereço físico estendido ‘’ (EPA) significar um endereço (corda de bocado) que seja uma posição de memória física ou (OID, offset) um endereço codificado. A maioria de mecanismos da coerência do cache trabalham inalterável ao usar EPAs em vez do exame direto endereços; os snoops de outros processadores centrais destine para endereços do objeto combinarão nos Tag codificados e mudarão estados da coerência na maneira usual. Os casos incomuns são falta de cache em todos os níveis da hierarquia, que necessitam um acesso de memória (ver a seção 2.4), e os diretórios em protocolos diretório-baseados. Embora a coerência diretório-baseada do objeto seja possível, os detalhes são além do espaço deste papel.
2.2. Encoding do endereço do objeto • Um sistema executou exatamente como descrito acima teria a colocação pobre dos objetos dentro do cache. Os caches associativos de Nonfully- são posicionados convencionalmente usando um subconjunto dos bocados do endereço (do exame). Isto tem o efeito de distribuir endereços consecutivos através do cache na esperança de reduzir conflitos, e é barato computar. Com objetos no cache o índice deve nem consistir unicamente em bocados de OID (de modo que os diversos cache linhas de objetos grandes opõem dentro de um cache ajustado), nem somente em bocados offset (de modo que os objetos pequenos são restringidos a uma parcela do cache). nós codificamos (OID, offset) endereços na escala de EPA usando traçar invectiveis que combina a parte do OID e bocados offset nos bocados do índice. O inclusão dos bocados offset espalha máxima para fora as linhas do cache de um único objeto, e as linhas do cache dos objetos diferentes são distribuídas através do cache pelos bocados de OID. • G. Wright e outros. /Ciência do computador que programa 62 (2006) 145-163 149 3. Encoding do endereço do objeto (exemplo com bocado 40 OID + bocado 12 deslocado). 4. Um objeto pequeno com e sem enviesar. usar-se exclusivo-ou combinação do exemplo são ilustradas em 3. O Indexem pela extração do bocado terá o efeito desejado, e o ‘’ OID real e o offset (quando necessário) podem ser recuperados invertendo o encoding. Outra uma operação é executada como parte do encoding. [15.16] sustentações bifurcated de uma disposição do objeto [rapidamente identificação das referências para o coletor do lixo: o encabeçamento do objeto está no meio do objeto com referências em offsets negativos e em valores primitivos em offsets positivos (os campos de Java são declarados como conter um ou o outro, ao contrário do Smalltalk). Em uma execução direta mesmo os objetos pequenos ocupariam duas linhas do cache, umas despesas gerais intolerável. Nós enviesamos conseqüentemente objetos dentro das linhas do cache: o OID contem um pequeno número de bocados que especificam onde dentro de sua linha do cache o encabeçamento do objeto (offset lógico zero) deve encontrar-se. 4 mostras como um objeto é enviesado de modo que os campos da referência cabidos dentro do mesmo cache alinhem como o encabeçamento do objeto. O valor enviesado está adicionado ao offset lógico pedido como parte da geração do endereço, quando (OID, offset) o endereço é codificado para dar forma ao EPA. 5 mostras como 4 são modificados para incluir o enviesamento; três bocados enviesados são feitos exame aqui dos bocados high-order do OID, permitindo enviesar a um todo o limite de 8 byte dentro da linha do cache de 64 byte. Enviesar é na maior parte transparente a software; somente o allocator e o coletor do lixo, que deve saber os campos são organizados dentro das linhas do cache, estão cientes. O valor enviesado desejado é constante para uma classe particular.
Fig. 3. Object address encoding (example with 40 bit OID + 12 bit offset).
2.3. Gerência do cache: Alocamento e desalocagem do objeto • Os caches em sistemas convencionais são projetados operar-se na maior parte transparente ao código da aplicação, embora alguns as partes do sistema operando-se podem necessitar estar cientes da organização do cache. As sugestões, tais como instruções do prefetch, podem ser fornecidas para o desempenho mas são semanticamente viaveis. Em nosso caso, co-projetar da ferragem e virtual • G150 G. Wright e outros. /Ciência do computador que programa 62 (2006) 145-163 5. Encoding do endereço do objeto (exemplo com enviesamento). a máquina permite uma comunicação melhor da intenção. Por exemplo, quando alocar um objeto novo lá não é nenhuma necessidade buscar os índices da memória no construtor do cache- overwrite todos os dados. Uma instrução do zero-e-alocamento, como o PowerPC DCBZ (bloco zero) do cache dos dados [17], pede que uma linha do cache seja writable alocado no cache e que os índices estejam ajustados a zero. Similarmente, uma vez que um objeto é sabido para ser lixo não há nenhuma necessidade escrever para trás seus índices do cache à memória; livrar suas linhas do cache imediatamente impedirá o tráfego desnecessário da memória e permitirá a colocação melhor de objetos novos no cache. Os Variantes de ambas estas operações foram propostos dentro
2.4. Tradução • Um cache do objeto permite o acesso rápido aos objetos, no exemplo comum (da batida), usando somente o posição-independente objeto ID. No exemplo de uma falta ou de um eviction de cache o sistema deve imóvel fornecer meios de recuperar ou de armazenar o estado do objeto; a tradução envolve olhar acima do endereço físico do objeto na tabela do objeto e então reconciling os índices do cache do objeto alinhar com a reapresentação da em-memória do objeto. Nós realizamos este com um mecanismo da ferragem interposed logicamente entre a hierarquia do cache e a memória principal (6). Os intercepts do tradutor a falta de cache ao objeto EPAs e, usando uma máquina simples do estado, lê a entrada da tabela do objeto para começar o endereço físico e gera (cache coherent) esforços das linhas físicas necessárias do cache; o lookup de tabela do objeto é similar a uma caminhada page-table da ferragem. Uma única linha do cache do objeto pode sobrepor um ou dois linha-objetos físicos do cache na memória palavra-é alinhada, não cache-linha alinhada, para evitar a perda da memória do heap à fragmentação. A fragmentação do Heap é mais menos aceitável do que a fragmentação nos caches porque os caches podem conter somente uma fração pequena de um heap do multigigabyte, mas o DRAM main-memory faz exame de um componente muito significativo de orçamentos do poder e de custo de uma máquina. A entrada da tabela do objeto contem também a informação do tamanho de modo que as extremidades dos objetos sejam seguradas corretamente. Uma vista lógica da tabela do objeto é mostrada em 7, mas não são uma estrutura fisicamente separada; como com as tabelas de página convencionais, a tabela do objeto é armazenada na memória coherent e o VM manipula-a com cargas e lojas. Deve-se enfatizar que a linha reapresentação do cache do objeto de um objeto não está mantida coherent com a vista de sua reapresentação física da memória como visto com os acessos de memória convencionais. A coerência trabalha completamente independentemente nas linhas do cache do objeto e em linhas físico-etiquetadas do cache; o tradutor reconciles somente os dois quando uma linha do cache do objeto é construída em uma falta de cache ou escrita para trás no eviction. A vista dos mutator do objeto é unicamente através das linhas do cache do objeto. A máquina virtual deve ciao para não modificar um objeto usando cargas e lojas convencionais, que seja conseguido facilmente nunca traçando o heap no espaço de endereço virtual convencional. Os processadores centrais têm o acesso corrente ao armazenamento físico de um objeto somente para funções internas do VM tais como o realocação.
2.5. Relocação simultâneo do objeto • Um sistema long-running do objeto deve realocar objetos vivos para evitar a fragmentação do heap; este compactação do heap deve ser simultâneo ou incremental evitar pausas longas do mutator. Como discutido acima, referências indiretas com anual • G. Wright e outros. /Ciência do computador que programa 62 (2006) 145-163 151 6. Diagrama esquemático da arquitetura proposta. Unshaded caixas representa unidades novas; as linhas tracejadas são trajetos de dados novos. O diagrama superior representa um sistema 2-CPU single-chip, como simulado. Um diagrama mais baixo mostra extensões: Múltiplo-CMP sistema, caches fora do limite do GC. 7. A organização de um objeto dentro do cache e na memória, e sua entrada associada da tabela do objeto. a tabela do objeto pode fazer o realocaçõa muito mais fácil porque o endereço físico de um objeto é armazenado em somente um lugar. Aqui nós descrevemos como sincronizar a tradução e o realocaçõa na hierarquia da memória do objeto de modo que mutation, com suas traduções implicadas, podem prosseguir simultaneamente com o compactação. O modelo básico para o realocaçõa de copi é que o compactor lê os índices do revestimento protetor físico da memória o objeto, cópias aqueles dados à posição nova, e atualiza então a entrada da tabela do objeto para apontar à área nova. A leitura e a escrita são executadas usando cargas ordinárias e as lojas que operam-se em endereços físicos; estes as operações não passam através do tradutor. Quando o copi ocorrer há dois problemas da simultaneidade com respeito à tradução: firstly, uma escrev-tradução (eviction do cache) de uma linha do cache do objeto deve ser refletida no • G.152 G. Wright e outros. /Ciência do computador que programa 62 (2006) 145-163 copí, e, secondly, uma l-tradução deve usar a posição velha até que a cópia esteja completa. O problema lido é mais fácil: na ausência de escrever traduções que as duas versões são idênticas quando a cópia está feita, assim que o atomacidade • aparente com respeito ao update de OTE não é crítico. Nós resolvemos o problema da escrev-tradução usando um único ‘evicted’ mordido em cada OTE. Sempre que o tradutor executa uma escrev-tradução na parte de um objeto que ajuste este bocado atômica com respeito ao update das linhas físicas do cache, por exemplo prendendo a linha do cache que contem o OTE até que os updates estejam completos. O compactor cancela o bocado antes de começar um realocaçõa, copía a memória física, e troca então o endereço físico novo em usar-se de OTE compar-e-troca a operação (CAS). O CAS falhará e a cópia retried se o tradutor entrementes processar um eviction de qualquer parte desse objeto; se o CAS suceder a posição nova está comutada atômica dentro, e nesse ponto as cópias são idênticas.
Fig. 6. Schematic of the proposed architecture. The unshaded boxes represent new units; dashed lines are new data paths. Upper diagram representsa 2-CPU single-chip system, as simulated. Lower diagram shows extensions: multiple-CMP system, caches outside the GC boundary.
Fig. 7. The organization of an object within the cache and in memory, and its associated object table entry.
2.6. Sumário • Nós descrevemos uma hierarquia da memória para objetos, o realocaçõa simultâneo oferecendo e a flexibilidade de uma tabela do objeto com nenhuma penalidade do tamanho ou da velocidade de código (no caso comum). Um cache do objeto prende as partes dos objetos, etiquetadas diretamente com o objeto posição-independente ID e o offset, ao lado das linhas físico-etiquetadas convencionais do cache. A função do índice do cache para endereços do objeto é determinada pela escolha de codificar na escala de endereço prolongada. As linhas do cache do objeto são mantidas coherent usando o mecanismo normal da coerência do cache. Um tradutor da ferragem segura a conversão de linhas do cache do objeto a e da reapresentação na memória física no exemplo de uma falta ou de um eviction de cache. A hierarquia da memória para objetos dá forma a uma base para o trabalho futuro na gerência altamente scalable, simultânea da memória algoritmos. A seção seguinte apresenta uma possibilidade, construindo nas características do cache do objeto.
3. coleção do lixo do Em-cache • A coleção do lixo é um processo inefficient para caches: o gráfico do objeto é atravessado tipicamente pelo marca-varre campos tocantes da referência do coletor em cada um objeto vivo exatamente uma vez; embora haja algum localização espacial dentro dos objetos há pouco localização entre os objetos referenciado neste teste padrão [19]. Se a maioria de acessos forem aos objetos recentemente alocados, aos caches e à geração a mais nova de parcelas similares de uma preensão gerenciador do coletor do lixo do heap. Os objetos são alocados certamente no cache; os objetos short-lived morrerão também no cache. Com alguma sustentação da ferragem, nós podemos construir um coletor novo do lixo da geração que se opere inteiramente dentro dos caches do objeto, com quase nenhumas referências externas da memória requeridas: coleção do lixo do em-cache. Isto dá coleções rápidas, predictable sem tráfego global da memória ou sincronização e conserva a escrita para trás de objetos do lixo à memória.
3.1. Limites da coleção do lixo • Para as finalidades da coleção do lixo do em-cache nós agrupamos os processadores centrais e seus caches associados dentro de um ou mais limites do GC. Um limite do GC limita um grupo dos processadores centrais em que o mutation será pausado e o lixo o coletor funcionará, e os caches dentro de que coleção ocorrerão; nós esperamos uma comunicação rápida dentro do limite do GC. No exemplo de um multiprocessor single-chip (CMP) com diversos a em-microplaqueta L1s e um L2 compartilhado o limite natural do GC coincide com o limite da microplaqueta e contem todos os processadores centrais e caches da em-microplaqueta (6). Um multiprocessor construído de diversos tais CMPs teria uma região do GC por a microplaqueta. Para o concreteness nós suporemos esta organização, mas outros são possíveis.
3.2. Objetos locais e a barreira do GC • Um objeto é elegível para a coleção do em-cache se estiver criado dentro do limite do GC e uma referência a ela nunca sair do limite, isto é, todas as referências ao objeto estão sabidas para remanescer nos caches da em-microplaqueta [20]. O liveness de um objeto tão local pode ser determinado sem operações de memória globais examinando os índices dos caches; nenhuma linha que executa em um processador central remoto pode começar a preensão de uma referência sem uma comunicação com a memória compartilhada. o objeto está dito ser non-local se este for já não verdadeiro: uma referência a ela saiu do cache. Os objetos Non-local são supostos para estar vivos; todos os objetos non-local nos caches são raizes para a coleção do em-cache. Nós seguimos o estado local dos objetos com o um estado extra mordido por a linha do cache. O bocado non-local da linha do cache do encabeçamento de um objeto (a linha do cache que contem o offset zero) é ajustado quando uma referência a esse objeto sae do limite do GC. • G. Wright e outros. /Ciência do computador que programa 62 (2006) 145-163 153 8. Estado extra do GC mantido em um cache do objeto. Para manter esta barreira um a parte de ferragem, que nós chamamos o warden, examina linhas que parte do cache para encontrar as referências. Em um pedido transmit-non-local, o warden transmite o OIDs referenciado aos caches dentro do limite, rather como um snoop-invalidation; um fósforo do Tag na linha do cache do encabeçamento ajustará o bocado non-local. O warden processa referências de outros objetos (linhas do cache do objeto), e do VM estruturas de dados e as pilhas physicallytagged dentro linhas do cache. O warden ajusta também o bocado non-local de todas as linhas entrantes do cache: nós não podemos seguir referências quando um objeto é fora do cache, assim os objetos que saíram do cache são non-local conservadora marcado. O jogo de objetos locais corresponde aproximadamente à geração a mais nova de um coletor gerenciador do lixo [19]. Um objeto está promovido fora da geração do em-cache quando uma referência a ela escapa do limite do GC, e o warden mantém a barreira associada do GC.
3.3. Encontrando referências e raízes • As referências dentro dos objetos podem ser identificadas usando o conhecimento da disposição bifurcated do objeto. Referências dentro a memória física (isto é, na pilha ou em outras estruturas e daqui raizes de dados do VM para a coleção do em-cache) é indistinguivel dos inteiros, e é encontrada convencionalmente usando mapas da pilha, parsers feitos sob encomenda da estrutura de dados, etc., mas tendo o processo do warden estas estruturas de dados complexas são indesejáveis. Uma solução mais geral envolve a memória etiquetada: um bocado extra adicionado a cada palavra no sistema distingue referências dos inteiros. Nós podemos começar os benefícios da memória etiquetada para a coleção do em-cache mas sem a despesa de 33 - ou uma memória de 65 bocados durante todo o sistema usando bocados modificados da referência somente dentro dos caches; o custo é um bocado extra por a palavra do cache. Isto trabalha porque o warden e o coletor do em-cache necessitam somente encontrar referências aos objetos locais; uma linha do cache fora do limite do GC não pode conter nenhumas referências locais por causa da ação do warden. Jogos de instrução da armazen-referência o bocado da modific-referência, e espaços livres de uma instrução do armazen-inteiro ele, se na memória do objeto ou do non-objeto. O warden emite pedidos transmit-non-locais para palavras que parte com bocados da modific-referência do jogo. Similarmente, o coletor do incache pode encontrar raizes fora dos objetos procurando referências modificadas dentro do limite do GC. Há alguma redundância em usar os bocados da modific-referência junto com a disposição bifurcated do objeto, pelo menos para o coletor do em-cache. A finalidade principal dos bocados da modific-referência’ está encontrando referências fora dos objetos, mas servem ainda como um optimization dentro dos objetos: reduzem o número das referências processadas pelo warden e pelo coletor. Dado os bocados da modific-referência, a disposição bifurcated não é requerida, mas reduz o número das linhas do cache examinadas pelo coletor e é também útil para a coleção do velho-espaço.
3.4. O algoritmo da coleção do em-cache • O coletor do lixo do em-cache (ICGC) é um simples marca-varre o coletor do lixo mas com a ferragem introduzida acima dela é ambo o paralelo, usando todos os processadores centrais dentro do limite do GC durante uma coleção, e concurrent, que o mutation pode continuar em outros processadores centrais fora do limite do GC. O GC usa dois bocados extra por a linha do cache (8), etiquetando os como a marca mordida e o bocado feito. O bocado da marca da linha do encabeçamento do objeto designa um objeto vivo e o bocado feito indica uma linha do objeto que seja feita a varredura. Na terminologia tri-color comum, o bocado da marca implica cinzento ou preto (ser ou foi feito a varredura), e o bocado feito indica o preto. • Cada processador central dentro do limite itera sobre todos os caches confidenciais a ele e uma parcela de qualquer cache compartilhado. Cada linha do cache que contem uma parte de um objeto é feita a varredura se o encabeçamento desse objeto tiver da marca ou dos bocados non-local ajustada. Todas as referências modificadas dentro da parte do objeto transmit-são marcadas então; esta é a mesma operação provocada pelo warden a não ser que aquela ele ajuste o bocado da marca em vez do bocado non-local e é exposta ao controle do software. Durante a fase do GC, toda a transmissão que bater unmarked o encabeçamento de lugares de um objeto o OID em uma fila, associado com esse cache, porque marcado recentemente (cinza) objeta. O processador central responsável estalam então o OID desta fila da marca e as varreduras que objetam se residirem no cache. A fila é um optimization: a alternativa é tornar a varrer (partes de) o cache para encontrar as linhas recentemente marcadas. Nas simulações descritas mais tarde nós supomos um tamanho ilimitado da fila; uma discussão mais detalhada do excesso da fila é além do espaço deste papel. As raizes para a coleção do em-cache são objetos non-local, objetam os fragmentos (partes dos objetos cujo o encabeçamento é fora do limite do GC), e as referências modificadas contidas em linhas físico-etiquetadas do cache. Com a referência modificada mordida nós não necessitamos usar mapas da pilha ou outras técnicas mais complexas para encontrar referências na pilha ou posições fora do heap. Uma única passagem através do cache encontra todas as raizes; o reachability recursiva é segurado através do mecanismo da transmissão. Nós expomos os índices do cache para a inspeção pelo coletor: um mecanismo é fornecido para iterar sobre os jogos do cache que retornam o Tag e o estado (non-local, marcado, etc.). Baseado neste estado o GC emite cargas ordinárias e armazena-as para ler os índices daquelas linhas do cache onde necessário. A fase da marca termina quando todos os objetos non-local e marcados foram feitos a varredura. Nós podemos então recuperar o OIDs e cache linhas de todos os objetos que não tiverem tampouco destes bocados ajustados. Nós recuperamos as linhas do cache simplesmente invalidating seus índices durante uma outra passagem através do cache. O não validação impede aqueles índices, que são já não válidos, da escrita para trás à memória principal, livra o espaço para alocamento novos do em-cache, e conserva o tráfego de barra-ônibus. Este algoritmo está paralelo; cada processador central dentro do limite pode ser objetos da exploração simultaneamente. Linhas do GC comunicar-se através das filas da marca descritas mais cedo. Uma fase final da sincronização assegura-se de que todos os processos estejam prontos para se mover na fase da varredura. O algoritmo é também concurrent que o mutation fora do limite do GC pode continuar sem explícito sincronização com as linhas do GC. As linhas que funcionam fora do limite do GC podem continuar a usar objetos e mesmo pedir e obter objetos dentro do limite do GC durante uma coleção. O warden segura todos os objetos que deixam o limite do GC durante uma coleção justo como durante a operação normal, assim assegurando isso a referência escapando-se é esclarecida. Adicionalmente, as linhas do mutator que foram suspendidas dentro do limite do GC podem rescheduled a outros processadores centrais. Como cada linha alcança objetos e pilhas que depopulate o limite do GC que está sendo coletado, mas toda a sair dos objetos será objetos viv-inoperantes será saída atrás para a coleção.
3.5. Limitações do GC do em-cache • o GC do Em-cache tem algumas limitações não sofridas por coletores convencionais. O mais fundamental é que o tamanho da região collectable está reparado na ferragem. Uma geração nova do software pode ser aumentada no tamanho para caber as propriedades específicas da aplicação e para melhorar a eficiência do GC. É sempre possível escolher como freqüentemente funcionar o GC do em-cache, ou o incapacitar mesmo completamente sem desempenho do mutator penalizing, mas o custo da execução de ferragem têm sido pagadas já.
3.6. Sumário • a coleção do lixo do Em-cache opera objetos sobre novo-alocados com nenhuma falta de cache e nenhumas despesas gerais da barreira do software. Embora o mutation seja suspendido em alguma divisória da máquina a coleção é simultânea com outras divisórias, e a coleção prossegui na paralela em todos os processadores centrais dentro da divisória. A tabela 1 sumaria a ferragem e as extensões de ISA introduzidas.
4. Trabalho relacionado • O projeto do COGUMELO introduziu os caches do objeto [12] e o GC do em-cache [20], originando algumas das idéias descreveu aqui. Entretanto, o COGUMELO era estritamente um projeto do único-processador, e o enchimento, os evictions e a barreira do cache processando (similar a nossos warden e tradutor) foram controlados no software por alimentadores da armadilha com nenhuma simultaneidaderequerido. A memória foi etiquetada throughout, como um sistema puro do Smalltalk, e o objeto misturado/caches convencionais não era necessária. Os caches do objeto com tradução atrasada são relacionados próxima aos caches virtual-dirigidos, por exemplo o Berkeley DENTE RETO [21]. O exemplo do objeto é realmente mais fácil; nós não temos problemas com aliasing do endereço nem não invertemos (físico a virtual) traduções. o alocamento do Em-cache e etiquetar do lixo foram propostos dentro [18]; os autores discutiram que o lixo deve ser detectado whilst ainda no cache, mas não acoplou o GC com os índices do cache como nós. Os vários esquemas do GC da ferragem foram propostos [3.4.22.23]; nosso esquema fornece o auxílio da ferragem para a coletor software-baseado. Nosso sistema compartilha do motivation com as máquinas virtuais co-projetadas de [24] mas a memória e o GC específicos a organização é muito diferente. Os vários estudos da interação do GC e de caches convencionais foram publicados [25-27]. Nenhum relacionou-se a parte traseira da atividade do ferragem-nível à atividade high-level como nós fazemos na seção 6. Nossas operações da inspeção e da manipulação do cache são similares no espírito àquelas descritas dentro [28]. Os sistemas de Azul desenvolveram uma arquitetura CMP-baseada para Java que inclui a sustentação da ferragem para barreiras do GC sobre uma hierarquia convencional da memória [29]. Seu coletor requer todas as linhas do mutator fazer exame de diversas pausas curtas durante cada ciclo da coleção, embora não sejam todas suspendidas simultaneamente; o realocação está segurado pageprotecting parcelas do heap, fazendo com que os mutators prendam e reparem acima das referências se tentarem aceder. No contraste, nosso o GC do em-cache suspende o mutation dentro de um limite particular do GC para a duração da coleção, com nenhum impacto em mutators funcionar em outra parte no sistema, e em realocaçõa dos objetos pode prosseguir completamente simultaneamente em a base do por-objeto. Nosso processar da barreira ocorre completamente na ferragem, quando o algoritmo de Pauseless de Azul usar as instruções feitas sob encomenda compiladas no córrego da instrução para testar a barreira com um alimentador da armadilha de software para executar processar se necessário.
4.1. Trabalho Unrelated • A proteção em Java é controlada completamente no nível virtual da máquina. As referências em nosso sistema são desprotegidas pelo ISA, e o processador central não tem nenhum conhecimento especial de referências do objeto à exceção das instruções da armazen-referência. Nós não requeremos a proteção da ferragem ou compartilhar controlado baseada no controle de acesso [9] ou nas potencialidades [8.30]. O núcleo do processador central é mudado mínima; não processa objetos, disposição do objeto ou comportamento objeto-relacionado à exceção das instruções do armazen-à-objeto-espaço do loadand. Ao contrário de Intel 432 [7], nós não suportamos um modelo cheio do objeto do língua-nível na ferragem.
5. Metodologia da simulação metodologia • Na seção seguinte nós apresentamos uma avaliação preliminar da arquitetura proposta. Para avaliar a arquitetura nós construímos uma simulação dirigida pelos traços obtidos de um JVM modificado. Nossa arquitetura proposta incorpora instruções novas (por exemplo, carrega e lojas para objetar o espaço) e daqui nós não podemos fazer exame de traços do instrução-nível de um JVM existente. Seria possível modificar um JVM existente para emitir-se 156 G. Wright e outros. /Ciência do computador que programa 62 (2006) 145-163 estas instruções, mas então nós também necessitaríamos um simulador combinando do instrução-nível e uma execução do algoritmo novo do GC dentro do JVM. Para uma avaliação preliminar nós decidimo-nos adotar uma estratégia diferente. Melhor que construindo uma execução completa do GC nós escolhemos construir uma simulação das estruturas relevantes da ferragem e do algoritmo proposto do GC. Isto permite-nos ao finesse muitos dos detalhes da execução e dá-o uma estrutura muito mais malleable para a experimentação.
5.1. Estrutura malleable da geração e da simulação do traço para a experimentação. • O simulador é dirigido pelos traços das aplicações de Java que funcionam em um JVM modificado, chamados o VM seguindo (TVM) [31]. O TVM emite-se traços do objeto-nível do comportamento da aplicação, including todas as criações do objeto, os acessos aos objetos, variáveis de estática e pilhas das linhas' (como definido na especificação de JVM [32]), o carregamento e definição das classes, etc. O traço é uma descrição completa da execução do programa nos termos de seus efeitos nos objetos, pilhas e dados de estática, mas é na maior parte independem da execução real dentro do TVM. Por exemplo, cada objeto nomeado no traço é identificado por um ID original unrelated ao endereço de memória do objeto dentro do TVM. Isto permite que nós simulem estratégias diversas da gerência da memória. Com esta aproximação à simulação nós podemos atribuir eventos nivelados da ferragem (tais como a falta de cache) a suas causas do highlevel (comportamento da aplicação, atividade do GC, etc.) com facilidade relativa. As medidas do ferragem-nível sumariadas na seção seguinte são quebradas para fora pela atividade high-level; nós acreditamos que este é a primeira vez que este foi feito. Além a um simulador de nossos arquitetura e JVM propostos, nós construímos também uma simulação da referência de uma arquitetura convencional com um heap gerencia e um limpador para a geração nova, como usada nos muitos a produção JVMs. Esta simulação reside na mesma estrutura da simulação, e é dirigida pelos mesmos traços, permitindo uma comparação direta dos dois sistemas. Nenhum sistema inclui um coletor ou um compactor do velho-espaço; aqui nós estamos interessados no comportamento do alocamento e da geração a mais nova do GC. Um inconveniente desta estrutura da simulação é que nós temos a informação insuficiente para derivar o tempo de execução estimativas para uma execução plausivel. Nosso simulador modela somente a atividade do sistema da memória induzida pela máquina virtual em dados manipulando; não tem nenhuma noção das instruções, encanamentos ou latências e daqui nós podemos somente comparar efeitos do sistema da memória (tais como a falta de cache). Entretanto, a atividade do sistema da memória é um componente principal do tempo gastado executando a maioria de aplicações de Java, e, desde que nosso trabalho é focalizado nesta área sozinho, nós acreditamos que é razoável limitar o estudo a esta área para agora. Na seção 8 nós descreveremos algumas etapas seguintes possíveis. Uma conseqüência de nossa estrutura simplificada da simulação é que não modela uma variedade dos efeitos que são importantes em determinar o desempenho real-world mas que nós acreditamos ser neutro em nossa comparação (ou, se qualquer coisa, penalize nossa arquitetura proposta): (1) Os traços de TVM descrevem a execução nos termos da interpretação simples do bytecode de Java: por exemplo, “adicionar” resultados do bytecode em dois PNF e um impulso à pilha de uma linha, visto que uma produção JVM usaria um compilador dinâmico otimiza esta em uma operação register-based. Daqui há muitas mais operações de memória às pilhas em nossa simulação do que estar atual em um sistema de produção. Entretanto, estas operações estão as mesmas em ambos os modelos simulados; nós subtraímos para fora empilhamos a atividade de modo que a outra atividade pudesse ser comparada sem polluted pelos dados da pilha. (2) Nosso simulador não modela nenhuma atividade do instrução-lado (Eu-caches, ou atividade do sistema da memória devido a buscar instruções) ou a compilação just-in-time. As seqüências de instrução no mutator são mais curtas em nossa arquitetura proposta devido ao eliminação de uma barreira do GC do software, assim favores deste efeito o sistema da referência. A única peça da máquina virtual que seria significativamente diferente é o código do GC, que tende a ser rather pequeno e tem o locality bom; nossas modificações propostas devem fazê-la cache-mais amigável. (3) Nosso simulador não modela a atividade do sistema da memória fora do heap, das pilhas e dos dados de estática, isto é, às estruturas de dados de JVM ou ao código nativo. Nossas técnicas do GC reduzirão o tráfego da memória às estruturas de dados de JVM (por exemplo, não há nenhuma estrutura de dados requerida para encontrar referências em pilhas ou dentro dos objetos). Nossas modificações são neutras com respeito ao código nativo. Nós modelamos o alocamento de OIDs, no sistema do objeto, em algum detalhe. A gerência de OID é fornecida construindo uma lista ligada de objetos disponíveis usando alguns dos objetos livres eles mesmos. Para embalar um OIDs mais disponível dentro do cache, nós utilizamos o espaço dentro dos objetos da lista livre para armazenar OIDs livre adicional. Assim quando um OID novo é necessitado a cabeça da lista livre é perguntada para um valor livre de OID; se nenhum estiver atual então a cabeça própria está estalado dolista e usado. Os objetos que contêm a lista livre podem ocasionalmente evicted do cache, assim que é possível que o alocamento pode causar uma falta de cache. Quando os objetos são coletados o primeiro objeto coletado está usado como um elemento novo da lista livre, com o OIDs livre subseqüente colocado dentro deste objeto. Quando esse objeto se enche o objeto livre seguinte está usado como um elemento da lista livre, e assim por diante. Porque estes objetos eram recentemente residente do cache para a coleção, o processo de construir a lista livre não encontra nenhuma falta de cache. As operações de memória de nossas características adicionais da ferragem (o warden e o tradutor) são incluídas no simulações. Nós podemos antecipar algum aumento na latência ao processar a falta de cache, mas como indicado acima nós não tentamos reduzir nossos dados às estimativas do tempo.
5.2. Os Workloads usaram-se • Para dirigir nosso simulador nós fizemos exame de traços de TVM dos seguintes programas: (1) O suite das especs. JVM98, usando os funcionamentos do tamanho 100 [33]. (2) Especs. JBB2000 [34], usando 4 armazéns, uma tabela do artigo do half-size (10.000 entradas), e um intervalo prolongado da medida neutralizar o slowdown causado seguindo. (3) Uma aplicação multi-enfiada do macio-switching das telecomunicações (telco app do `'), dirigida por um workload sintético. A tabela 2 contem medidas do comportamento do alocamento de cada traço: o número de bytes e objetos alocados no heap (para disposições e non-pôr objetos) e áreas de estática, os tamanhos médios do objeto e da disposição, e o número das classes carregou (classes do objeto e da disposição). Os tamanhos do objeto são uniformemente pequenos; os tamanhos da disposição variam mais. A tabela 3 alista o comprimento de cada traço (medido pelo número de eventos de TVM), e o número de eventos da carga e da loja para objetos, disposições, pilhas e áreas de estática. 158
5.3. Parâmetros da simulação • Nossa máquina simulada (ilustrada em 6) consiste em dois processadores centrais idênticos cada um com caches de 64 KB L1 (8- maneira associativa com 64 linhas do cache do byte). Estes processadores centrais compartilham 8 de um cache do MB L2 (também maneira 8 associativa). A política da recolocação do cache usada é resultados atuais de pseudo-LRU.We somente desta configuração como nós a acreditamos representante de execuções possíveis diversos anos para fora. O coletor do lixo da referência usou dois 16 semi-espaços do MB com um ilimitado tenured a geração. Os objetos eram tenured depois que sobreviveram três ciclos da coleção. Os semi-espaços menores (4 MB e MB 8) foram tentados também; nós relatamos resultados somente para MB 16 como executou o mais melhor e somos também um ajuste típico para a produção JVMs. Os semi-espaços maiores conduzem para freqüentar mais menos coleções do lixo, assim potencial recuperar mais lixo para menos trabalho, mas conduz a uma pegada total mais grande e a umas pausas individuais mais longas do GC. Todas as linhas alocam no mesmo semi-espaço, mas para impedir compartilhar falso no alocamento que reivindicam os blocos (64 KB) grandes que são subdivididos então em objetos. O cache do objeto zero-e-aloca a operação impede a falta de cache ao alocar objetos. Como proposto originalmente [18], tal operação poderia também ser usada em um sistema convencional tal como nossa referência. Nós isolamos seu efeito também simulando nosso usar-se do sistema da referência zero-e-alocamos durante o alocamento do objeto e o GC (objetos de copi no semi-espaço novo). O ICGC é iniciado mais freqüentemente do que o coletor da referência, de modo que os alocamento não encham o cache e não comecem a evict objetos potencial reclaimable. Nós escolhemos mandar o ICGC coletar cada MB 4 do alocamento, como aquele era infrequënte bastante permitir que o lixo resulte, mas freqüentemente bastante aquele os objetos do lixo não era forçado do cache por alocamento novos. No general, nós encontramos que, para caches de MB 8 ou de mais, trabalhou bem para coletar depois que os alocamento novos usaram aproximadamente a metade do cache. Porque os tamanhos do cache aumentam os funcionamentos de ICGC menos freqüentemente e menos lixo ilude-o.
6. Resultados preliminares • Nós fizemos exame de traços dos workloads e simulamos o sistema da referência (sabido daqui por diante como o `convencional o sistema'), com e zero-e-aloca without, e o sistema do cache do objeto. Para cada simulação nós contamos batidas de cache e faltamo-las, lemo-las e escrevemo-las, tráfego da coerência, e traduções. Cada evento foi atribuído ao um ou outro o coletor, a atividade da pilha dos mutator (que nós não relatamos, porque as razões enumerated mais cedo), a atividade do heap dos mutator, e, para o cache do objeto, as operações extra envolvidas em controlar a tabela do objeto (gerência do `OID'). 9 mostras os resultados em cada nível da hierarquia da memória, normalizado pelo número dos eventos em cada traço (analogous ao tempo). Para cada workload a barra esquerda é para o sistema convencional (C), o meio para o sistema convencional com zero-e-aloca (Z), e a direita para o sistema do objeto (O). Cada barra decomposed mais mais no trabalho executado durante o mutation e o GC, e no sistema do objeto um componente adicional é devido à gerência de OID. Nós incluímos as operações do limite do GC (GCB), que representam zero-e-alocam, inspeção do cache e objeto operações da gerência, na carta com as batidas L2: nosso GCB inclui o L2, assim que nós esperamos operações de GCB ter custo mais ou menos idêntico como as batidas L2. No exemplo de zero-e-alocar isto pode ser impropriamente generoso, dependendo do execução. Os dados crus para cada operação estão disponíveis em nosso relatório técnico [35]. Examinando os gráficos do alto ao fundo, nós vemos que o sistema do objeto tem tipicamente ligeiramente poucas batidas L1 no mutator. O número de acessos do mutator é mais baixo porque zero-e-alocar substitui escreve no alocamento (C indo visto a Z), e também porque a tabela de cartão escreve é eliminada; a relação da batida L1 é ligeiramente mais má em O do que Z por causa da embalagem mais menos densa dos objetos (daqui o número ligeiramente mais grande de batidas do mutator L2 e, em alguns casos, em falta no sistema do objeto). O meio geométrico das relações das batidas L1 no sistema do objeto às batidas L1 no sistema convencional é 0.98. O ICGC negocía eficazmente mais operações de L2 ou de GCB para um número reduzido da falta L2 (à exceção de DB 201 compressa e 209). O meio geométrico das relações de batidas do objeto L2 e de operações de GCB às batidas L2 convencionais é 7.5, quando para a falta L2 for 0.24. As tomadas do coletor do em-cache essencialmente nenhuma falta de cache L2, conduzindo a uma redução dramática na falta L2 total nos programas onde eram significativa (213 javac, JBB). Zero-andallocate ajuda também ao sistema da referência reduzindo a falta do mutator L2 (alocamento), mas o ICGC reduz o total falta mesmo mais adicional. Porque o custo relativo de L2 falta aumentos nós esperamos este resultar em um ganho líquido do desempenho para o sistema do objeto. Durante a coleção mais da atividade no cache do objeto é devido às operações de GCB (como o coletor está fazendo inspeção do cache e trabalho consideráveis do invalidation). Anotar que o mpegaudio 222 não aloca bastante objetos para provocar uma única coleção convencional.
Fig. 9. Cache activity for each workload on conventional (C), conventional with zero-and-allocate (Z), and object (O) caches, normalized to traceevents. Top: L1 cache hits; Middle: L2 cache hits and GC boundary operations; Bottom: L2 cache misses. Each bar is further decomposed bysoftware activity (mutation, garbage collection and OID management).
6.1. Linha utilização do cache • Como esperado, nossas taxas da falta do cache (no detalhe no L1) são ligeiramente mais más porque nós não embalamos objetos densa em linhas do cache. A marca de nível a mais má neste respeito é o DB 209, que se usa na média somente 34.1% de cada linha do cache (referências 32-bit, 64 linhas do cache do byte); neste caso interage mal com o teste padrão de referência da aplicação, explicando o aumento na falta L2 para o sistema do objeto. O meio sobre todas as marcas de nível é 55.5%. Estes números melhoram por 10%-15% com um movimento às referências 64-bit. A tabela 4 contem os resultados completos da utilização. Este efeito será mais significativo para marcas de nível pequenas (tais como o suite das especs. JVM98), onde mesmo as estruturas de dados relativamente long-lived podem imóvel residir no espaço novo. Nós esperamos que menos locality spatial do inter-objeto no tenured dados das aplicações grandes, long-running, onde este efeito deve ser menos significativo (a pesquisa está continuando neste sentido). • Nós não acreditamos que a fragmentação no cache é uma edição séria. Claramente, afeta negativamente as taxas da falta de cache para algumas aplicações. Entretanto, nossos resultados incluem os custos deste efeito e mostram ainda uma melhoria no desempenho total. O custo da fragmentação (poucos objetos cabidos no cache) é mais do que compensado pela melhoria na eficiência do GC. Na seção 6.3 nós investigamos mais mais o efeito de usar as linhas do cache que são significativamente maiores do que objetos.
6.2. Javac study-213 detalhado • A tabela 5 apresenta um olhar detalhado nos resultados para um de nossos programas de marca de nível, javac 213. A tabela apresenta a cache contagens e relações de leitura/gravação da falta para os dois caches L1 (agregados) e o cache L2, as well as o número das traduções e dos outros statistics do cache. Cada uma métrica é pena quebrada pela atividade (GC contra o mutator contra a gerência de OID). Os resultados para outras marcas de nível estão também em nosso relatório técnico [35]. G. Wright e outros. /Ciência do computador que programa 62 (2006) 145-163 161 Total, o número da falta de cache L2 é consideravelmente menor com o ICGC. O coletor convencional faz o uso muito pobre do cache L2, com uma relação lida 52% da falta e sobre 99% escrever a relação da falta (causada copí objetos no semi-espaço novo ou promovendo os), quando o ICGC leu a relação da falta é perto de zero e há nenhum escreve a falta em tudo. A linha do mutator no sistema convencional vê a elevação escrever também taxas da falta, porque busca linhas do cache da memória durante o alocamento do objeto. O uso de zero-e-aloca no sistema convencional elimina a maioria da falta da escrita, e no fato conserva 56M que o alocamento escreve (28%), mas o GC faz exame ainda muitos da falta lida. O GC do em-cache no sistema do objeto elimina com sucesso toda a falta L2 durante o GC, tendo por resultado um total da metade da falta L2 do sistema convencional com zero-e-alocar, ou menos de um quarto without.
6.3. Estudos da sensibilidade • Os resultados relataram acima, porque a configuração descrita na seção 5.3, explora somente um único ponto em um espaço muito grande do parâmetro. Nós executamos alguns estudos limitados da sensibilidade para determinar como nossos resultados podem ser afetados por escolhas diferentes do tamanho do cache, da linha tamanho do cache, e do intervalo da coleção. Para conservar o espaço nós não incluímos os dados crus para estas experiências.
6.3.1. Intervalo da coleção • O sistema do objeto recupera mais lixo quando coleta mais freqüentemente; o sistema convencional, dado a política tenuring no uso, recupera mais lixo coletando menos freqüentemente (isto é, usando semi-espaços maiores). Para o sistema convencional, nossa mostra dos resultados uma melhoria pequena mas consistente no lixo recuperado como o tamanho do semi-espaço é aumentada de 2 a MB 4, 8, e então 16. Em algumas marcas de nível a ascensão da falta de cache L2 a um pico com 8 semi-espaços do MB e começa então melhorar, embora esta não seja universal. Quando os semi-espaços não cabem nos semi-espaços maiores do cache deve somente melhorar matérias, e o trade-off padrão do throughput contra a pegada do heap deve determinar a escolha do tamanho do semi-espaço. No sistema do objeto o número da falta L2 é muito insensitive ao intervalo da coleção. A decisão do custo/benefício está conseqüentemente entre o lixo recuperado e o número de operações do em-cache. Coletando cada MB 2 de recuperações do alocamento aproximadamente 10%-20% mais lixo do que nossa escolha do defeito de MB 4, no custo aproximadamente duas vezes de tantas como operações do incache. Na uma mão, coletar cada MB 8 (o tamanho do cache L2) resulta em uma diminuição similar na recuperação para uma redução a aproximadamente 40% em operações do em-cache. Dado a sensibilidade a este parâmetro, nós conclímos que nossa escolha de MB 4 é justa mas que mais pesquisa é needed em políticas da iniciação do GC do em-cache, including técnicas adaptáveis.
6.3.2. Tamanho do cache • tamanho Um menor, 4 MB, cache L2 resulta na recuperação de somente ao redor 75% do lixo que é coletado no cache do objeto do MB 8. Este número poderia ser melhorado coletando mais freqüentemente, mas o custo elevado foi discutido acima e o cache menor resultará em mais lixo que escapa-se em todo o caso. O tamanho do cache deve certamente ser fatorado na política da iniciação do GC.
6.3.3. Linha tamanho do cachê • O resultado o mais interessante é a variação com respeito à linha tamanho do cache. Nós não vemos uma penalidade, na falta de cache ou no lixo recuperado, para o byte 128 em vez de 64 linhas do cache do byte no sistema do objeto, mantendo o tamanho do cache constante em MB 8 em cada caso. Como o poder esperaram-se, o curtos non-põem objetos sofrem algum mais falta de cache, mas o totais uma diminuição na falta para disposições mais do que compensam. Esta é uma evidência mais adicional que alguma fragmentação no cache do objeto, que é mais mau com as linhas mais longas do cache, é aceitável. Cache linhas de 256 bytes e de um começo mais longo para causar aumentos significativos na falta de cache em algumas marcas de nível. No sistema convencional, sem a instrução do zero-e-alocamento, uma fração substancial da falta é devido ao alocamento, e as linhas muito longas do cache, até 512 bytes, continuam a mostrar melhorias na falta L2. Anotar que neste caso, embora o número da falta seja reduzido, mais bytes estão no fato que está sendo movido ao redor através do sistema da memória.
7. Sumário e conclusões • Nós descrevemos uma arquitetura da memória da novel para objetos que estendesse um sistema classico A arquitetura é baseada em um cache objeto-convencional hybrid, um warden para policiar a barreira do GC, e um tradutor para traçar nomes do objeto ao exame dirige-se usando uma tabela do objeto. Os objetos são dirigidos usando um objeto ID e o offset; o cache do objeto também é posicionado e etiquetado usando formulários codificados destes. Um coletor do lixo do em-cache explora a arquitetura para fornecer barato, baixo-pausa coleções, inteiramente dentro dos caches em um limite do GC, sem reque a sincronização explícita com processar fora do limite do GC. Uma disposição bifurcated do objeto permite o GC exato sem reque estruturas traçando adicionais. Enviesar resulta nos objetos bifurcated que residem (geralmente) no número mínimo de linhas do cache. A arquitetura permite o relocação simultâneo dos objetos e daqui a compactação simultâneo do heap. Nossos resultados indicam que o desempenho da coleção do lixo do cache e do em-cache do objeto compara favoràvel com um sistema classical, no entanto o cache do objeto permite que nós executem o compaction e o relocation incrementais. O GC do cache e do em-cache do objeto reduz a falta de cache consideravelmente, no custo de operações extra para controlar o cache. Nós conclímos que caching do objeto é uma técnica prometedora para escalar sistemas aos heaps muito grandes. Os dados para o GC do incache são mais menos conclusive: se uma vantagem do desempenho estaria vista depende dos custos e das latências em uma execução particular, e nossas simulações não são pretendidas modelar uma execução nesse nível da exatidão. O coletor convencional do scavenging do semi-espaço tem duas vantagens: o alocamento ponteiro-colidindo é mais barato do que a gerência de uma lista livre de OID, e a eficiência do tempo do GC pode ser melhorada usando semi-espaços maiores porque o GC do scavenging não toca nos objetos inoperantes. As ofertas do GC do em-cache ferragem-suportaram a simultaneidade e a recuperação sem falta de cache L2, mas se há uma vantagem no throughput depende “dos fatores constantes”. Nossas simulações mostram uma paridade áspera no desempenho se o custo de uma falta de cache L2 for igualado a aproximadamente 10 batidas de cachê
8. Trabalho futuro • Muitos detalhes remanescem ser terminados, e há muito espaço para uma investigação mais adicional. Nossos resultados mostram que o cache do objeto não penalize adversamente aplicações small-scale em seu comportamento do GC do cache e do newspace. Nós temos para demonstrar ainda as vantagens do desempenho e do scaling que o cache do objeto deve facilitar para aplicações grandes; isto requererá modelar de aplicações long-running com heaps grandes. Nossos resultados mostram que um componente grande da atividade do GC no cache do objeto é devido à gerência de OID. Este código não optimized pesadamente e deve ser possível reduzir estes overheads. Nós estamos investigando o GC além dos caches (do “GC velho-espaço”), e a contribuição o warden e o tradutor pode fazer a este. Ao contrário de outros esquemas generational, a iniciação da coleção do em-cache afeta somente o desempenho e não a exatidão, assim que nós planeamos investigar o heuristics para que quando inicíe o GC do em-cache. Uma avaliação mais completa para obter estimativas do desempenho requer a execução de um modelo realístico do processador e de mover e a modificação de um JVM avançado a este modelo. Além, nós planeamos explorar as aplicações novas que estas adições podem permitir ou simplificar na máquina virtual. Algumas das aplicações que nós temos considerado são sustentação para lojas persistentes transparentes do objeto e objetos reservar para relocated dentro de um conjunto dos usuários. Ambas estas técnicas podem ser permitidas em umas despesas gerais muito mais baixas através da ferragem do tradutor.