joaosiqueira:
Mas nesse momento nao teriamos que concordar com o ccaneta?
ccaneta:
Acho que uma instancia "new" pode gastar mais memoria do que fazer uma chamada static direto.
Mas nao tenho certeza disso, vcs que me corrijam se estiver enganado.
Aqui são dois problemas diferentes. Instanciar vários objetos na memória a toa, com certeza é ruim. Mas isso não significa que todas as chamadas devem ser estáticas. Afinal, não há desperdício de memória em criar objetos apenas quando é necessário e invocar os métodos não-estáticos deles.
Quando diz que o fato de usar uma classe carregada usaria menos memoria e evitaria o tempo de instanciar uma classe, ao contrario do new em que temos que carregar e depois instanciar?
Ou você não entendeu a minha resposta ou eu não entendi a sua dúvida.
Cada classe é carregada uma única vez na memória durante a execução. A JVM não carrega nunca a mesma classe duas vezes. A classe é carregada porque acontece mais ou menos isso:
Programa: Ei JVM, quero chamar o método Foo da classe Bar.
JVM: Bem, ainda não carreguei a classe Bar. Espera um pouquinho que eu vou montá-la aqui.
[JVM carrega a classe Bar]
JVM: Ok, terminei de carregar a classe, agora vou chamar o Foo.
[JVM chama o método Foo]
Programa: Legal. Agora chame o método Abc da classe Bar.
JVM: Ok, como eu já carreguei a classe antes, é só chamar o método.
[JVM chama o método Abc]
Um exemplo:
class A {
public static final int X;
static {
System.out.println("Carregando A");
X = 7;
}
}
public class B {
static {
System.out.println("Carregando B");
}
public static void main(String[] args) {
System.out.println("Executando o main");
System.out.println("A.X = " + A.X);
System.out.println("A.X = " + A.X);
System.out.println("A.X = " + A.X);
}
}
joaosiqueia:
1 processo e mais rapido que 2....
Não é bem assim. Aquilo que escrevi foi de um modo simples. A JVM tem alguns truques em baixo da manga para acelerar as coisas, de forma que ela possa eliminar a verificação de instância = null se ela perceber que não existe forma daquilo ser null. Além disso, em muitos casos o uso de static
pode também deixar o código mais lento, porque objetos alcançáveis por meio de atributos estáticos não podem ser recolhidos pelo coletor de lixo e podem causar desperdício de memória e em casos extremos lentidão devido ao swap. Como atributos de instância não são acessíveis em métodos estáticos, você acabaria preso aos métodos estáticos.
Além disso, atributos estáticos são uma grande dor de cabeça em programas com mais de uma Thread (e se você precisa muito de desempenho, provavelmente terá mais de uma Thread rodando). Várias Threads acessando atributos estáticos concorrentemente sem a devida sincronização cria toda a (má) sorte de condições de corridas que resultam em erros obscuros, difíceis de reproduzir e de ocorrência aleatória e misteriosa, justamente aqueles que são os maiores pesadelos na hora do debug. Para que várias Threads possam acessar atributos estáticos concorrentemente sem estes problemas, você vai precisar de sincronização ou na melhor das hipóteses colocar os atributos como volatile, mas qualquer uma destas abordagens é mais custosa do que transformar o atributo em atributo de instância.
Mais além, a JVM é capaz de fazer otimizações melhores quando ela sabe que o objeto vai ficar restrito a um único local, coisa que não é a cara de atributos estáticos.
E repetindo, eu falei tudo isso sobre atributos estáticos porque há pouco sentido em se ter atributos de instância sem ter métodos de instância. Além disso, o acesso aos atributos de uma instância A de dentro de um método de instância de A tende a ser melhor otimizado do que o acesso a um atributo (de instância) de A dentro de um método estático ou de um método da instância B. Isso ocorre porque a JVM pode otimizar o acesso ao ponteiro this.
Ok, ela também pode otimizar o acesso aos atributos estáticos da mesma classe, mas isso ainda não resolve o problema.
eu mesmo:
Mas seja lá qual for este tempo, ele deve ser ínfimo e desprezível. Se você está tão desesperado por desempenho que isto pode lhe fazer diferença, então você nem devia estar programando em java, e sim em assembler (ou até no hardware).