Сборка мусора Java увеличивается, когда компьютер используется? - PullRequest
0 голосов
/ 16 марта 2019

Я проводил тест String vs StringBuilder для изучения Java GC и, возможно, JIT.

Я заметил нечто странное. На этом графике с 0 минут до 2:31 утра мой компьютер практически ничего не делает, кроме моей программы на Java:

enter image description here

Затем я начал курсировать, открыл игру, просмотр веб-страниц, и внезапно сборка мусора стала гораздо более агрессивной: (около 2:35 утра) enter image description here

Давайте снова запустим тест с Thread.sleep (1000): enter image description here

Это не имеет никакого смысла для меня. Посмотрите, как он выделил кучу в первых двух графиках ... без изменений. Обнаруживает ли JVM, что пространство в куче может попасть под огонь? Когда я смотрю на свой процессор, он загружается с той же 25% или меньшей нагрузкой, поэтому узких мест в процессоре не происходит. Затем, на третьем графике, это освобождает кучу во многом аналогично тому, когда я играю, а не играю (здесь я пытаюсь использовать CPU).

Почему это происходит?

КОД, если это возможно, может изменить ситуацию:

public static void main(String[] args) throws IOException, InterruptedException {

        GCTests test = new GCTests();


        // Test setup
        int iterations = 1000;   // with 800MB


        // Keep running so I can see the results in jvisualm
        while(true) {



            System.out.println("\n\n\n\n\nSTARTING STRING TEST");
            test.withString(iterations);
            System.out.println("\n\n\n\n\nALL DONE STRING TEST");
            Thread.sleep(20000);



            System.out.println("\n\n\n\n\nSTARTING STRINGBUILDER TEST");
            test.withStringBuilder(iterations);
            System.out.println("\n\n\n\n\nALL DONE STRINGBUILDER TEST");
            Thread.sleep(20000);

        }

    }


    public void withString(int iterations) throws IOException, InterruptedException{

        // Connect scanner to file
        File file = new File("C:\\Users\\userx\\Desktop\\Intellij\\Practice\\DragNDrop\\src\\TextDragNDrop\\wordlist.10000.txt");
        Scanner in;



        // Append processed data to StringBuilder
        StringBuilder collectForOuput = new StringBuilder();
        String inputStr = "";   // Allow every line to consume one string


        //////// START iterationsIndex times loop ////////////
        // Trying to get millions of Strings being made
        int iterationsIndex = 0;
        while(iterationsIndex < iterations) {





            ///////// START FILE ///////////////////
            in = new Scanner(file);

            // Number of lines to expect and an index for each line
            int wordsCount = 10000;
            int wordCountIndex = 0;

            //in.nextLine();  // Consume newline

            while (wordCountIndex < wordsCount) {

                inputStr = in.nextLine();  // Assign to string, newline is consumed so need to do another
                // nextLine()

                for (int i = 0; i < inputStr.length(); i += 2) {

                    collectForOuput.append(inputStr.charAt(i));
                }
                collectForOuput.append(" ");
                for (int i = 1; i < inputStr.length(); i += 2) {

                    collectForOuput.append(inputStr.charAt(i));
                }
                collectForOuput.append("\n");

                wordCountIndex++;
            }
            //////// END FILE ///////////////////////////



            ////////////////////////
            // TEST PAUSE FOR GC ///
            ////////////////////////
            //Thread.sleep(1000);



            // File processed. Report and start again.
            iterationsIndex++;
            //System.out.println(iterationsIndex + " iterations complete.");

        }//////// END iterationsIndex times loop ////////////


        // At 1_000 iterations
        //System.out.println(collectForOuput.toString());

    }


    public void withStringBuilder(int iterations) throws IOException, InterruptedException{

        // Connect scanner to file
        File file = new File("C:\\Users\\userx\\Desktop\\Intellij\\Practice\\DragNDrop\\src\\TextDragNDrop\\wordlist.10000.txt");
        Scanner in;



        // Append processed data to StringBuilder
        StringBuilder collectForOuput = new StringBuilder();
        StringBuilder inputStr = new StringBuilder();    // Every line is appended to
                                                        // SB and SB is made length 0
                                                        // after every line is processes...


        //////// START iterationsIndex times loop ////////////
        // Trying to get millions of Strings being made
        int iterationsIndex = 0;
        while(iterationsIndex<iterations) {





            ///////// START FILE ///////////////////
            in = new Scanner(file);

            // Number of lines to expect and an index for each line
            int wordsCount = 10000;
            int wordCountIndex = 0;

            //in.nextLine();  // Consume newline

            while (wordCountIndex < wordsCount) {

                // Append to StringBuilder, newline is consumed so need to do another
                // nextLine()
                inputStr.append(in.nextLine());

                for (int i = 0; i < inputStr.length(); i += 2) {

                    collectForOuput.append(inputStr.charAt(i));
                }
                collectForOuput.append(" ");
                for (int i = 1; i < inputStr.length(); i += 2) {

                    collectForOuput.append(inputStr.charAt(i));
                }
                collectForOuput.append("\n");
                inputStr.setLength(0);

                wordCountIndex++;
            }
            //////// END FILE ///////////////////////////



            ////////////////////////
            // TEST PAUSE FOR GC ///
            ////////////////////////
            //Thread.sleep(1000);



            // File processed. Report and start again.
            iterationsIndex++;
            //System.out.println(iterationsIndex + " iterations complete.");

        }//////// END iterationsIndex times loop ////////////


        // At 1_000 iterations
        //System.out.println(collectForOuput.toString());

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...