Я проводил тест String vs StringBuilder для изучения Java GC и, возможно, JIT.
Я заметил нечто странное. На этом графике с 0 минут до 2:31 утра мой компьютер практически ничего не делает, кроме моей программы на Java:
Затем я начал курсировать, открыл игру, просмотр веб-страниц, и внезапно сборка мусора стала гораздо более агрессивной: (около 2:35 утра)
Давайте снова запустим тест с Thread.sleep (1000):
Это не имеет никакого смысла для меня. Посмотрите, как он выделил кучу в первых двух графиках ... без изменений. Обнаруживает ли 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());
}