Estouro de memoria no jar

6 respostas Resolvido
java-sejava
O

Eu tenho uma aplicação que está rodando perfeitamente pelo eclipse. Porém, quando gero o jar ele dá o erro de estouro de memória.

schema update complete Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa ce at java.util.Arrays.copyOfRange(Unknown Source) at java.lang.String.<init>(Unknown Source) at java.lang.String.toUpperCase(Unknown Source) at java.lang.String.toUpperCase(Unknown Source) at net.ucanaccess.jdbc.UcanaccessResultSet.checkEscaped(UcanaccessResult Set.java:62) at net.ucanaccess.jdbc.UcanaccessResultSet.getObject(UcanaccessResultSet .java:567) at net.ucanaccess.jdbc.UcanaccessResultSet.getString(UcanaccessResultSet .java:689) at org.hibernate.type.StringType.get(StringType.java:18) at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:113) at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:102) at org.hibernate.type.AbstractType.hydrate(AbstractType.java:81) at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(Abstra ctEntityPersister.java:2031) at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1371) at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1299) at org.hibernate.loader.Loader.getRow(Loader.java:1197) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:568) at org.hibernate.loader.Loader.doQuery(Loader.java:689) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Lo ader.java:224) at org.hibernate.loader.Loader.doList(Loader.java:2144) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2028) at org.hibernate.loader.Loader.list(Loader.java:2023) at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:393) at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.ja va:338) at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java :172) at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) at br.com.accenture.dao.FornecedorDAO.buscaFornecedor(FornecedorDAO.java :136) at br.com.accenture.view.PanelFornecedor.pesquisa(PanelFornecedor.java:2 07) at br.com.accenture.view.PanelFornecedor.actionPerformed(PanelFornecedor .java:415) at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
Alguém pode me mostrar um caminho? Obrigada

6 Respostas

P
Solucao aceita

provavelmente vc precisa executar este jar com os mesmos parametros da JVM que a sua IDE esta utilizando, no que diz respeito a memoria.

dessa forma vc estaria usando os parametros padrões da JVM que podem ser mais baixos que o necessario.

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

algo como java –Xmx1024m –jar MyApp.jar

O

Poxa amigo, valeu! Deu certo. Já tinha tentado com java -jar minhaAplicacao.jar -Xmx1024m, mas não tinha funcionado. Na ordem que vc colocou funcionou! Não sei o motivo.
Mas vc sabe me dizer como faço pra quando a pessoa der um duplo clique no jar ele já subir com 1024 de memória?

P

Vc pode usar Java Web Start

e declarar no arquivo jnlp atributos como initial-heap-size

https://docs.oracle.com/javase/tutorial/deployment/deploymentInDepth/jnlpFileSyntax.html

tipo

<java version="1.6+" initial-heap-size="4G" max-heap-size="4G"/>
O

É que minha aplicação é desktop e não web…
funciona mesmo assim?

P

java web start não é para web, é uma forma de vc executar um jar ( acho que pode ser local ) em um sandbox que vc pode configurar. um jar em si não consegue exportar configurações para a JVM

https://docs.oracle.com/javase/tutorial/deployment/webstart/

Java Web Start software provides the power to launch full-featured applications with a single click. Users can download and launch applications, such as a complete spreadsheet program or an Internet chat client, without going through lengthy installation procedures.
With Java Web Start software, users can launch a Java application by clicking a link in a web page. The link points to a Java Network Launch Protocol (JNLP) file, which instructs Java Web Start software to download, cache, and run the application.

é a maneira mais facil

tem gambiarras como o seu main invocar o java ( via Runtime.exec ) com os parametros corretos e sair ( um jar que executa o jar ). Eu nunca fiz isso, pode funcionar mas não me parece ideal

O

é, eu fiz mais ou menos isso. Criei outra classe com um método main que invoca o main da minha classe principal passando os parâmetros certos de memória.

`public static void main(String[] args) throws Exception {

float heapSizeMegs = (Runtime.getRuntime().maxMemory() / 1024) / 1024;
	if (heapSizeMegs > MIN_HEAP) {
		FrameCentral.main(args);

	} else {
		String pathToJar = FrameCentral.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();
		ProcessBuilder pb = new ProcessBuilder("java", "-XX:+AggressiveHeap", "-classpath", pathToJar,"br.com.accenture.view.FrameCentral");
		pb.start();
	}
}`
Criado 23 de novembro de 2016
Ultima resposta 24 de nov. de 2016
Respostas 6
Participantes 2