×
Ir ao conteúdo
  • Cadastre-se

Java Geração de Números Aleatórios Muito Grande


Posts recomendados

Estou gerando uma matriz muito grande de números aleatórios, a matriz tem o tamanho de 20.000X20.000 (400 Milhões de posições) como a matriz é muito grande precisei aumentar o tamanho da heap da JVM (para evitar o erro Exception in thread “main” java.lang.OutOfMemoryError: Java heap space) compilando usando o seguinte comando:

java -jar -Xms0m -Xmx4G Teste.jar

Até aí ok, quando eu uso o range de números aleatórios de 0 à 10, o programa executa tranquilo, mas quando eu aumento o range para 0 à 100.000.000 eu recebo o erro Java heap space novamente.

Gostaria de entender o porque isso acontece, já que o tamanho de um inteiro é sempre 4bytes, independente de que valor seja esse inteiro, não é ?? Logo não deveria faltar espaço para a JVM apenas porque aumentei o range dos números aleatórios mesmo mantendo o tamanho da matriz.

Segue o código:


Teste.java:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package teste;

import java.util.ArrayList;
import java.util.Random;

public class Teste {
    
    public static int TAM = 20000;
    private static final int rangeNumerosAleatorios = 100000000;//11;
    public static ArrayList<ArrayList<Integer>> matrizDeNumeros;

    public static void main(String[] args) {

        System.out.println(Thread.currentThread().getName());
        preencherMatriz();
        System.out.println("Matriz preenchida");
        //imprimirMatriz();
    }
    
    
    public static void preencherMatriz() {
        Random numero = new Random(2); // inicia semente para sempre gerar a mesma matriz
        ArrayList<Integer> linha;

        matrizDeNumeros = new ArrayList<ArrayList<Integer>>(TAM);
        for (int i = 0; i < TAM; i++) {
            linha = new ArrayList<Integer>();

            for (int j = 0; j < TAM; j++)
                linha.add(numero.nextInt(rangeNumerosAleatorios));

            matrizDeNumeros.add(linha); // adiciona uma linha a cada posição, formando uma matriz
        }
    }
    
    public static void imprimirMatriz() {
        for (int i = 0; i < matrizDeNumeros.size(); i++) {
            for (int j = 0; j < matrizDeNumeros.get(i).size(); j++)
                System.out.print(matrizDeNumeros.get(i).get(j) + " ");

            System.out.println("");
        }
    }
}

 

 

 

 

Saída quando executo com

TAM = 20000

rangeNumerosAleatorios = 100000000;

 

 

imagem_2022-05-14_150809460.png.2ef449417d17feb76fed752f0e88afe7.png

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Como ganhar dinheiro montando computadores!

MINICURSO GRÁTIS!

Como ganhar dinheiro montando computadores!

CLIQUE AQUI E INSCREVA-SE AGORA MESMO!