Java.lang.OutOfMemoryError: Java heap space

Mas a sua JVM nao :wink:

Da uma olhada nos parametros de linha de comando (ou simplesmente procura no google por OutOfMemoryError)

Aqui:

.../netbeans-x.x/etc/netbeans.conf

Quando você ver este arquivo vai deduzir os parâmetros para a JVM, -Xm?256M

É só aumentar o necessário.

Para saber o significado de cada um, veja em $ man java, ou procure na documentação da Sun o que cada um significa.

Tente com estas configurações

-Xms512m -Xmx800m -XX : PermSize=128m -XX:MaxPermSize=256m

OBS : Eu deixei separado o XX : PermSize, para não sair emotion, na sua configuração coloque-os juntos.

Observando o topico fui dar uma olhanda no HotSpot e achei isso. Muito doido por sinal!

Big Heaps and Intimate Shared Memory (ISM)

Se você precisa melhorar a performance da jvm vale dar uma olhada no link:

http://java.sun.com/docs/hotspot/VMOptions.html

Ah, voce nao sabe o que é HotSpot?

http://www.javafree.org/javabb/viewtopic.jbb?t=6776

So uma pergunta, o que voce esta tentando fazer que esta gerando esse erro?

Imaginei que fosse realmente em uma consulta. Geralmente quando esses erros acontecem e porque existe algum erro de logica afinal todas as configurações padrões do HotSpot já são suficientes.

Nesse caso eu aconselharia fazer paginação dos dados. Primeiro porque o usuario nunca vai olhar todos esses registro e segundo porque ficaria bem mais rapido mesmo que você aumente o tamanho da heap.

select  * from tabela offset 10 limit 10

Essa query por exemplo faz o que eu te falei no banco de dados postgreSQL. Ela pega um limite de 10 registro a começar pelo decimo registro do total de registro.

No firebird seria: select first 10 skip 10 * from tabela;

Se você estiver utilizando algum framework OR tipo o Hibernate é possível tambem.

HibernateUtil.getSession().createCriteria(MinhaClasse.class) .addOrder(Order.desc("id")) .setFirstResult(10) .setMaxResults(10) .list();

Até …

[quote]Code:

select * from tabela offset 10 limit 10

Essa query por exemplo faz o que eu te falei no banco de dados postgreSQL. Ela pega um limite de 10 registro a começar pelo decimo registro do total de registro.

No firebird seria: Code:

select first 10 skip 10 * from tabela;

[/quote]

como eu faço isso no oracle??? via SQL??

SELECT *
FROM
(SELECT *
FROM TABELA)
WHERE ROWNUM BETWEEN 10 AND 19

nao funciona!!!

Análise Top-N
É vantajoso e eficiente usar o recurso de consultas Top-N, onde se faz uma sub-consulta (view em-linha) ordenada pelo critério desejado, como fonte para uma consulta externa onde se usa a pseudo-coluna ROWNUM para limitar a quantidade de linhas no resultado.

forma geral:

select * from 
( select * from tabela
   order by critério )
 where ROWNUM <= :N;

Ex.:

select * from 
( select a.*, rownum rnum from 
    (select  'numero '||rownum campo 
  from all_tables 
  ) a 
where rownum <= 30 ) 
 where rnum >= 10

Paginação
Consultas paginadas, comuns no ambiente web, caracterizadas pela exibição gradual de resultados (quantidade por página). Se a cada página são exibidas M linhas resultantes, na primeira página exibem-se as linhas 1 a M, na página 2 as linhas M+1 a 2M, na página P as linhas (P-1)M+1 a PM. Para isso, basta fazer uma consulta top-N para selecionar as primeiras PM linhas (LINHA_FINAL), aninhada em uma consulta mais externa que descarte as (P-1)*M primeiras linhas (LINHA INICIAL).

forma geral:

select * from 
( select /*+ FIRST_ROWS(n) */
  topn.*, ROWNUM rnum
      from ( sua_consulta_entra_aqui,
             order by critério, ROWID ) topn
      where ROWNUM <= :LINHA_FINAL )
where rnum  > :LINHA_INICIAL;

Ex.:

select * from 
( select /*+ FIRST_ROWS(20) */ 
  topn.*, ROWNUM rnum from 
      ( SELECT  DR.CAMPO1, DR.CAMPO2, DR.CAMPO3 
                FROM TABELA1 DR 
             order BY ROWID ) topn 
      where ROWNUM <= 40 ) -- LINHA FINAL 
where rnum  >= 21 -- LINHA INICIAL

Função de Paginação em consulta (JAVA+ORACLE)

Retorna uma consulta paginada
Parametro strQuery consulta original; Parametro pagina página que deseja retornar; Parametro elementos quantidade de registros por página; Returno String.

public String paginar(String strQuery, int pagina, int elementos) {
if (pagina> 1) {
pagina = (pagina- 1) * elementos+ 1;
} else {
pagina = (pagina- 1) * elementos;
}

         return (?SELECT * FROM (SELECT a.*, rownum rnum FROM (? +
                           strQuery + ?) a WHERE rownum <= ? + (pagina + elementos) + ?) ? +
                           ?WHERE rnum >= ? + pagina);
}

[quote=Eliezer Reis]Observando o topico fui dar uma olhanda no HotSpot e achei isso. Muito doido por sinal!

Big Heaps and Intimate Shared Memory (ISM)

Se você precisa melhorar a performance da jvm vale dar uma olhada no link:

http://java.sun.com/docs/hotspot/VMOptions.html

Ah, voce nao sabe o que é HotSpot?

http://www.javafree.org/javabb/viewtopic.jbb?t=6776[/quote]

Ola!

Vi o help que você deu quanto ao erro de heap space.

Eu também estou com o mesmo erro, porém estou compilando o JME e ta dando
java.lang.OutOfMemoryError: Java heap space

Ja fiz os procedimentos de aumentar memória JVM e nada de funfar…você tem alguma idéia do que possa ser?

Abraços.

Vera.

Aew pessoal estou o mesmo problema!!

java.lang.OutOfMemoryError: Java heap space!

acho que pode ser como nosso amigo Eliezer diz. tenho banco que possui em torno de 1500 resultados por tabela e quando passo de 1200 ele começa a dar esse erro. oque fazer??? uso o mysql, existe este tipo se seleçao por linhas no mysql?
ou o erro esta em outro lugar?

stacktrace:

SEVERE: Servlet.service() for servlet GerarMapa threw exception
java.lang.NullPointerException
	at com.mysql.jdbc.ConnectionImpl.registerStatement(ConnectionImpl.java:4321)
	at com.mysql.jdbc.StatementImpl.<init>(StatementImpl.java:275)
	at com.mysql.jdbc.ConnectionImpl.createStatement(ConnectionImpl.java:2382)
	at Conexao.executeSQL(Conexao.java:58)
	at GerarMapa.doPost(GerarMapa.java:73)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
07/07/2009 11:50:54 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet GerarMapa threw exception
java.lang.OutOfMemoryError: Java heap space
07/07/2009 11:50:54 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet GerarMapa threw exception
java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Unknown Source)
	at java.lang.String.<init>(Unknown Source)
	at com.mysql.jdbc.SingleByteCharsetConverter.toString(SingleByteCharsetConverter.java:327)
	at com.mysql.jdbc.ResultSetRow.getString(ResultSetRow.java:787)
	at com.mysql.jdbc.ByteArrayRow.getString(ByteArrayRow.java:67)
	at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5571)
	at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5448)
	at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5488)
	at GerarMapa.doPost(GerarMapa.java:78)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)

Procure ver:

// 1º quanto tem ?
System.out.println(Runtime.getRuntime().maxMemory());
//2º quanto estou usando ?
System.out.println(Runtime.getRuntime().totalMemory());
//quanto ainda tem ?
System.out.println(Runtime.getRuntime().freeMemory());

Realmente deu o estouro de memoria olha o so o ultimo resultado antes do erro:

1º quanto tem ? :66650112
2º quanto estou usando ?:66650112
3 quanto ainda tem ?:62376

como faço pra reutilzar a memoria ja usada uma ver que nao estou utilizando tanta memora assim?

aqui vai o codigo da minha servlet que causa o estouro da memoria:






import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;




public class GerarMapa extends HttpServlet {
	private static final long serialVersionUID = 1L;
	private Conexao conexao;
	private String lon; 
	private String lat;
	private String codigoDet; 
	private PrintWriter out;
	
    public GerarMapa() {
    	super();
        conexao = new Conexao();
        conexao.conecta();
           
       
    }
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		  
		 System.out.println("1º quanto tem ? :"+Runtime.getRuntime().maxMemory());  
		 
		 System.out.println("2º quanto estou usando ?:"+Runtime.getRuntime().totalMemory());  
		 
		System.out.println("3 quanto ainda tem ?:"+Runtime.getRuntime().freeMemory()); 

		codigoDet = "02";//request.getParameter("codigo"); 
		
		if(codigoDet!=null){
		
		 out = response.getWriter();
		
		 
			if(codigoDet!=""){	
				
				
				conexao.executeSQL("SELECT latitude, longitude from dbtech.rastreamento where codigoDetento = '"+codigoDet+"'");
			  
			 	try{
					 conexao.resultset.last();
					 lat = conexao.resultset.getString("latitude");
					 lon = conexao.resultset.getString("longitude");
					 out.write(lat+"!"+lon);
				}catch(SQLException ex){
					ex.printStackTrace();
			 	}
			}
			
			
		 }	
	}

}

Opa, bom dia pessoal. Tudo bem?

Quanto de memória o servidor tem?

Aumente o xmx para 1024 e reinicie a JVM. Veja se vai parar.

Cara, ja resolvi esse erro.

é necessario fechar a conexao com o BD depois de cada query. como eu não estava fechando, estourava a memoria com os resultset que eram armazenados enquanto o Garbage Collector não passava.

Erro simples de prograçao

galera…eu ainda nao saquei!

eu fiz o :

		
		// 1º quanto tem ?
		System.out.println("----->"+Runtime.getRuntime().maxMemory());
		//2º quanto estou usando ?
		System.out.println("----->"+Runtime.getRuntime().totalMemory());
		//quanto ainda tem ?
		System.out.println("----->"+Runtime.getRuntime().freeMemory());

meu resultado foi esse:
----->259522560
----->239419392
----->184755472

eu uso o eclipse aqui…como eu aumento a memoria??? nao é em algum dos arquivos de configuração do tomcat???

Posta o teu erro completo aqui.
e o codigo onde ta dando erro

[quote=MarcosOLIVEIRA]Posta o teu erro completo aqui.
e o codigo onde ta dando erro

[/quote]

basicamente o erro ocorre quando eu tento fazer um upload de um video atraves do componente JSF rich:fileUpload

quando eu faço upload de videos pequenos, não dá erro, quanto tento algum video de 100 megas aparece esse erro:

16:09:04,344 ERROR BaseXMLFilter:199 - Exception in the filter chain
javax.servlet.ServletException: Servlet execution threw an exception
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:313)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:367)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:2786)
	at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
	at org.ajax4jsf.request.MultipartRequest$FileParam.appendData(MultipartRequest.java:244)
	at org.ajax4jsf.request.MultipartRequest.readData(MultipartRequest.java:468)
	at org.ajax4jsf.request.MultipartRequest.readNext(MultipartRequest.java:428)
	at org.ajax4jsf.request.MultipartRequest.parseRequest(MultipartRequest.java:619)
	at org.richfaces.component.FileUploadPhaselistener.beforePhase(FileUploadPhaselistener.java:63)
	at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:214)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:96)
	at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:102)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	... 17 more
08/07/2010 16:09:04 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet Faces Servlet threw exception
java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:2786)
	at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:94)
	at org.ajax4jsf.request.MultipartRequest$FileParam.appendData(MultipartRequest.java:244)
	at org.ajax4jsf.request.MultipartRequest.readData(MultipartRequest.java:468)
	at org.ajax4jsf.request.MultipartRequest.readNext(MultipartRequest.java:428)
	at org.ajax4jsf.request.MultipartRequest.parseRequest(MultipartRequest.java:619)
	at org.richfaces.component.FileUploadPhaselistener.beforePhase(FileUploadPhaselistener.java:63)
	at com.sun.faces.lifecycle.Phase.handleBeforePhase(Phase.java:214)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:96)
	at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:102)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:367)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)

o q pode estar errado???

O que pode estar ocorrendo é que voce esta colocando o video todo em memoria antes de fazer o upload.

assim “estourando” a memoria.

talvez se voce criasse um buffer que le parte do arquivo que esta no disco, e envia por partes sem instanciar o arquivo em memoria, possa resolver.

acho que no seu bean deve ter algum metodo que faça o carregamento do video…
se sim, isso pode ajudar


File arquivo = //o arquivo que voce quer mandar
 FileInputStream  fileIn  = new FileInputStream(arquivo);
 BufferedInputStream buffIn = new BufferedInputStream(fileIn);
 int tamanho;
 byte[] buffer = new byte[1024];//pode ser qualqer tamano que voce quiser

              while ((tamanho = buffIn.read(buffer)) != -1) {
                   
                   
                 //aqui voce envia o buffer que é a divisao do arquivo

                }

Parece um pouco complicado mesmo… Mas ja fiz isso usando sockets para envio de arquivos pela rede.
talvez a ideia te ajude mais que o codigo.