Mostrando postagens com marcador openjdk. Mostrar todas as postagens
Mostrando postagens com marcador openjdk. Mostrar todas as postagens

quarta-feira, 29 de janeiro de 2014

Como compilar código Java dinâmicamente

O Java é uma plataforma que se multiplicou exponencialmente, uma de sua grande vantagem é o fato de que você consegue com o mesmo código executar em diferentes plataformas, com isso se pode programar para servidor, dispositivos embarcados, desktop, etc. com a mesma linguagem. Além disso a JVM possui suporte para diversas linguagens, das quais possuem, diversas características e recursos interessantes. Um mito que existe é que o Java não compila em tempo de execução, o que faz muitas pessoas utilizem uma linguagem dinâmica, apenas por esse objetivo, mas será que isso é verdade?

Possuir uma linguagem dinâmica é muito interessante para alguns projetos específicos, por exemplo, quando se faz um projeto que realiza calculo tributário, como essa fórmula mudam muito ao ano e variam de município para município, nesse caso é melhor que o código fonte esteja em um banco de dados, por exemplo, para quando for necessário modificar o calculo não seja necessário compilar todo o código fonte e fazer o deploy, correndo o risco do sistema ficar fora do ar mesmo que por alguns instantes.

Sim é possível em Java compilar códigos dinamicamente. Na verdade isso é muito comum do que imaginamos! Por exemplo, o Hibernate para gerenciar das entidades, para facilitar ainda o seu uso a partir da versão 1.6 com a JSR 199 foi criada um API com essa finalidade.

Para demonstrar essa funcionalidade será usado a solução para o problema acima, fazer com que haja troca de fórmula, para facilitar a demonstração e focar na solução serão as 4 operações básicas, sendo que esse código fonte estará no banco de dados, no caso será simulado com arquivos dentro de um txt. Como não podemos referenciar uma classe não compilada, criaremos uma interface Operação, ela será implementada por nossas classes que estarão em nosso “banco de dados”.

public interface Calculo { 

 Double calcular(Number valorA, Number valorB);  
  
} 

Interface na qual será utilizada como referencias as classes compiladas dinamicamente.

Explicando o processo de compilação passo a passo: A classe JavaCompiler, que tem a responsabilidade de fazer a compilação do código-fonte. A chamada ToolProvider.getSystemJavaCompiler() retorna este objeto. Se um compilador Java não estiver disponível, o retorno será null. Ele conta com o método getTask(), que retorna um objeto CompilationTask. De posse desse objeto, a chamada call() efetua a compilação do código e retorna um booleano indicando se ela foi feita com sucesso (true) ou se houve falha (false).

public class JavaDinamicoCompilador { 
 
  private JavaCompiler compiler; 

  private JavaDinamicoManager javaDinamicoManager; 

  private JavaDinamicoClassLoader classLoader; 

  private DiagnosticCollector diagnostics; 

  public JavaDinamicoCompilador() throws JavaDinamicoException { 
    compiler = ToolProvider.getSystemJavaCompiler(); 
    if (compiler == null) { 
     throw new JavaDinamicoException("Compilador não encontrado"); 
    } 

    classLoader = new JavaDinamicoClassLoader(getClass().getClassLoader()); 
    diagnostics = new DiagnosticCollector(); 

    StandardJavaFileManager standardFileManager = compiler 
        .getStandardFileManager(diagnostics, null, null); 
    javaDinamicoManager = new JavaDinamicoManager(standardFileManager, classLoader); 
  } 

  @SuppressWarnings("unchecked") 
  public synchronized Class compile(String packageName, String className, 
      String javaSource) throws JavaDinamicoException 
  { 
    try { 
      String qualifiedClassName = JavaDinamicoUtils.INSTANCE.getQualifiedClassName( 
          packageName, className); 
      JavaDinamicoBean sourceObj = new JavaDinamicoBean(className, javaSource); 
      JavaDinamicoBean compiledObj = new JavaDinamicoBean(qualifiedClassName); 
      javaDinamicoManager.setSources(sourceObj, compiledObj); 

      CompilationTask task = compiler.getTask(null, javaDinamicoManager, diagnostics, 
          null, null, Arrays.asList(sourceObj)); 
      boolean result = task.call(); 

      if (!result) { 
       throw new JavaDinamicoException("A compilação falhou", diagnostics); 
    } 

      Class newClass = (Class) classLoader.loadClass(qualifiedClassName); 
      return newClass; 

    } 
    catch (Exception exception) { 
      throw new JavaDinamicoException(exception, diagnostics); 
    } 
  } 
}
Classe responsável pela compilação

O processo de compilação envolve dois tipos de arquivos: os códigos-fonte escritos em Java e os arquivos compilados (bytecodes). Na Compiler API estes arquivos são representados por objetos de uma única interface, chamada JavaFileObject. Felizmente a API disponibiliza uma classe que implementa esta interface, chamada SimpleJavaFileObject e, na escrita de código de compilação dinâmica, deve-se criar uma subclasse de SimpleJavaFileObject e sobrescrever os métodos necessários.
public class JavaDinamicoBean extends SimpleJavaFileObject { 

  private String source; 

  private ByteArrayOutputStream byteCode = new ByteArrayOutputStream(); 

 
  public JavaDinamicoBean(String baseName, String source) { 
    super(JavaDinamicoUtils.INSTANCE.createURI(JavaDinamicoUtils.INSTANCE.getClassNameWithExt(baseName)), 
        Kind.SOURCE); 
    this.source = source; 
  } 
  
  public JavaDinamicoBean(String name) { 
    super(JavaDinamicoUtils.INSTANCE.createURI(name), Kind.CLASS); 
  } 

  @Override 
  public String getCharContent(boolean ignoreEncodingErrors) { 
    return source; 
  } 

  @Override 
  public OutputStream openOutputStream() { 
    return byteCode; 
  } 

  public byte[] getBytes() { 
    return byteCode.toByteArray(); 
  } 
}
Estrutura de dados que contem o codigo fonte e a classe compilada

Para representar os arquivos envolvidos será utilizado o ForwardingJavaFileManager que implementa a interface JavaFileManager.

public class JavaDinamicoManager extends ForwardingJavaFileManager { 
  private JavaDinamicoClassLoader classLoader; 
  
 
  private JavaDinamicoBean codigoFonte; 
 
  private JavaDinamicoBean arquivoCompilado; 
  
  public JavaDinamicoManager(JavaFileManager fileManager, JavaDinamicoClassLoader classLoader) 
  { 
    super(fileManager); 
    this.classLoader = classLoader; 
  } 

  public void setSources(JavaDinamicoBean sourceObject, JavaDinamicoBean compiledObject) { 
    this.codigoFonte = sourceObject; 
    this.arquivoCompilado = compiledObject; 
    this.classLoader.addClass(compiledObject); 
  } 

  @Override 
  public FileObject getFileForInput(Location location, String packageName, 
      String relativeName) throws IOException 
  { 
    return codigoFonte; 
  } 

  @Override 
  public JavaFileObject getJavaFileForOutput(Location location, 
      String qualifiedName, Kind kind, FileObject outputFile) 
      throws IOException 
  { 
    return arquivoCompilado; 
  } 

  @Override 
  public ClassLoader getClassLoader(Location location) { 
    return classLoader; 
  } 
}
Classe responsável por gerenciar as classes compiladas e não compiladas

Para que ela possa ser utilizada, a JVM deve ser capaz de reconhecê-la como uma classe da aplicação, a fim de que possa carregá-la quando chegar o momento. O componente responsável pelo carregamento das classes das aplicações Java durante a execução é o Class Loader.
Portanto, para que a JVM saiba da existência das novas classes compiladas, é necessário implementar um class loader customizado, que fica atrelado ao gerenciador de arquivos.
Ele deve estender a classe ClassLoader (do pacote java.lang) e tem a responsabilidade de carregar as classes recém-criadas.
Com isso foi discutido um pouco sobre a compilação dinâmica do Java no Java, objetivo aqui foi apenas de demonstrar o seu funcionamento básico além de uma pequena explicação do uso da API. Pela sua complexidade o ideal é que ela esteja encapsulado a ponto de ser utilizadas várias vezes em diversos projetos. O objetivo aqui não foi desmerecer em nenhum momento as outras linguagens de programação rodando ou não em cima da JVM, afinal todas elas têm sua importância. O objetivo foi demonstrar que não existe a necessidade de mudar de linguagem caso seu problema seja ter um código que seja compilado dinamicamente.


Referências:

sexta-feira, 18 de janeiro de 2013

Introdução ao BigData





    Demorou, mas finalmente conseguir um tempo para falar um pouco da minha apresentação no JavaOne 2012 que foi BigData. Com a evolução das aplicações e a necessidade do ser humano pela informações, mais e mais aplicações vem surgindo, deixando o homem cada vez mais refém da informação. Para isso basta lembra-nos da evolução do homem em que num passado existia muitas pessoas para uma máquina ( como o mainframe), em seguida uma pessoa por máquina ( o caso do computador pessoal) e nos tempos atuais em que para cada pessoa possue várias máquinas ( notebook, ultrabook, PC, tablet, smartphone, no futuro óculos, geladores, etc.). Com tantos aplicativos surgindo as informações são geradas exponencialmente, com isso a capacidade de gerenciar tantas informações se torna primordial para as aplicações atuais. Esse mesmo crescimento de dados acontece nos aplicativos empresariais com crescimento anual de 60%, se estima que uma empresa com mil funcionários gera anualmente 1000 terabytes sem falar que essa quantidade tende a aumentar cinquenta vezes até 2020.

    Com o recém surgimento do bigdata, a primeira dificuldade é encontrar o seu conceito, é possível vê-los de maneiras totalmente divergentes em cada blog que se lê, ou seja, se você ler 10 materiais sobre bigdata, provavelmente cada um trará conceitos diferentes. Dentre as matérias ao se tirar um mínimo comum se verá que o bigdata na sua raiz se fala em tratar um grande volume de dados com grande velocidade. No entanto se repara que essa definição é bastante abstrata pelo simples fato de que para uma pessoa A, por exemplo, um grande volume seja um gigabyte e para uma pessoa B um grande volume seja um terabyte e o mesmo pode acontecer ao se referenciar a velocidade e o tempo de resposta de uma requisição.
    Assim o grande desafio do bigData é estar administrando um grande volume de dados e minerando informações em um menor tempo de requisição. Com o grande volume de dados fazer com que a aplicação cresça a medida que é necessário é uma ótima estratégia assim uma escalabilidade vertical ( em que se aumenta o poder do hardware como aumento de memória e de processamento de uma única máquina) ou horizontal ( em que se aumenta a quantidade de máquina) deve ser analisada. Apesar de ser mais complexa a escalabilidade horizontal acaba sendo muito barata sem falar de ser mais fácil de crescer ou diminuir os recursos por demanda.
    Para armazenar as informações com a escalabilidade horizontal os bancos NOSQL são uma ótima estratégia, vale lembrar que o banco NOSQL significa não apenas, not only, e não sql, no sql. Uma diferença entre os bancos NOSQL e o SQL é que o primeiro possui uma grande variedade de bancos e cada um com características diferentes. Em termo de arquitetura os bancos NOSQL podem ser distribuídos ou não, embora sejam mais populares do tipo distribuído. Sua forma de armazenamento pode ser apenas memória ou apenas disco rígido ou configurável( vale apena lembrar que banco apenas na memória são muito rápidos, no entanto são volúveis, já os somente no HD tem informações permanentes, porém o I/O é muito alto). Outra características divergentes entre os bancos NOSQL está na forma do armazenamento que são: chave-valor, documento, família de coluna e grafos. Os bancos         NOSQL costumam ser muito rápido na leitura e na escrita, no entanto, possui uma grande deficiência por parte das buscas, normalmente são dadas apenas pela chave, para isso usar um serviço para terceirizar o serviço pode ser uma boa ideia, como o framework Lucene.
    Mesmo realizando estratégias de buscas terceirizadas ou buscando pelo id, se a informação não estiver na memória principal pode haver uma demora para recuperar essa informação, assim, ter um dispositivos de acesso rápido pode ser uma melhor opção, com isso o uso do cache. Ao se optar pelo cache deve-se levar em conta os dois maiores desafios:
  • Ter informação: O ato de esquentar a informação é extremamente importante para esse mecanismos, já que não adianta existir um cache se o mesmo não tenha nenhuma informação. Para isso ele pode ser esquentado de várias formas (ao iniciar uma aplicação, por demanda, por sessão do usuário) que desse ser definido com o aplicativo em questão não existindo uma bala de prata.
  • Matar o cache: Para o cache é necessário que exista apenas informações atuais, assim é importante que os dados atuais sejam mortos e trocado por informações mais atuais.


    Um outro aspecto no bigdata, que não é muito tratado, está relacionado na velocidade da modelagem além da velocidade no desenvolvimento de software. Um exemplo muito interessante é o twitter que viu muito usuários usando a hashtag ( o '#' adicionado com uma palavra) e em pouco tempo teve que realizar pesquisas através dos mesmos.
    Assim podemos verificar que o bigdata não apenas está relacionado apenas na velocidade de requisição, mas também em desenvolvimento, assim conhecer bem o negócio além de várias ferramentas poderá ser extremamente importante. Na linguagem Java conhecer o Java EE 6, muito em breve o java 7, além do JDK 7 trará velocidade de desenvolvimento, produtividade e um melhor gerenciamento de memória.
    Assim pode-se concluir que o conceito do BigData é relativamente muito fácil, mesmo sendo divergente em várias fontes, que é gerenciar um grande volume de memória em alta velocidade. O mais difícil certamente é chegar nesse objetivo já que para isso é necessário conhecer uma gama de ferramentas, frameworks, metologias, tipos de bancos como NOSQL, SQL e NewSQL, cache, serviço de indexação de buscas, tipos de escalabilidades, etc. Apesar de ainda ser muito discutida nas universidades a normalização foi desenvolvida em 1970 ( vale lembrar que os servidores da época possuíam 16kb de memória principal e 800kb de armazenamento e os celulares são muitas vezes mais rápido que estes servidores) ou seja não é certo afirmar que os aplicativos, os hardwares, as necessidades de hoje são os mesmos daquela época, assim é entender que esse padrão nem sempre é válido.


sexta-feira, 2 de março de 2012

Usando Easy-Cassandra 1.0.8 com maven



       Lançada a mais nova versão do framework Easy-Cassandra seu objetivo é estar facilitando a comunicação entre Apache Cassandra e sua aplicação em java. Com ele é possível esta criando, atualizando, recuperando ou deletando os seus objetos java de uma maneira bastante simples, para isso basta apenas realizar anotações na classe e nos campos.

CARACTERÍSTICAS



  • Uma espécie de ORM para o Cassandra
  • Precisa apenas de anotações na classe para persistir informações
  • Persiste muito objetos java de uma maneira bastante fácil
  • Escreve e ler no Cassandra com Level Consistency.
  • O primeiro compatível com versões acima do Cassandra 0.8
  • Compatível com CQL 2.0
  • O primeiro a usar invokedynamic ao invés de Reflection
  • Sob a licença Apache versão 2.0
  • Suporte aos seguintes objetos


As novidades nessa versão:


  • Criação de Famílias de colunas e índices secundários em tempo de execução
  • Suporte ao CQL 2.0
  • suporte a chamada de chaves com 'in'




    Para demonstrar essa nova versão será apresentado um exemplo prático com uma aplicação simples. Essa aplicação terá o objetivo de armazenar informações da média de renda dos brasileiros agrupados por CEP, a ideia seria saber quanto é gerado em reais e o número de entidades comerciais ( padarias, mercados, mercadinhos, açougues etc.) que geram esse valor em um determinado local, CEP. Assim será armazenado aproximadamente 640 mil informações a cada levantamento de estudo.
Cada requisição para o estudo terá as seguintes informações:


  • Código do Lote
  • Quantidade de pessoas calculadas no setor CEP
  • Valor computado
  • Cidade
  • Logradouro
  • Bairro
  • Cep
  • Tipo do logradouro
  • Estado
  • Sigla


    Para armazenar essas informações será utilizado o banco nosql Cassandra que é:


  1. Altamente confiável:
    Utilizado por diversas empresas entre elas Cisco, Reddit, Twitter. O maior cluster conhecido do Cassandra possui mais de 300 tb em 400 máquinas .
  2. Tolerante a falhas :
    Os dados são replicados automaticamente para múltiplos nós para a tolerância a falhas.
  3. Descentralizado :
    Já que não existe ponto de falha nem gargalhos de rede. Já que cad nós é idêntico .
  4. Configurável:
    Se pode escolher de uma maneira bastante simples se será uma atualização síncrona ou assíncrona além de possuir Hinted Handoff e Read Repair .
  5. Escalável :
    Com ele tanto a escalabilidade horizontal e vertical poderão ser feitas de uma maneira bastante simples. Além de adicionar novas máquinas podem ser adicionadas sem tempo de interrupção .
  6. Durável :
    Foi projeto para não perder informações mesmo quando vários nós falham.


    Para facilitar o desenvolvimento será utilizado o Easy-Cassandra que funcionará como uma camada de acima do Thrift facilitando as chamadas para o Cassandra, aumentando a produtividade além de deixar o código mais limpo. Para seu funcionamento é necessário baixar a lib do framework além de suas dependências (mais informações no final do artigo). Para facilitar o gerenciamento dessas lib nesse exemplo será utilizado o maven, para ter acesso o projeto é necessário adicionar o repositório além da tag da lib conforme mostra a tabela 1.



Tabela1: chamada do repositório e chamada da lib do Easy-Cassandra

Cada requisição representará uma linha no Cassandra que pode varia o seu tamanho de linha por linha. Assim mapeando as requisições com as anotações ficará de acordo com a tabela 2.


@ColumnFamilyValue(name = "controle")
public class ControleRenda implements Serializable {

@KeyValue(auto = true)
private Long id;
@EmbeddedValue
private Endereco endereco;
@ColumnValue(name = "valor")
private Double valor;
@ColumnValue(name = "quantidade")
private Long quantidade;
//getter and setter
}

public class Endereco implements Serializable {

@ColumnValue(name="cidade")
private String cidade;
@ColumnValue(name="logradouro")
private String logradouro;
@ColumnValue(name="bairro")
private String bairro;
@IndexValue
@ColumnValue(name="cep")
private String cep;
@ColumnValue(name="tp_logradouro")
private String tp_logradouro;
@ColumnValue(name="estado")
private String estado;
@ColumnValue(name="sigla")
private String sigla;
// getter and setter
}

Tabela 2: Mapeamento das classes para o controle de renda por cep


    Ao ver a tabela 2 na classe Endereço existe a anotação @IndexValue no campo cep, essa anotação faz com que esse campo seja um índice secundário, um campo que além da chave pode recuperar informações dentro da linha. Com isso nessa linha além do código de controle ( coluna chave) a linha pode ser recuperada pelo cep ( campo chave secundária).
Para simular essas requisições foi utilizado um arquivo texto com aproximadamente 640 mil linhas. Cada linha possui as informações separado por pipe '|'.
Para rodar o nosso exemplo é necessário que o Cassandra esteja rodando já que tanto a família de colunas tanto a chave secundária serão criados em tempo de execução graças ao um recurso da nova versão.


create keyspace renda;



    Assim basta executar a aplicação e todas as informações estarão persistiradas no cassandra. De fato existe inúmeras maneiras de aumentar a performance do cassandra (configurando o GC, configurando o heap, aumentando o número de nós e clusters, etc.), mas nesse exemplo foi mostrado usando os recursos padrões.
Nesse artigo foi demonstrado um exemplo prático utilizando o Easy-Cassandra 1.0.8 junto com o maven, realizando um programa simples com 640 requisições. Foi demonstrado alguns novos recursos como a criação da família de coluna e a chave secundária em tempo de execução.


Referências:




Documentação, lib e código exemplo (Maven_Example.rar): https://github.com/otaviojava/Easy-Cassandra/downloads












sexta-feira, 10 de fevereiro de 2012

Adote o openjdk






O openjdk é um projeto que foi iniciado pela Sun Microsystems, atualmente mantido pela por várias empresas e a comunidade, para a criação de um Java Development Kit baseado totalmente em software livre e de código aberto. O projeto foi iniciado em 2006 e tem como base o HotSpot ( a jvm da Sun). Com o lançamento do java 7 o projeto passar a ser a JVM de referência. O seu uso traz diversas vantagens como ser open source, podendo estudar o código fonte, e existem diversas empresas contribuindo na empresa além da forte comunidade java. Para tornar esse projeto mais popular, aumentar o número de pessoas contribuindo e evangelizando o projeto, foi lançado do adote o openjdk.

Uma das diretrizes do projeto é estar envolvendo pessoas de diversas parte do mundo a estarem trabalhando em pontos específicos do projeto. Existem diversas vantagens em fazer parte desse projeto dentre eles:

  • Melhorar a linguagem e a JVM que você usa diariamente!
  • Participar ainda mais da comunidade
  • Obter um forte Networking ( com pessoas ao redor do mundo)
  • Contribuir diretamente ao projeto Java
  • Ter experiência de um grande projeto e de visibilidade mundial
  • Conhecer sobre teste por unidade e por regressão (Jtreg)
  • Adicionar isso em suas habilidades (currículo / CV)

Esse é um projeto muito interessante e certamente muito se tem a aprender com ele. Saber como funciona a JVM dará melhores oportunidades de tirar o máximo proveito dela no seu dia a dia. O conhecimento e a experiência que virão a partir do mesmo serão únicos.

Em breve mais informações: http://java.net/projects/jugs/pages/AdoptOpenJDK


segunda-feira, 26 de dezembro de 2011

Mitos e verdades sobre o Java e o opensource, o que foi feito e o que esperar para o 2012





             
            Esse ano um dos grandes “boom” do mundo java foi o openjdk, um projeto open source da JVM, recentemente ele evolui de um modo exponencial, no entanto existem alguns mitos além de algumas pessoas não o conhecerem. Alguns o conhecia como o “irmão pobre” do JDK da SUN (agora da Oracle), mas muita coisa mudou ao longo do início do projeto é uma visão tão primitiva quando achar que o Linux é o Sistema Operacional da tela preta. O projeto ficou muito popular com a remoção da licença temporária de utilizar o jdk da Sun nas distribuições Linux, apesar de várias contradições a verdade é que as Distribuições Linux não perderam acesso a uma jvm fechada, eles possuem um projeto aberto e maduro e muito forte pronto para atender suas necessidades. Esse ano o java teve grandes avanços e a grande maioria ligados a projetos open sources. Esse post foi feito em modo de quiz, perguntas e respostas, sobre algumas duvidas relacionadas ao openjdk, mito sobre o java e o que foi feito e o que esperar do java em 2012.


1- O que é o openjdk ?

O openjdk é um projeto que foi iniciado pela Sun Microsystems, atualmente mantido pela por várias empresas e a comunidade, para a criação de um Java Development Kit baseado totalmente em software livre e de código aberto. O projeto foi iniciado em 2006 e tem como base o HotSpot ( a jvm da Sun).

2 – Existe outros JDKs além da Oracle ?

Sim existe e o openjdk é um exemplo desse,
Existe também o IBM J9, IcedTea, Hotspot (Da antiga Sun), jRockit (da Oracle), Apache Harmony ,Hewlett Packard JVM entre outras.


3 – Com tantas JDKs qual delas é a referência ?

A partir da nova versão do java, o java 7, a implementação de referência é o openjdk.

4 – Qual a vantagem de se usar o openjdk ?

  • A primeira vantagem é que ele é open source ou seja você pode estar estudando o seu código fonte.
  • Ela agora é a implementação de referência ou seja se você quer fazer um aplicativo e quer que rode em qualquer JVM, usando o openjdk isso pode ser garantido.
  • A comunidade java é certamente uma das comunidades mais fortes do mundo. A jvm do projeto, por exemplo, está passando por constantes refatorações para melhoria de performance, atualização de bibliotecas e atualização do código sem falar que para adicionar qualquer recurso é necessário que se tenha testes.
  • A Oracle doou o código fonte do jRockit e no java 8, previsto para o final de 2013, o código seja integrado com o Hotspot. Ou seja no openjdk haverá os melhores de dois mundo em um só lugar.
  • Várias empresas fazem parte desse projeto, ou seja é uma JVM com o Know-how de várias empresas em todo o mundo. Empresas como IBM, Apple, SAP, Mac, Azul, Intel, RedHat etc. fazem parte do projeto.
  • Se a Oracle deixar o java ( Algo que eu acho muito difícil por diversos motivosl) e deixar de fazer a JVM. O openjdk não será em nenhum momento abalado já que existem outras empresas apoiando além da comunidade.

5 – O openjdk é somente para uso acadêmico e não pode ser usado em sistemas sérios ou em projetos em produção.

    Certamente esses é um dos maiores mitos que existem. Há algum tempo atrás o Twitter trocou o background do Ruby para java, por questão de performance e ele está utilizando o openjdk. O Twitter possui milhares de requisições, cerca de 250 milhões de tweets por dia, e é utilizado no mundo inteiro. Inclusive o Twitter está fazendo parte do projeto e está trazendo um pouco de sua experiência com milhões de requisições para o projeto além de ajudar no self-tuning previsto para o java 9. O openjdk em um cenário mundial é a segunda mais utilizada no mundo perdendo apenas para o HotSpot.


6 – Qual a diferença entre a JVM da Oracle e do OpenJdk ?

    A diferença entre essas duas JVMs está na adição de códigos fechados além de pequenas mudanças na implementação para implementações fechadas para a JVM da Oracle, a dessemelhança é de cerca de 4% de código. O que acontece é que nem todos os códigos foram abertos com êxito já que alguns pertence a terceiros e são apenas licenciados na época pela Sun.

7 – Que códigos diferentes são esses ?

Posso citar, por exemplo, a parte que renderiza os componentes em Swing.

8 – Como anda o trabalho com o openjdk ?

O projeto anda a todo vapor, existem diversas frentes de trabalho nele:
  • Integração jRockit e HotSpot
  • atualização de alguns códigos para o java 7
  • atualização de Libs para o java 7
  • Correções de Bugs no java 7
  • Sem falar nos trabalhos também já iniciado com o java 8
  • etc.

9 – Quando está previsto o novo java 8 ?

    A princípio o java 8 viria no ano que vem, mas com o intuito de facilitar a adesão da JVM nas empresas, as atualizações acontecerão em ciclos de dois em dois anos. Assim o java 8 está previsto para o final de 2013.
Com as seguintes novidades:

  • Conclusão da integração entre o jRockit e HotSpot gerando o HotRockit
  • JSR 308: Annotations on Java Types
  • JSR 310: Date and Time API
  • JSR TBD: More Small Enhancements to the Java Programming Language
  • JSR 335: Lambda Expressions for the Java Programming Language
  • JSR TBD: Java Platform Module System
Também já existem alguns planos para o java 9 é caso do self-tuning além da comunicação de várias linguagens dentro da JVM

10- Essa separação do java 7 em duas partes realmente valeu a pena ?


Na minha opinião teve grandes vantagens sim, dentre elas posso citar:
  • Trouxe uma nova versão ao java, coisa que não acontecia a cerca de 6 anos.
  • Permite a correções e atualizações da jvm sem esperar o lançamento do jdk.
  • Deixou as atualizações mais tangíveis deixando a entender o constante movimento da linguagem além de ciclos definidos, de aproximadamente dois anos, de atualização.
  • As grandes modificações como o lambda e o jigsaw, virão com ainda mais maturidade já que obtiveram mais tempo para serem trabalhados, vale ressaltar que mesmo com essa divisão em duas versões em nenhum momentos os projetos pararam.


11 – Com o lançamento do java 7 o que acontecerá com o 6 ?

   Haverão atualizações públicas até meado de 2012, após isso caso exista atualização serão apenas para atualizações de segurança.


12 – E sobre as certificações o que acontecerão com elas ?

   Essa é uma pergunta que eu não sei responder, a certificação é um produto da Oracle, ou seja a comunidade não tem participação nenhuma sobre isso. Atualmente existe uma versão beta do java 7. Muito se especula, mas até o momento a Oracle não deu muito detalhes o que se sabe é que mudou o nome, provavelmente haverá um curso antes da certificação além do custo da certificação elevar consideravelmente.

13 – Então o java Core é desenvolvida somente pela Oracle ?

Não, são duas coisas bem diferentes a certificação que é mantida por ela e a linguagem, plataforma e a JVM que são mantidas por diversas instituições como a IBM, Apple, SAP, Mac, Azul, Intel, RedHat, Twitter, comunidade, a própria Oracle etc.


14 – E o acontecimento entre o Oracle e o Google ?

Quando esse fato aconteceu eu estava apenas começando com a comunidade java então deixarei o meu amigo o Bruno Souza, o javaman, responder essa pergunta.
A primeira é uma palestra feito no TDC 2010:


E também uma entrevista feita pelo Paulo Patto que postou em seu Blog:




15 – Com a entrada a Oracle o java vai morrer ? Vale a pena ainda estudar java ?

    Muito pelo contrário, a Oracle vem ajudando de um modo muito forte, doando código para o openjdk, envolvendo todos os JUGs na festa do lançamento do java 7, fez uma versão open do java FX, voltou a trabalhar na plataforma ME etc.
Sobre a morte do java, isso certamente levará bastante tempo vale ressaltar que hoje java é a linguagem mais utilizada no mundo, a escolha número um na escolha de projetos empresariais, aproximadamente 90% das aplicações empresariais do mundo são em java além de mais de 9 milhões de desenvolvedores ao redor do mundo. Mesmo se o java não tivesse nenhuma atualização por esses números vale muito a pena estudar a linguagem, hoje se possui cronogramas até para o java 9, isso inclui componentes em html 5, computação nas nuvens dentre outros recursos.


16 – O java é muito lento.

    Com o surgimento de máquinas com o processadores binucleares e a evolução do projeto o java ganhou bastante notoriedade em relação a performance. Inclusive sendo comparado com o C e o C++ mostrando que seria até mais rápido. O líder de desenvolvimento do GMAIL Paul Buchheit afirmou em seu blog que com seus testes, mesmo tendo sido tomado todos os tipos de otimizações do GCC o código de seu benchmark roda mais rápido em Java que em C. Existem também outros testes confirmando essa afirmação.

fonte: http://keithlea.com/javabench/data


17 – O que foi feito nesse ano com o java e o que esperar para o futuro ?

Esse ano certamente tiveram algumas novidades para o java, podemos citar:
  • O lançamento do novo java 7, após alguns anos sem o lançamento de uma JDK.
  • O openjdk se tornou a versão padrão da JVM.
  • O java FX com um projeto open source.
  • Planos para o java 8 e 9, java EE 7.
  • O java ME voltando a ter trabalhos e evoluir junto com as outras plataformas.
  • Versão do jdk para Mac.
  • SouJava e o LondonJug fazendo parte do JCP.
  • Maior integração entre os grupos de usuários do Brasil (BrasilJUGs).

Sobre o que esperar para o futuro:

  • Mais trabalhos voltados em volta da JVM
  • Integrações ainda maiores entres os JUGs do mundo
  • Mais empresas utilizando e também contribuindo na openjdk
  • O javaFx rodando em todos os SOs.
  • Mais 4 correções do java 7, indo até o update 6.
  • Ultima versão pública do java 6
  • O lançamento do java ME 7


Conclusão

    Nesse artigo foi falado um pouco sobre o projeto openjdk, verdades e mentiras sobre o java algumas coisas que foram feitas nesse ano além de algumas expectativas do futuro da tecnologia e plataforma. Com tantas expectativas e trabalhos em constantes movimento é ter esperança de um 2012 com o java movendo para a frente.




Referência:

The Java is Faster than C++ and C++ Sucks Unbiased Benchmark

Mitos do Java e o opensource o que foi feito e o que esperar para o 2012

Paul Buchheit, líder do desenvolvimento do Gmail, java running faster than c




quarta-feira, 21 de dezembro de 2011

Refatorando a jvm com o Cleanup day




O Cleanup day é um esforço muito legal da comunidade mundial do java fez para acabar com os avisos na compilação do openjdk, foi iniciado no dia 1 de dezembro de 2011 e tende a acabar no final do ano ou seja, ano novo com java novo e limpinho :)
Existem vários avisos durante a compilação no entanto a maioria deles estão escondidos em arquivos de log. Uma boa dica é adicionar na compilação o javac -Xlint ClasseJava.java para poder ver, em alguns casos e a depender do número de código poderá existir cerca de 10 mil avisos emitidos pelo javac durante a construção.




O javac historicamente não emitia muito avisos. Um certo número de advertências foram por causa da especificação da linguagem Java, mas mesmo eram poucos. No JDK 5, o javac foi modificado para fornecer avisos adicionais.
Além disso, a linguagem de programação Java evoluiu, tornando obsoleto alguma parte do código. Isto ocorreu, por exemplo, quando lançou o JDK 5, com a adição dos generics os código que não tinha sido atualizado ao usar os generics contém diversos "raw type" e "unchecked" como mensagens de aviso durante a compilação. Ainda há um monte de código antigo no JDK (aprendi nesse processo um pouco de história da jvm e o tal do CORBA). De fato, estas duas mensagens de alerta são as principais mensagens de aviso que ocorrem em compilações do JDK.
A maioria desse alertas são, ruído ou sujeira e não representam problemas, no entanto, nos livrando de toda essa sujeira fica mais fácil de ver bugs.
Este é um esforço colaborativo entre os membros da comunidade OpenJDK  para limpar os avisos. Para este primeiro evento, se está focando em avisos de javac emitidos durante a construção do repositório jdk. A ideia é derrubar o maior número possível.

Com isso mostra que o java está em constante movimento além de utilizar técnicas atuais como a refatoração decódigo. Outra coisa muito legal é que o código do JDK 7 tem sonar. Esse certamente é uma das várias outras melhorias que haverá dentro da jvm e que faz o java mover para a frente.