| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 05:21:57
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
Hola pessoal,
Tenho uma duvida, sempre ouvi dizer que o modificador static compartilha o codigo com todas as instancia na memoria.
A duvida é: Quando seto um static num metodo, o fato dele dizer que aquele metodo sera unico em todas as instancias daquela classe, farao que este metodo consuma menos memoria por ser unico e tenha uma execuçao mais rapida por ja estar carregado na memoria?
O que vcs acham desse static em metodos? Será bom mesmo sempre usar ele?
abraços
This message was edited 2 times. Last update was at 12/01/2009 05:26:43
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 05:37:43
|
thingol
Moderador
Membro desde: 29/07/2004 16:10:13
Mensagens: 17373
Localização: SP
Offline
|
Quando seto um static num metodo, o fato dele dizer que aquele metodo sera unico em todas as instancias daquela classe, farao que este metodo consuma menos memoria por ser unico e tenha uma execuçao mais rapida por ja estar carregado na memoria?
Não: o consumo de memória independe se o método é static ou não. O carregamento de um método é feito quando do carregamento de sua classe; a compilação desse método depende da quantidade de vezes que ele tiver sido executado.
Não é bom usar static em métodos à toa.
This message was edited 1 time. Last update was at 12/01/2009 08:20:47
|
Du mußt dein Leben ändern. - R. M. Rilke
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 06:25:58
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
Hola,
Quando seto uma variavel membro como static, ela fica na memoria ate que a VM seja descarregada. Nao é?
Acredito que este mesmo comportamento se aplique igual a um metodo static, com isto nao teria um ganho na execuçao do metodo?
Pois todas as novas instancias aproveitariam o metodo ja carregado na memoria, de uma outra instancia utilizada.
Sempre soube que quando instanciava varias classes, aquele metodo static da classe era unico e se utilizava o mesmo espaço de memoria para todos.
Nao sei como a VM faria isso, tipo teria varias classes numa area da memoria que apontariam para outro trecho de memoria com aquele metodo compartilhado...
Se estou enganado, vc poderia me explicar melhor como seria este comportamento na memoria?
abrs
This message was edited 6 times. Last update was at 12/01/2009 06:31:47
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 07:11:48
|
dionat4n
JavaEvangelist
![[Avatar]](/images/avatar/513d6bdbaed51319e9aa9f84a7f7518e.jpg)
Membro desde: 04/06/2008 21:08:05
Mensagens: 309
Localização: Porto Alegre (RS)
Offline
|
Se não é aconselhável usar static em métodos, porque é utilizado na API do Java para diversos métodos?
|
http://dionatanweblog.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 07:39:42
|
davidtiagoconceicao
Virtual Machine Man
![[Avatar]](/images/avatar/32fb0afb79c483a66f39391a80354f8c.jpg)
Membro desde: 17/10/2008 07:28:29
Mensagens: 504
Localização: Blumenau - SC
Offline
|
Alguém me corrija se eu estiver errado, mas pelo que eu sei, o que estará ou não na memória depende da máquina virtual. O funcionamento mais comum é criar, para cada objeto, uma área para os atributos e outra área para os métodos. Ao instanciar um novo objeto, caso já exista um objeto daquele tipo na memória, será criada uma referência interna para o conjunto de métodos já existente. Ao ser invocada a execução de determinado método, é criado um frame (estrutura interna da JVM para controle da pilha) e este frame irá conter os dados (incluindo atributos) a serem utilizados pelo método. Caso o mesmo método seja invocado diversas vezes, vários frames serão empilhados, como se o método estivesse na pilha diversas vezes.
Assim, quanto a estar na memória ou não, acredito que não existam grandes diferenças de performance/ consumo de recursos entre os métodos de classe e de instância. O que pode aumentar o consumo de recursos seria a operação de criação de novos objetos (new), considerada uma operação "lenta".
Se não é aconselhável usar static em métodos, porque é utilizado na API do Java para diversos métodos?
Os métodos static são utilizados quando necessário. Quando existe a intenção de executar algum código sem a necessidade de gerar uma instância, que possivelmente será utilizada apenas para a execução de um método, ou em outros casos mais específicos.
This message was edited 1 time. Last update was at 12/01/2009 07:51:06
|
8º semestre Bacharelado em Ciências da Computação/FURB
SCJP 6
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 07:56:26
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
davidtiagoconceicao wrote:Alguém me corrija se eu estiver errado, mas pelo que eu sei, o que estará ou não na memória depende da máquina virtual. O funcionamento mais comum é criar, para cada objeto, uma área para os atributos e outra área para os métodos. Ao instanciar um novo objeto, caso já exista um objeto daquele tipo na memória, será criada uma referência interna para o conjunto de métodos já existente. Ao ser invocada a execução de determinado método, é criado um frame (estrutura interna da JVM para controle da pilha) e este frame irá conter os dados (incluindo atributos) a serem utilizados pelo método. Caso o mesmo método seja invocado diversas vezes, vários frames serão empilhados, como se o método estivesse na pilha diversas vezes.
.
davidtiagoconceicao, gostei da sua explicaçao...
Porém neste modelo da VM nao vejo diferença entre um metodo static e nao static na area de memoria. ¿Como uma VM sabe que aquele metodo é static?
¿O que diferencia internamente numa VM algo ser static?
abraços
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 07:56:26
|
dionat4n
JavaEvangelist
![[Avatar]](/images/avatar/513d6bdbaed51319e9aa9f84a7f7518e.jpg)
Membro desde: 04/06/2008 21:08:05
Mensagens: 309
Localização: Porto Alegre (RS)
Offline
|
davidtiagoconceicao wrote:
Se não é aconselhável usar static em métodos, porque é utilizado na API do Java para diversos métodos?
Os métodos static são utilizados quando necessário. Quando existe a intenção de executar algum código sem a necessidade de gerar uma instância, que possivelmente será utilizada apenas para a execução de um método, ou em outros casos mais específicos.
Com certeza são utilizados quando necessário.
Que casos específicos? Não consegui pensar em nenhum a não ser sem a necessidade de instância.
A minha pergunta é por que razão disseram que "não é aconselhável utilizar métodos static à toa"?
Deve estar no sentido de não programar corretamente, isso é óbvio.
No livro do Deitel tem uma dica de desempenho para usar métodos static sempre que a execução do método não precisar depender de um objeto.
|
http://dionatanweblog.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 07:59:17
|
dionat4n
JavaEvangelist
![[Avatar]](/images/avatar/513d6bdbaed51319e9aa9f84a7f7518e.jpg)
Membro desde: 04/06/2008 21:08:05
Mensagens: 309
Localização: Porto Alegre (RS)
Offline
|
Por favor, falem o que tiver certeza, de preferência com referência bibliográfica de algum livro ou link, e não o que ouviu falar, porque eu já ouvi falar coisas diferentes sobre desempenho em Java. Só com uma referência confiável se pode tirar conclusões.
|
http://dionatanweblog.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 08:12:07
|
davidtiagoconceicao
Virtual Machine Man
![[Avatar]](/images/avatar/32fb0afb79c483a66f39391a80354f8c.jpg)
Membro desde: 17/10/2008 07:28:29
Mensagens: 504
Localização: Blumenau - SC
Offline
|
Com certeza são utilizados quando necessário.
Que casos específicos? Não consegui pensar em nenhum a não ser sem a necessidade de instância.
A minha pergunta é por que razão disseram que "não é aconselhável utilizar métodos static à toa"?
Deve estar no sentido de não programar corretamente, isso é óbvio.
No livro do Deitel tem uma dica de desempenho para usar métodos static sempre que a execução do método não precisar depender de um objeto.
Conforme nosso amigo disse, não é aconselhável sair criando métodos como static à toa. Conforme havia dito, os métodos static podem ser utilizados quando não se quer forçar a criação de uma instância ou quando o programador não quer que exista instância (implementação do padrão singleton, por exemplo), pode ser utilizado para métodos que configuram atributos antes da instanciação da classe, ou para configurar atributos que serão utilizados por todas as instâncias da classe. Estes são alguns usos que já fiz do modificador static, mas os usos dele vão até o limite da sua imaginação
davidtiagoconceicao, gostei da sua explicaçao...
Porém neste modelo da VM nao vejo diferença entre um metodo static e nao static na area de memoria. ¿Como uma VM sabe que aquele metodo é static?
¿O que diferencia internamente numa VM algo ser static?
Acredito que ela obtém esta informação do bytecode e à partir daí efetua o controle necessário.
Por favor, falem o que tiver certeza, de preferência com referência bibliográfica de algum livro ou link, e não o que ouviu falar, porque eu já ouvi falar coisas diferentes sobre desempenho em Java. Só com uma referência confiável se pode tirar conclusões.
Infelizmente não posso pesquisar agora (mal estou tendo tempo para postar estas respostas ). Posso pesquisar mais tarde e postar os links. Em todos os casos, se você quizer realmente saber sobre performance e afins, sugiro que pesquise nas documentações da Sun sobre a linguagem e sobre a implementação da JVM.
|
8º semestre Bacharelado em Ciências da Computação/FURB
SCJP 6
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 08:21:55
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
Conforme havia dito, os métodos static podem ser utilizados quando não se quer forçar a criação de uma instância ou quando o programador não quer que exista instância (implementação do padrão singleton, por exemplo), pode ser utilizado para métodos que configuram atributos antes da instanciação da classe, ou para configurar atributos que serão utilizados por todas as instâncias da classe. Estes são alguns usos que já fiz do modificador static, mas os usos dele vão até o limite da sua imaginação
Hola davidtiagoconceicao,
Quando vc diz "forçar a criação de uma instância ou quando o programador não quer que exista instância", mesmo sendo static se cria uma instancia na memoria de uma classe, se esta nao for um Singleton.
O ponto que eu me cituo e porque dizem que um metodo static e mais rapido que um metodo normal.
abraços
This message was edited 1 time. Last update was at 12/01/2009 08:23:26
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 08:23:43
|
Mauricio Linhares
Moderador
![[Avatar]](/images/avatar/97af07a14cacba681feacf3012730892.jpg)
Membro desde: 09/01/2005 23:28:22
Mensagens: 3654
Localização: João Pessoa, Paraíba - Brasil
Offline
|
joaosiqueira wrote:Quando vc diz "forçar a criação de uma instância ou quando o programador não quer que exista instância", mesmo sendo static se cria uma instancia na memoria de uma classe, se esta nao for um Singleton.
Quando você chama um método estático nenhuma instância é criada em lugar nenhum. É exatamente por não existir uma instância que o método é chamado de estático.
|
Blog pt-br | Blog en | My Last.fm | Blog de RPG
----------------------------------------
PBJUG - Grupo de Usuários Java da Paraíba | Paraíba.rb - Paraíba Ruby Brigade
How do we tell truths that might hurt? |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 08:30:50
|
Leonardo3001
Virtual Machine Man
Membro desde: 04/07/2007 18:28:58
Mensagens: 806
Offline
|
Vou me limitar ao ambiente Java EE, que é o que eu mais conheço.
Em Java EE, não use variáveis static. A variável static é iniciada quando é feita a primeira chamada à classe e todas as classes são criadas pelo classloader. Problema: os containeres de hoje em dia possuem váááários classloaders. Fatalmente, acabará criando algumas "instâncias" da variável static sem perceber.
Existem jeitos mais elegantes para o uso de static. Exemplo: se você precisa de um objeto único por toda a aplicação, crie um listener (registre-o no web.xml) onde, dentro dele, é criado um objeto que é guardado em escopo de aplicação.
Alguns casos de "singleton" são os façades, mas soluções como EJB3 e Spring estão aí para gerenciar esses tipos de objetos pra você.
|
Leonardo Veríssimo
-------------------------------------------------
Objectzilla |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 08:38:15
|
joaosiqueira
Thread.start()
Membro desde: 08/01/2009 08:23:56
Mensagens: 40
Offline
|
Mauricio Linhares wrote:
Quando você chama um método estático nenhuma instância é criada em lugar nenhum. É exatamente por não existir uma instância que o método é chamado de estático.
Mas indiretamente a VM cria uma instancia da classe, pois imagina se vc tem uma variavel membro static... esta fica retida na memoria ate a VM ser derrubada... nao importando se vc cria o objeto via new ou chame via Classe.variavel
Creio que a VM diferencia de alguma forma o static nos metodos e variaveis dos sem.
Se pensarmos no fato de um valor compartilhado permancer na memoria para todas as instancias, podemos imaginar em alguma acelaraçao no codigo por ja estar carregado...
abrs
This message was edited 1 time. Last update was at 12/01/2009 08:40:07
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 08:56:51
|
dionat4n
JavaEvangelist
![[Avatar]](/images/avatar/513d6bdbaed51319e9aa9f84a7f7518e.jpg)
Membro desde: 04/06/2008 21:08:05
Mensagens: 309
Localização: Porto Alegre (RS)
Offline
|
What code shapes does the JVM optimize best? Here is a list.
[...]
Methods
* Methods are often inlined. This increases the compiler's "horizon" of optimization.
* Static, private, final, and/or "special" invocations are easy to inline.
http://wikis.sun.com/display/HotSpotInternals/PerformanceTechniques
|
http://dionatanweblog.blogspot.com |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 12/01/2009 09:24:23
|
davidtiagoconceicao
Virtual Machine Man
![[Avatar]](/images/avatar/32fb0afb79c483a66f39391a80354f8c.jpg)
Membro desde: 17/10/2008 07:28:29
Mensagens: 504
Localização: Blumenau - SC
Offline
|
Muito bom dionat4n, obrigado pelas informações.
Também vou ler mais sobre o assunto.
|
8º semestre Bacharelado em Ciências da Computação/FURB
SCJP 6
 |
|
|
 |
|
|