PASS486 - SIGKILL 런타임오류 질문드립니다.

  • chaeheesung
    chaeheesung

    RTE (SIGKILL: program was forcefully killed, probably memory limit exceeded)

    SIGKILL을 검색해서 찾아보니 시간초과인데 다른 문제점때문에 런타임오류가 뜬다고 하는데 이것도 똑같은 경우인가요??

    혹시하고 코드도 첨부합니다.

    import java.util.Scanner;

    public class Main {
    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);

    //정수 10,000,000개를 저장할 배열 선언
        int[][] numInteger= new int[10000000][2];
    
        //numInteger배열에 1~10,000,000의 숫자를 대입
        for(int i=0; i<10000000; i++){
            numInteger[i][0] = i + 1;
            numInteger[i][1] = 0;
        }
    
    
        //long start = System.currentTimeMillis();
    
    
        //1~10,000,000의 약수를 numInteger[i][1]에 저장한다.
        for(int i=1; i<=10000000; i++){
            for(int j=i; j<=10000000; j=j+i){
                if(numInteger[j-1][0] % numInteger[i-1][0] == 0){
                    numInteger[j-1][1] = numInteger[j-1][1] + 1;
                }
            }
        }
    
    
        //long end = System.currentTimeMillis();
        //System.out.println((end-start)/1000.0);
    
    
        /**
         * 테스트케이스 입력 및 찾을 약수의 개수, 최소값, 최대값 선언
         */
        int testcase = input.nextInt();
        int numChoice;
        int lo;
        int hi;
    
        /**
         * 테스트케이스 반복문
         */
        for(int i=0; i<testcase; i++){
            /**
             * 각 변수 입력 및 count변수 선언
             */
            int count = 0;
            numChoice = input.nextInt();
            lo = input.nextInt();
            hi = input.nextInt();
    
            /**
             * lo-hi 범위에서 약수의 개수가 numChoice인 숫자를 찾아서 count를 증가시킨다.
             */
            for(int j=lo; j<=hi; j++){
                if(numInteger[j-1][1]==numChoice){
                    count = count + 1;
                }
            }
    
            System.out.println(count);
        }
    }//main

    }


    9년 전
4개의 댓글이 있습니다.
  • Namnamseo
    Namnamseo

    일반적으로 메모리를 너무 많이 사용하는 경우 컴퓨터에서 그 프로그램을 강제로 종료(!)시켜버립니다. 그 강제 종료가 프로그램에 SIGKILL이라는 신호를 보내는 거죠.
    Java의 경우 -Xms와 -Xmx 옵션으로 가상머신의 최대 메모리 크기를 임의로 설정할 수 있습니다. 이 옵션으로 메모리를 늘린 후 시도해보세요.


    9년 전 link
  • Being
    Being

    SIGKILL은 어떤 이유든 어떤 경로를 통해서든 KILL 시그널이 왔다는 것만을 의미합니다. 알고스팟 온라인 저지에서는 샌드박스 내의 메모리 제한을 초과할 경우 SIGKILL을 발생시켜 프로세스를 종료하고 있으며, 또한 SIGKILL이 발생하는 이유의 대다수가 메모리 초과로 인해 발생하는 것이므로 옆에 따로 써 둔 것입니다.

    위에서 Namnamsec님이 말씀하셨듯 JVM의 메모리 할당을 수정한다고 하더라도 채점 시스템에서의 동작은 변함없으며, 지금과 같이 메모리 사용량이 초과하는 한 채점되지 않을 것입니다. 사용하는 변수의 단순 크기만 하더라도 80MB에 가까운데, 여기에 각종 오버헤드와 JVM 자체의 무게를 감안하면 128MB의 제한을 넘겼을 가능성이 높습니다.


    9년 전 link
  • Namnamseo
    Namnamseo

    아 알고스팟에서 런타임 에러 나면 저 메시지까지 보여줬군요.. 개인 컴퓨터에서 저런 에러가 난다는 건줄 알았네요 :)


    9년 전 link
  • chaeheesung
    chaeheesung

    Namnamse님, Being님 감사합니다. 코드를 좀 수정해서 정답은 나왔네요..
    앞으로도 SIGKILL나오면 메모리쪾을 손을 봐야겠네요.


    9년 전 link
  • 정회원 권한이 있어야 커멘트를 다실 수 있습니다. 정회원이 되시려면 온라인 저지에서 5문제 이상을 푸시고, 가입 후 7일 이상이 지나셔야 합니다. 현재 문제를 푸셨습니다.