Java JVM内部-为什么同一段代码在不同的时间运行?

Java JVM内部-为什么同一段代码在不同的时间运行?,java,jvm,Java,Jvm,我试图理解JVM选项,并遇到了选项CompileThreshold。我正在运行以下程序: public class Main { public static void main (String [] args) { for (int repeat = 0; repeat < 200; ++ repeat) { long start = System.nanoTime(); sum (10

我试图理解JVM选项,并遇到了选项
CompileThreshold
。我正在运行以下程序:

public class Main {    
    public static void main (String [] args) {    
        for (int repeat = 0; repeat < 200; ++ repeat) {    
            long start = System.nanoTime();    
            sum (100);    
            long end = System.nanoTime();    
            long diff = end - start;    
            System.out.println (repeat + ": " + diff);    
        }    
    }    `

    public static int sum (int n) {
        if (n <= 1)
            return 1;
        else
            return n + sum (n - 1);
    }
}
如果你观察的话,在32、99、149、194的时间点上会出现峰值。


194年后,运行所需的时间相对较少。请解释一下这种行为。谢谢。

最初的峰值是决定编译代码的JIT,其余的都是GC运行。

最有可能的是JVM重新JITs方法中的热点,因为在194次运行后,多次调用导致加速:

B.5.3编译保留

默认值:1500

用法示例:java-XX:CompileThreshold=1000000

HotSpot的当前实现通常在编译方法之前等待方法执行一定次数。不编译每个方法有助于启动时间和减少RAM占用。此选项允许您控制该阈值。通过增加数量,您可以在程序达到峰值性能之前,以RAM占用空间的轻微减少换取更长的时间


恕我直言,这个问题是不完整的,除非您提到在后台/前台运行的其他进程的活动,也就是说,如果不了解整个系统负载,就很难预测这些计时的原因。运行此类基准测试时,请确保捕获/监控整个系统负载,或者至少确保没有运行任何后台活动,如病毒扫描等。此外,您还遗漏了其他重要信息,如JVM版本、平台和内核数量


是否可以确认相同的结果并重新发布您的结果

CompileThreshold如何在其中发挥作用?你能解释一下吗?这并不能解释1940年后3倍的速度增长还有一个问题吗?在JIT开始之前,解释是否起作用?我正在运行一个独立的程序。jvm版本是1.6.0
0: 8555
1: 6416
2: 6416
3: 5988
4: 6416
5: 8555
6: 5989
7: 6416
8: 6416
9: 5988
10: 5561
11: 5988
12: 5988
13: 5988
14: 5988
15: 5988
16: 5988
17: 5988
18: 5988
19: 6416
20: 5988
21: 5988
22: 5988
23: 5988
24: 5560
25: 6416
26: 5988
27: 5561
28: 5560
29: 5989
30: 5989
31: 5988
32: 21814
33: 6416
34: 6843
35: 6416
36: 6844
37: 6416
38: 6416
39: 6844
40: 6416
41: 6415
42: 6416
43: 5988
44: 6416
45: 6844
46: 6416
47: 6416
48: 6416
49: 6416
50: 6416
51: 6416
52: 5988
53: 6416
54: 6844
55: 6843
56: 6416
57: 6844
58: 6416
59: 6416
60: 6415
61: 6416
62: 6416
63: 6416
64: 5988
65: 5988
66: 6416
67: 6416
68: 6844
69: 6416
70: 6416
71: 6416
72: 6416
73: 6416
74: 6415
75: 6416
76: 6416
77: 6416
78: 6416
79: 6415
80: 6844
81: 5988
82: 6415
83: 6416
84: 6416
85: 6416
86: 6416
87: 6416
88: 7272
89: 6416
90: 6416
91: 6844
92: 6844
93: 6415
94: 6416
95: 6415
96: 6415
97: 6416
98: 6416
99: 25236
100: 6416
101: 6416
102: 6843
103: 6416
104: 5988
105: 6416
106: 6415
107: 6416
108: 6416
109: 6416
110: 6416
111: 6416
112: 6416
113: 6844
114: 6416
115: 6416
116: 6416
117: 5988
118: 6416
119: 6416
120: 6416
121: 6415
122: 6416
123: 6415
124: 6416
125: 6416
126: 6416
127: 6416
128: 5988
129: 5988
130: 6416
131: 6416
132: 5988
133: 5988
134: 6416
135: 6416
136: 5989
137: 6416
138: 6416
139: 5988
140: 5988
141: 6416
142: 5560
143: 5988
144: 6416
145: 6843
146: 6415
147: 6416
148: 6843
149: 11549
150: 6416
151: 6844
152: 6416
153: 6415
154: 6416
155: 5988
156: 5988
157: 6416
158: 6416
159: 6416
160: 6416
161: 6415
162: 6416
163: 6416
164: 6416
165: 6416
166: 5988
167: 5988
168: 5988
169: 6416
170: 6416
171: 6416
172: 5988
173: 5988
174: 6844
175: 5988
176: 6416
177: 6416
178: 6844
179: 6416
180: 6415
181: 6416
182: 5988
183: 5989
184: 6416
185: 6416
186: 6416
187: 6416
188: 5989
189: 5560
190: 5988
191: 6416
192: 6415
193: 6416
194: 18820
195: 1711
196: 1284
197: 2139
198: 1711
199: 1711