Carregar apresentação
A apresentação está carregando. Por favor, espere
PublicouTéo Teves Alterado mais de 9 anos atrás
1
Removing Unnecessary Synchronization in Java Sérgio Soares Gente
2
Sincronização zMétodos/blocos onde apenas um thread executa por vez ybaseado em monitores zGarantir execuções seguras
3
Motivação zSincronizações desnecessárias yobjetos acessíveis apenas por um thread yoverhead 26-60% do tempo de execução y“remover” sincronização
4
Possíveis soluções zIdentificar objetos acessíveis apenas por um thread yverificação manual tediosa e erro-prone ymudanças futuras do programa forçam uma nova análise zDefinir versões não sincronizadas do referido objeto yduplicação de código
5
zRemover em tempo de compilação a sincronização quando a otimização for possível zPrograma de otimização (compilador) yidentifica situações passíveis da remoção de sincronização yrescreve parte do programa removendo as sincronizações desnecessárias A solução proposta
6
Identificando situações de otimização zExcluir os objetos que não podem ser thread-local yobjetos armazenados na heap xs-escaping (stack-escaping) yobjetos acessíveis apenas por variáveis locais na pilha de apenas um thread xs-local
7
s-escaping e s-local algoritmo 1 A CB Pilha do Thread 1 Pilha do Thread 2 A é s-local B é s-escape C é s-escape Heap
8
A CB Pilha do Thread 1 Pilha do Thread 2 A é s-local B é s-local C é s-escape Heap s-escaping e s-local algoritmo 2
9
Algoritmo 2 zs-escaping yobjetos armazenados na heap ou acessíveis por mais de uma pilha (thread) zs-local yobjetos acessíveis apenas por uma única pilha (thread) yobjetos acessíveis apenas por objetos s- local do heap
10
Problema zIdentificar objetos acessíveis apenas por objetos s-local do heap pode levar a algoritmos complexos ytransitividade de acessibilidade ytipos de dados recursivos zSimplificação: objetos acessíveis por mais de um nível de referência de um objeto s- local são s-escaping
11
f-escaping zObjetos referenciados por atributos de objetos s-escaping
12
A análise zEstágio 1 ydetectar objetos s-escaping zEstágio 2 ydetectar objetos f-escaping
13
Restrições da linguagem Um subconjunto de comandos/expressões x = y atribuição a variável x.f = y atribuição a atributo de objeto y = x.f acesso a atributo C.f = y atribuição a atributo de classe y = C.f acesso a atributo de classe x = new T criação de objeto foo(a 1,..., a n ) chamada de método usados para implementar construções de Java como exceções, arrays, retorno de métodos
14
Retorno de métodos o = hashtable.put(x, y) put(hashtable, x, y, o)
15
Detectando objetos s-escaping zDefine conjuntos s-escape( x ) é vazio inicialmente (representa falso) e durante a análise pode conter o booleano true {T}, indicando que a variável é s-escaping AS( x ) conjunto das variáveis de um métodos que referenciam o objeto referenciado por x
16
Inicia a análise pelo método main e vai analisando os métodos conforme aparecem as chamadas aos mesmos zAplicar as regras para cada tipo de comando yatribuição yacesso a atributos ychamada de métodos Detectando objetos s-escaping
17
zAtribuição yunir (merge) os Alias Set e a propriedade s- escape das variáveis x = y AS( x ) AS( y ) s-escape( x ) s-escape( y ) Detectando objetos s-escaping Análise flow-insensitive AS( x ) 1 AS( y )
18
zAcesso a atributos (incluindo estáticos) ya variável passa a ser s-escaping pois indica que o heap tem uma referência para a mesma ou que a mesma tem uma referência para o heap y = x.f ou x.f = y s-escape( y ) {T} Detectando objetos s-escaping
19
zChamada de métodos ypropaga as restrições impostas aos parâmetros formais dentro do método para os parâmetros reais (depois de analisar o método) foo(a 0,..., a n ) i [0...n] s-escape( a i ) s-escape( p i ) i tal que connected( p i, return foo ) AS( a i ) 1 AS( a n ) Detectando objetos s-escaping a n é o parâmetro real que recebe o retorno do método se houver retorno
20
AS( x.f ) conjunto de variáveis que referenciam o objeto em x.f f-escape( x ) conjunto vazio ou {T} indicando, quando true, que o objeto referenciado por x também é referenciado pelo atributo de um objeto s-escaping Detectando objetos f-escaping
21
zAtribuição yunir (merge) os Alias Set e a propriedade f- escape das variáveis e dos seus atributos x = y AS( x ) AS( y ) f-escape( x ) f-escape( y ) se s-escape( x ) s-escape( y ) = f fields(x, y) AS( x.f ) 2 AS( y.f ) Detectando objetos f-escaping AS( x ) 2 AS( y ) *
22
zAcesso a atributos x.f = y ou y = x.f se s-escape( x ) = AS( x.f ) 2 AS( y ) se não f-escape( y ) {T} Detectando objetos f-escaping FieldAccess( x.f, y ) O que acontecerá com os Alias Set dos atributos de x.f e de y quando aplicar 2 na recursão? O mesmo código já passou pela fase 1
23
zAcesso a atributos estáticos C.f = y ou y = C.f f-escape( y ) {T} Detectando objetos f-escaping
24
zChamada de métodos Regra 1 - propagar a propriedade f-escape dos parâmetros formais e seus atributos para os parâmetros reais e seus atributos foo(a 0,..., a n ) i [0...n] f-escape( a i ) f-escape( p i ) se s-escape( a i ) = i fields( p i ) f-escape( a i.f ) f-escape( p i.f ) Detectando objetos f-escaping
25
zChamada de métodos Regra 2 - propagar as restrições entre parâmetros retornados e variáveis que recebem o retorno foo(a 0,..., a n ) i tal que connected( p i, return foo ) AS( a i ) 2 AS( a n ) Detectando objetos f-escaping
26
zChamada de métodos Regra 3 - propagar as restrições entre parâmetros e atributos de outros parâmetros onde haja atribuição entre eles (trata-se como acesso a atributo) foo(a 0,..., a n ) f,p i,p j tal que connected( p i.f, p j ) FieldAccess ( a i.f, a j ) Detectando objetos f-escaping
27
zChamada de métodos Regra 4 - propagar propriedades entre atributos de parâmetros que referenciam um mesmo objeto foo(a 0,..., a n ) f,h,p i,p j tal que connected( p i.f, p j.h ) se s-escape( a i ) s-escape( a j ) = AS( a i.f ) 2 AS( a n.h ) se não se s-escape( a i ) = f-escape( a i.f ) {T}
28
class Handle { private Object ref = null; synchronized void attach(Object o) { this.ref = o; } Exemplo
29
class Sample { static Handle globalHandle = null; static m() { Handle h1 = createHandle(); Handle h2 = createHandle(); Object o1 = new Object(); Object o2 = new Object(); h1.attach(o1); h2.attach(o2); globalHandle = h2; } static Handle createHandle() { return new Handle(); }
30
Exemplo Vamos analisar o método m da classe Sample
31
h1 h2 o1 o2 Fase 1 - identificando s-escaping return this o s s s s Alias Sets do método m Alias Set do método createHandle Alias Sets do método attach
32
Fase 2 - identificando f-escaping h1 h2 o1 o2 return this o s,f s s ref Alias Sets do método m Alias Set do método createHandle Alias Sets do método attach
33
Conclusão zOtimizar o uso dos objetos que não são f- escape e que possuem métodos sincronizados yotimizar h1
34
Otimização Definir uma nova subclasse (clone) da classe do objeto a ser otimizado sem sincronizar os métodos como na classe original ( Handle ) zSubstituir no método analisado a instanciação do objeto referenciado por h1 pela nova classe (clone) ypode ser necessário duplicar factory methods
35
Na classe clone zDefinir um construtor que invoca o construtor da superclasse (classe a ser otimizada) Copiar os métodos da superclasse removendo o qualificador synchronized Remover qualificadores final Alterar os qualificadores private para protected
36
A classe clone class Handle$Unsync extends Handle{ public Handle$Unsync() { super(); } public void attach(Object o) { this.ref = o; }
37
A classe e o método otimizados class Sample { //... static m() { Handle h1 = createHandle$Clone1(); Handle h2 = createHandle(); //... } static Handle createHandle$Clone1() { return new Handle$Unsync(); } //... }
38
Bibliografia zRemoving Unnecessary Synchronization in Java. Jeff Bogda and Urs Holzle. Departament of Computer Science. University of California
Apresentações semelhantes
© 2024 SlidePlayer.com.br Inc.
All rights reserved.