├── .gitignore
├── LICENSE.md
├── README.md
├── WhenWillItExitInt-bytecode-comparison
├── eclipse
│ └── safepoint
│ │ └── hang
│ │ ├── WhenWillItExitInt.bytecode
│ │ ├── WhenWillItExitInt.class
│ │ ├── WhenWillItExitInt1.bytecode
│ │ ├── WhenWillItExitInt1.class
│ │ ├── WhenWillItExitInt2.bytecode
│ │ └── WhenWillItExitInt2.class
└── javac
│ └── safepoint
│ └── hang
│ ├── WhenWillItExitInt.bytecode
│ ├── WhenWillItExitInt.class
│ ├── WhenWillItExitInt1.bytecode
│ ├── WhenWillItExitInt1.class
│ ├── WhenWillItExitInt2.bytecode
│ └── WhenWillItExitInt2.class
├── pom.xml
└── src
└── main
└── java
└── safepoint
├── fair
├── LoveAtATimeOfSafepoints.java
├── SafepointUsingFindDeadlocks.java
├── SafepointUsingGc.java
├── SafepointUsingThreadGetInfo.java
└── SafepointUsingThreadsDump.java
├── hang
├── WhenWillItExitInt.java
├── WhenWillItExitInt1.java
├── WhenWillItExitInt2.java
├── WhenWillItExitInt3.java
├── WhenWillItExitIntInfinite.java
└── WhenWillItExitLong.java
├── optimizations
└── SafepointKillLoopOptimizations.java
└── profiling
└── SafepointProfiling.java
/.gitignore:
--------------------------------------------------------------------------------
1 | # Package Files #
2 | *.jar
3 | *.war
4 | *.ear
5 |
6 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
7 | hs_err_pid*
8 | /bin/
9 | /target/
10 | /.classpath
11 | /.project
12 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | CC0 1.0 Universal
2 |
3 | Statement of Purpose
4 |
5 | The laws of most jurisdictions throughout the world automatically confer
6 | exclusive Copyright and Related Rights (defined below) upon the creator and
7 | subsequent owner(s) (each and all, an "owner") of an original work of
8 | authorship and/or a database (each, a "Work").
9 |
10 | Certain owners wish to permanently relinquish those rights to a Work for the
11 | purpose of contributing to a commons of creative, cultural and scientific
12 | works ("Commons") that the public can reliably and without fear of later
13 | claims of infringement build upon, modify, incorporate in other works, reuse
14 | and redistribute as freely as possible in any form whatsoever and for any
15 | purposes, including without limitation commercial purposes. These owners may
16 | contribute to the Commons to promote the ideal of a free culture and the
17 | further production of creative, cultural and scientific works, or to gain
18 | reputation or greater distribution for their Work in part through the use and
19 | efforts of others.
20 |
21 | For these and/or other purposes and motivations, and without any expectation
22 | of additional consideration or compensation, the person associating CC0 with a
23 | Work (the "Affirmer"), to the extent that he or she is an owner of Copyright
24 | and Related Rights in the Work, voluntarily elects to apply CC0 to the Work
25 | and publicly distribute the Work under its terms, with knowledge of his or her
26 | Copyright and Related Rights in the Work and the meaning and intended legal
27 | effect of CC0 on those rights.
28 |
29 | 1. Copyright and Related Rights. A Work made available under CC0 may be
30 | protected by copyright and related or neighboring rights ("Copyright and
31 | Related Rights"). Copyright and Related Rights include, but are not limited
32 | to, the following:
33 |
34 | i. the right to reproduce, adapt, distribute, perform, display, communicate,
35 | and translate a Work;
36 |
37 | ii. moral rights retained by the original author(s) and/or performer(s);
38 |
39 | iii. publicity and privacy rights pertaining to a person's image or likeness
40 | depicted in a Work;
41 |
42 | iv. rights protecting against unfair competition in regards to a Work,
43 | subject to the limitations in paragraph 4(a), below;
44 |
45 | v. rights protecting the extraction, dissemination, use and reuse of data in
46 | a Work;
47 |
48 | vi. database rights (such as those arising under Directive 96/9/EC of the
49 | European Parliament and of the Council of 11 March 1996 on the legal
50 | protection of databases, and under any national implementation thereof,
51 | including any amended or successor version of such directive); and
52 |
53 | vii. other similar, equivalent or corresponding rights throughout the world
54 | based on applicable law or treaty, and any national implementations thereof.
55 |
56 | 2. Waiver. To the greatest extent permitted by, but not in contravention of,
57 | applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and
58 | unconditionally waives, abandons, and surrenders all of Affirmer's Copyright
59 | and Related Rights and associated claims and causes of action, whether now
60 | known or unknown (including existing as well as future claims and causes of
61 | action), in the Work (i) in all territories worldwide, (ii) for the maximum
62 | duration provided by applicable law or treaty (including future time
63 | extensions), (iii) in any current or future medium and for any number of
64 | copies, and (iv) for any purpose whatsoever, including without limitation
65 | commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes
66 | the Waiver for the benefit of each member of the public at large and to the
67 | detriment of Affirmer's heirs and successors, fully intending that such Waiver
68 | shall not be subject to revocation, rescission, cancellation, termination, or
69 | any other legal or equitable action to disrupt the quiet enjoyment of the Work
70 | by the public as contemplated by Affirmer's express Statement of Purpose.
71 |
72 | 3. Public License Fallback. Should any part of the Waiver for any reason be
73 | judged legally invalid or ineffective under applicable law, then the Waiver
74 | shall be preserved to the maximum extent permitted taking into account
75 | Affirmer's express Statement of Purpose. In addition, to the extent the Waiver
76 | is so judged Affirmer hereby grants to each affected person a royalty-free,
77 | non transferable, non sublicensable, non exclusive, irrevocable and
78 | unconditional license to exercise Affirmer's Copyright and Related Rights in
79 | the Work (i) in all territories worldwide, (ii) for the maximum duration
80 | provided by applicable law or treaty (including future time extensions), (iii)
81 | in any current or future medium and for any number of copies, and (iv) for any
82 | purpose whatsoever, including without limitation commercial, advertising or
83 | promotional purposes (the "License"). The License shall be deemed effective as
84 | of the date CC0 was applied by Affirmer to the Work. Should any part of the
85 | License for any reason be judged legally invalid or ineffective under
86 | applicable law, such partial invalidity or ineffectiveness shall not
87 | invalidate the remainder of the License, and in such case Affirmer hereby
88 | affirms that he or she will not (i) exercise any of his or her remaining
89 | Copyright and Related Rights in the Work or (ii) assert any associated claims
90 | and causes of action with respect to the Work, in either case contrary to
91 | Affirmer's express Statement of Purpose.
92 |
93 | 4. Limitations and Disclaimers.
94 |
95 | a. No trademark or patent rights held by Affirmer are waived, abandoned,
96 | surrendered, licensed or otherwise affected by this document.
97 |
98 | b. Affirmer offers the Work as-is and makes no representations or warranties
99 | of any kind concerning the Work, express, implied, statutory or otherwise,
100 | including without limitation warranties of title, merchantability, fitness
101 | for a particular purpose, non infringement, or the absence of latent or
102 | other defects, accuracy, or the present or absence of errors, whether or not
103 | discoverable, all to the greatest extent permissible under applicable law.
104 |
105 | c. Affirmer disclaims responsibility for clearing rights of other persons
106 | that may apply to the Work or any use thereof, including without limitation
107 | any person's Copyright and Related Rights in the Work. Further, Affirmer
108 | disclaims responsibility for obtaining any necessary consents, permissions
109 | or other rights required for any use of the Work.
110 |
111 | d. Affirmer understands and acknowledges that Creative Commons is not a
112 | party to this document and has no duty or obligation with respect to this
113 | CC0 or use of the Work.
114 |
115 | For more information, please see
116 |
117 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # safepoint-experiments
2 | Supporting code for Safepoints blog post
3 |
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/eclipse/safepoint/hang/WhenWillItExitInt.bytecode:
--------------------------------------------------------------------------------
1 | Classfile /home/yak/git/safepoint-experiments/WhenWillItExitInt-bytecode-comparison/WhenWillItExitInt.class
2 | Last modified 23 Jan 2016; size 1717 bytes
3 | MD5 checksum 41fa6f283e7727f2e24829b4b5607661
4 | Compiled from "WhenWillItExitInt.java"
5 | public class safepoint.hang.WhenWillItExitInt
6 | minor version: 0
7 | major version: 52
8 | flags: ACC_PUBLIC, ACC_SUPER
9 | Constant pool:
10 | #1 = Class #2 // safepoint/hang/WhenWillItExitInt
11 | #2 = Utf8 safepoint/hang/WhenWillItExitInt
12 | #3 = Class #4 // java/lang/Object
13 | #4 = Utf8 java/lang/Object
14 | #5 = Utf8
15 | #6 = Utf8 ()V
16 | #7 = Utf8 Code
17 | #8 = Methodref #3.#9 // java/lang/Object."":()V
18 | #9 = NameAndType #5:#6 // "":()V
19 | #10 = Utf8 LineNumberTable
20 | #11 = Utf8 LocalVariableTable
21 | #12 = Utf8 this
22 | #13 = Utf8 Lsafepoint/hang/WhenWillItExitInt;
23 | #14 = Utf8 main
24 | #15 = Utf8 ([Ljava/lang/String;)V
25 | #16 = Utf8 Exceptions
26 | #17 = Class #18 // java/lang/InterruptedException
27 | #18 = Utf8 java/lang/InterruptedException
28 | #19 = Class #20 // java/lang/Thread
29 | #20 = Utf8 java/lang/Thread
30 | #21 = NameAndType #22:#23 // run:()Ljava/lang/Runnable;
31 | #22 = Utf8 run
32 | #23 = Utf8 ()Ljava/lang/Runnable;
33 | #24 = InvokeDynamic #0:#21 // #0:run:()Ljava/lang/Runnable;
34 | #25 = Methodref #19.#26 // java/lang/Thread."":(Ljava/lang/Runnable;)V
35 | #26 = NameAndType #5:#27 // "":(Ljava/lang/Runnable;)V
36 | #27 = Utf8 (Ljava/lang/Runnable;)V
37 | #28 = Methodref #19.#29 // java/lang/Thread.setDaemon:(Z)V
38 | #29 = NameAndType #30:#31 // setDaemon:(Z)V
39 | #30 = Utf8 setDaemon
40 | #31 = Utf8 (Z)V
41 | #32 = Methodref #19.#33 // java/lang/Thread.start:()V
42 | #33 = NameAndType #34:#6 // start:()V
43 | #34 = Utf8 start
44 | #35 = Long 5000l
45 | #37 = Methodref #19.#38 // java/lang/Thread.sleep:(J)V
46 | #38 = NameAndType #39:#40 // sleep:(J)V
47 | #39 = Utf8 sleep
48 | #40 = Utf8 (J)V
49 | #41 = Utf8 argc
50 | #42 = Utf8 [Ljava/lang/String;
51 | #43 = Utf8 t
52 | #44 = Utf8 Ljava/lang/Thread;
53 | #45 = Utf8 lambda$0
54 | #46 = Integer 2147483647
55 | #47 = Fieldref #48.#50 // java/lang/System.out:Ljava/io/PrintStream;
56 | #48 = Class #49 // java/lang/System
57 | #49 = Utf8 java/lang/System
58 | #50 = NameAndType #51:#52 // out:Ljava/io/PrintStream;
59 | #51 = Utf8 out
60 | #52 = Utf8 Ljava/io/PrintStream;
61 | #53 = Class #54 // java/lang/StringBuilder
62 | #54 = Utf8 java/lang/StringBuilder
63 | #55 = String #56 // How Odd:
64 | #56 = Utf8 How Odd:
65 | #57 = Methodref #53.#58 // java/lang/StringBuilder."":(Ljava/lang/String;)V
66 | #58 = NameAndType #5:#59 // "":(Ljava/lang/String;)V
67 | #59 = Utf8 (Ljava/lang/String;)V
68 | #60 = Methodref #53.#61 // java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
69 | #61 = NameAndType #62:#63 // append:(J)Ljava/lang/StringBuilder;
70 | #62 = Utf8 append
71 | #63 = Utf8 (J)Ljava/lang/StringBuilder;
72 | #64 = Methodref #53.#65 // java/lang/StringBuilder.toString:()Ljava/lang/String;
73 | #65 = NameAndType #66:#67 // toString:()Ljava/lang/String;
74 | #66 = Utf8 toString
75 | #67 = Utf8 ()Ljava/lang/String;
76 | #68 = Methodref #69.#71 // java/io/PrintStream.println:(Ljava/lang/String;)V
77 | #69 = Class #70 // java/io/PrintStream
78 | #70 = Utf8 java/io/PrintStream
79 | #71 = NameAndType #72:#59 // println:(Ljava/lang/String;)V
80 | #72 = Utf8 println
81 | #73 = Utf8 l
82 | #74 = Utf8 J
83 | #75 = Utf8 i
84 | #76 = Utf8 I
85 | #77 = Utf8 j
86 | #78 = Utf8 StackMapTable
87 | #79 = Utf8 SourceFile
88 | #80 = Utf8 WhenWillItExitInt.java
89 | #81 = Utf8 BootstrapMethods
90 | #82 = Methodref #83.#85 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
91 | #83 = Class #84 // java/lang/invoke/LambdaMetafactory
92 | #84 = Utf8 java/lang/invoke/LambdaMetafactory
93 | #85 = NameAndType #86:#87 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
94 | #86 = Utf8 metafactory
95 | #87 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
96 | #88 = MethodHandle #6:#82 // invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
97 | #89 = MethodType #6 // ()V
98 | #90 = Methodref #1.#91 // safepoint/hang/WhenWillItExitInt.lambda$0:()V
99 | #91 = NameAndType #45:#6 // lambda$0:()V
100 | #92 = MethodHandle #6:#90 // invokestatic safepoint/hang/WhenWillItExitInt.lambda$0:()V
101 | #93 = MethodType #6 // ()V
102 | #94 = Utf8 InnerClasses
103 | #95 = Class #96 // java/lang/invoke/MethodHandles$Lookup
104 | #96 = Utf8 java/lang/invoke/MethodHandles$Lookup
105 | #97 = Class #98 // java/lang/invoke/MethodHandles
106 | #98 = Utf8 java/lang/invoke/MethodHandles
107 | #99 = Utf8 Lookup
108 | {
109 | public safepoint.hang.WhenWillItExitInt();
110 | descriptor: ()V
111 | flags: ACC_PUBLIC
112 | Code:
113 | stack=1, locals=1, args_size=1
114 | 0: aload_0
115 | 1: invokespecial #8 // Method java/lang/Object."":()V
116 | 4: return
117 | LineNumberTable:
118 | line 2: 0
119 | LocalVariableTable:
120 | Start Length Slot Name Signature
121 | 0 5 0 this Lsafepoint/hang/WhenWillItExitInt;
122 |
123 | public static void main(java.lang.String[]) throws java.lang.InterruptedException;
124 | descriptor: ([Ljava/lang/String;)V
125 | flags: ACC_PUBLIC, ACC_STATIC
126 | Exceptions:
127 | throws java.lang.InterruptedException
128 | Code:
129 | stack=3, locals=2, args_size=1
130 | 0: new #19 // class java/lang/Thread
131 | 3: dup
132 | 4: invokedynamic #24, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;
133 | 9: invokespecial #25 // Method java/lang/Thread."":(Ljava/lang/Runnable;)V
134 | 12: astore_1
135 | 13: aload_1
136 | 14: iconst_1
137 | 15: invokevirtual #28 // Method java/lang/Thread.setDaemon:(Z)V
138 | 18: aload_1
139 | 19: invokevirtual #32 // Method java/lang/Thread.start:()V
140 | 22: ldc2_w #35 // long 5000l
141 | 25: invokestatic #37 // Method java/lang/Thread.sleep:(J)V
142 | 28: return
143 | LineNumberTable:
144 | line 4: 0
145 | line 14: 13
146 | line 15: 18
147 | line 16: 22
148 | line 17: 28
149 | LocalVariableTable:
150 | Start Length Slot Name Signature
151 | 0 29 0 argc [Ljava/lang/String;
152 | 13 16 1 t Ljava/lang/Thread;
153 |
154 | private static void lambda$0();
155 | descriptor: ()V
156 | flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
157 | Code:
158 | stack=4, locals=4, args_size=0
159 | 0: lconst_0
160 | 1: lstore_0
161 | 2: iconst_0
162 | 3: istore_2
163 | 4: goto 35
164 | 7: iconst_0
165 | 8: istore_3
166 | 9: goto 26
167 | 12: iload_3
168 | 13: iconst_1
169 | 14: iand
170 | 15: iconst_1
171 | 16: if_icmpne 23
172 | 19: lload_0
173 | 20: lconst_1
174 | 21: ladd
175 | 22: lstore_0
176 | 23: iinc 3, 1
177 | 26: iload_3
178 | 27: ldc #46 // int 2147483647
179 | 29: if_icmplt 12
180 | 32: iinc 2, 1
181 | 35: iload_2
182 | 36: ldc #46 // int 2147483647
183 | 38: if_icmplt 7
184 | 41: getstatic #47 // Field java/lang/System.out:Ljava/io/PrintStream;
185 | 44: new #53 // class java/lang/StringBuilder
186 | 47: dup
187 | 48: ldc #55 // String How Odd:
188 | 50: invokespecial #57 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V
189 | 53: lload_0
190 | 54: invokevirtual #60 // Method java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
191 | 57: invokevirtual #64 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
192 | 60: invokevirtual #68 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
193 | 63: return
194 | LineNumberTable:
195 | line 5: 0
196 | line 6: 2
197 | line 7: 7
198 | line 8: 12
199 | line 9: 19
200 | line 7: 23
201 | line 6: 32
202 | line 12: 41
203 | line 13: 63
204 | LocalVariableTable:
205 | Start Length Slot Name Signature
206 | 2 61 0 l J
207 | 4 37 2 i I
208 | 9 23 3 j I
209 | StackMapTable: number_of_entries = 5
210 | frame_type = 253 /* append */
211 | offset_delta = 7
212 | locals = [ long, int ]
213 | frame_type = 252 /* append */
214 | offset_delta = 4
215 | locals = [ int ]
216 | frame_type = 10 /* same */
217 | frame_type = 2 /* same */
218 | frame_type = 250 /* chop */
219 | offset_delta = 8
220 | }
221 | SourceFile: "WhenWillItExitInt.java"
222 | BootstrapMethods:
223 | 0: #88 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
224 | Method arguments:
225 | #89 ()V
226 | #92 invokestatic safepoint/hang/WhenWillItExitInt.lambda$0:()V
227 | #93 ()V
228 | InnerClasses:
229 | public static final #99= #95 of #97; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
230 |
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/eclipse/safepoint/hang/WhenWillItExitInt.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitsanw/safepoint-experiments/a828993eda77e10b8115fb76da835098e39a34fd/WhenWillItExitInt-bytecode-comparison/eclipse/safepoint/hang/WhenWillItExitInt.class
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/eclipse/safepoint/hang/WhenWillItExitInt1.bytecode:
--------------------------------------------------------------------------------
1 | Classfile /home/yak/git/safepoint-experiments/WhenWillItExitInt-bytecode-comparison/WhenWillItExitInt1.eclipse.class
2 | Last modified 23 Jan 2016; size 1814 bytes
3 | MD5 checksum a70a0aa4124674e843c5a6e58ad64311
4 | Compiled from "WhenWillItExitInt1.java"
5 | public class safepoint.hang.WhenWillItExitInt1
6 | minor version: 0
7 | major version: 52
8 | flags: ACC_PUBLIC, ACC_SUPER
9 | Constant pool:
10 | #1 = Class #2 // safepoint/hang/WhenWillItExitInt1
11 | #2 = Utf8 safepoint/hang/WhenWillItExitInt1
12 | #3 = Class #4 // java/lang/Object
13 | #4 = Utf8 java/lang/Object
14 | #5 = Utf8
15 | #6 = Utf8 ()V
16 | #7 = Utf8 Code
17 | #8 = Methodref #3.#9 // java/lang/Object."":()V
18 | #9 = NameAndType #5:#6 // "":()V
19 | #10 = Utf8 LineNumberTable
20 | #11 = Utf8 LocalVariableTable
21 | #12 = Utf8 this
22 | #13 = Utf8 Lsafepoint/hang/WhenWillItExitInt1;
23 | #14 = Utf8 main
24 | #15 = Utf8 ([Ljava/lang/String;)V
25 | #16 = Utf8 Exceptions
26 | #17 = Class #18 // java/lang/InterruptedException
27 | #18 = Utf8 java/lang/InterruptedException
28 | #19 = Class #20 // java/lang/Thread
29 | #20 = Utf8 java/lang/Thread
30 | #21 = NameAndType #22:#23 // run:()Ljava/lang/Runnable;
31 | #22 = Utf8 run
32 | #23 = Utf8 ()Ljava/lang/Runnable;
33 | #24 = InvokeDynamic #0:#21 // #0:run:()Ljava/lang/Runnable;
34 | #25 = Methodref #19.#26 // java/lang/Thread."":(Ljava/lang/Runnable;)V
35 | #26 = NameAndType #5:#27 // "":(Ljava/lang/Runnable;)V
36 | #27 = Utf8 (Ljava/lang/Runnable;)V
37 | #28 = Methodref #19.#29 // java/lang/Thread.setDaemon:(Z)V
38 | #29 = NameAndType #30:#31 // setDaemon:(Z)V
39 | #30 = Utf8 setDaemon
40 | #31 = Utf8 (Z)V
41 | #32 = Methodref #19.#33 // java/lang/Thread.start:()V
42 | #33 = NameAndType #34:#6 // start:()V
43 | #34 = Utf8 start
44 | #35 = Long 5000l
45 | #37 = Methodref #19.#38 // java/lang/Thread.sleep:(J)V
46 | #38 = NameAndType #39:#40 // sleep:(J)V
47 | #39 = Utf8 sleep
48 | #40 = Utf8 (J)V
49 | #41 = Utf8 argc
50 | #42 = Utf8 [Ljava/lang/String;
51 | #43 = Utf8 t
52 | #44 = Utf8 Ljava/lang/Thread;
53 | #45 = Utf8 countOdds
54 | #46 = Utf8 ()J
55 | #47 = Integer 2147483647
56 | #48 = Utf8 l
57 | #49 = Utf8 J
58 | #50 = Utf8 i
59 | #51 = Utf8 I
60 | #52 = Utf8 j
61 | #53 = Utf8 StackMapTable
62 | #54 = Utf8 lambda$0
63 | #55 = Methodref #1.#56 // safepoint/hang/WhenWillItExitInt1.countOdds:()J
64 | #56 = NameAndType #45:#46 // countOdds:()J
65 | #57 = Fieldref #58.#60 // java/lang/System.out:Ljava/io/PrintStream;
66 | #58 = Class #59 // java/lang/System
67 | #59 = Utf8 java/lang/System
68 | #60 = NameAndType #61:#62 // out:Ljava/io/PrintStream;
69 | #61 = Utf8 out
70 | #62 = Utf8 Ljava/io/PrintStream;
71 | #63 = Class #64 // java/lang/StringBuilder
72 | #64 = Utf8 java/lang/StringBuilder
73 | #65 = String #66 // How Odd:
74 | #66 = Utf8 How Odd:
75 | #67 = Methodref #63.#68 // java/lang/StringBuilder."":(Ljava/lang/String;)V
76 | #68 = NameAndType #5:#69 // "":(Ljava/lang/String;)V
77 | #69 = Utf8 (Ljava/lang/String;)V
78 | #70 = Methodref #63.#71 // java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
79 | #71 = NameAndType #72:#73 // append:(J)Ljava/lang/StringBuilder;
80 | #72 = Utf8 append
81 | #73 = Utf8 (J)Ljava/lang/StringBuilder;
82 | #74 = Methodref #63.#75 // java/lang/StringBuilder.toString:()Ljava/lang/String;
83 | #75 = NameAndType #76:#77 // toString:()Ljava/lang/String;
84 | #76 = Utf8 toString
85 | #77 = Utf8 ()Ljava/lang/String;
86 | #78 = Methodref #79.#81 // java/io/PrintStream.println:(Ljava/lang/String;)V
87 | #79 = Class #80 // java/io/PrintStream
88 | #80 = Utf8 java/io/PrintStream
89 | #81 = NameAndType #82:#69 // println:(Ljava/lang/String;)V
90 | #82 = Utf8 println
91 | #83 = Utf8 SourceFile
92 | #84 = Utf8 WhenWillItExitInt1.java
93 | #85 = Utf8 BootstrapMethods
94 | #86 = Methodref #87.#89 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
95 | #87 = Class #88 // java/lang/invoke/LambdaMetafactory
96 | #88 = Utf8 java/lang/invoke/LambdaMetafactory
97 | #89 = NameAndType #90:#91 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
98 | #90 = Utf8 metafactory
99 | #91 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
100 | #92 = MethodHandle #6:#86 // invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
101 | #93 = MethodType #6 // ()V
102 | #94 = Methodref #1.#95 // safepoint/hang/WhenWillItExitInt1.lambda$0:()V
103 | #95 = NameAndType #54:#6 // lambda$0:()V
104 | #96 = MethodHandle #6:#94 // invokestatic safepoint/hang/WhenWillItExitInt1.lambda$0:()V
105 | #97 = MethodType #6 // ()V
106 | #98 = Utf8 InnerClasses
107 | #99 = Class #100 // java/lang/invoke/MethodHandles$Lookup
108 | #100 = Utf8 java/lang/invoke/MethodHandles$Lookup
109 | #101 = Class #102 // java/lang/invoke/MethodHandles
110 | #102 = Utf8 java/lang/invoke/MethodHandles
111 | #103 = Utf8 Lookup
112 | {
113 | public safepoint.hang.WhenWillItExitInt1();
114 | descriptor: ()V
115 | flags: ACC_PUBLIC
116 | Code:
117 | stack=1, locals=1, args_size=1
118 | 0: aload_0
119 | 1: invokespecial #8 // Method java/lang/Object."":()V
120 | 4: return
121 | LineNumberTable:
122 | line 2: 0
123 | LocalVariableTable:
124 | Start Length Slot Name Signature
125 | 0 5 0 this Lsafepoint/hang/WhenWillItExitInt1;
126 |
127 | public static void main(java.lang.String[]) throws java.lang.InterruptedException;
128 | descriptor: ([Ljava/lang/String;)V
129 | flags: ACC_PUBLIC, ACC_STATIC
130 | Exceptions:
131 | throws java.lang.InterruptedException
132 | Code:
133 | stack=3, locals=2, args_size=1
134 | 0: new #19 // class java/lang/Thread
135 | 3: dup
136 | 4: invokedynamic #24, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;
137 | 9: invokespecial #25 // Method java/lang/Thread."":(Ljava/lang/Runnable;)V
138 | 12: astore_1
139 | 13: aload_1
140 | 14: iconst_1
141 | 15: invokevirtual #28 // Method java/lang/Thread.setDaemon:(Z)V
142 | 18: aload_1
143 | 19: invokevirtual #32 // Method java/lang/Thread.start:()V
144 | 22: ldc2_w #35 // long 5000l
145 | 25: invokestatic #37 // Method java/lang/Thread.sleep:(J)V
146 | 28: return
147 | LineNumberTable:
148 | line 4: 0
149 | line 8: 13
150 | line 9: 18
151 | line 10: 22
152 | line 11: 28
153 | LocalVariableTable:
154 | Start Length Slot Name Signature
155 | 0 29 0 argc [Ljava/lang/String;
156 | 13 16 1 t Ljava/lang/Thread;
157 |
158 | private static long countOdds();
159 | descriptor: ()J
160 | flags: ACC_PRIVATE, ACC_STATIC
161 | Code:
162 | stack=4, locals=4, args_size=0
163 | 0: lconst_0
164 | 1: lstore_0
165 | 2: iconst_0
166 | 3: istore_2
167 | 4: goto 35
168 | 7: iconst_0
169 | 8: istore_3
170 | 9: goto 26
171 | 12: iload_3
172 | 13: iconst_1
173 | 14: iand
174 | 15: iconst_1
175 | 16: if_icmpne 23
176 | 19: lload_0
177 | 20: lconst_1
178 | 21: ladd
179 | 22: lstore_0
180 | 23: iinc 3, 1
181 | 26: iload_3
182 | 27: ldc #47 // int 2147483647
183 | 29: if_icmplt 12
184 | 32: iinc 2, 1
185 | 35: iload_2
186 | 36: ldc #47 // int 2147483647
187 | 38: if_icmplt 7
188 | 41: lload_0
189 | 42: lreturn
190 | LineNumberTable:
191 | line 14: 0
192 | line 15: 2
193 | line 16: 7
194 | line 17: 12
195 | line 18: 19
196 | line 16: 23
197 | line 15: 32
198 | line 21: 41
199 | LocalVariableTable:
200 | Start Length Slot Name Signature
201 | 2 41 0 l J
202 | 4 37 2 i I
203 | 9 23 3 j I
204 | StackMapTable: number_of_entries = 5
205 | frame_type = 253 /* append */
206 | offset_delta = 7
207 | locals = [ long, int ]
208 | frame_type = 252 /* append */
209 | offset_delta = 4
210 | locals = [ int ]
211 | frame_type = 10 /* same */
212 | frame_type = 2 /* same */
213 | frame_type = 250 /* chop */
214 | offset_delta = 8
215 |
216 | private static void lambda$0();
217 | descriptor: ()V
218 | flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
219 | Code:
220 | stack=4, locals=2, args_size=0
221 | 0: invokestatic #55 // Method countOdds:()J
222 | 3: lstore_0
223 | 4: getstatic #57 // Field java/lang/System.out:Ljava/io/PrintStream;
224 | 7: new #63 // class java/lang/StringBuilder
225 | 10: dup
226 | 11: ldc #65 // String How Odd:
227 | 13: invokespecial #67 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V
228 | 16: lload_0
229 | 17: invokevirtual #70 // Method java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
230 | 20: invokevirtual #74 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
231 | 23: invokevirtual #78 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
232 | 26: return
233 | LineNumberTable:
234 | line 5: 0
235 | line 6: 4
236 | line 7: 26
237 | LocalVariableTable:
238 | Start Length Slot Name Signature
239 | 4 22 0 l J
240 | }
241 | SourceFile: "WhenWillItExitInt1.java"
242 | BootstrapMethods:
243 | 0: #92 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
244 | Method arguments:
245 | #93 ()V
246 | #96 invokestatic safepoint/hang/WhenWillItExitInt1.lambda$0:()V
247 | #97 ()V
248 | InnerClasses:
249 | public static final #103= #99 of #101; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
250 |
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/eclipse/safepoint/hang/WhenWillItExitInt1.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitsanw/safepoint-experiments/a828993eda77e10b8115fb76da835098e39a34fd/WhenWillItExitInt-bytecode-comparison/eclipse/safepoint/hang/WhenWillItExitInt1.class
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/eclipse/safepoint/hang/WhenWillItExitInt2.bytecode:
--------------------------------------------------------------------------------
1 | Classfile /home/yak/git/safepoint-experiments/WhenWillItExitInt-bytecode-comparison/WhenWillItExitInt2.eclipse.class
2 | Last modified 23 Jan 2016; size 1836 bytes
3 | MD5 checksum f4cc8f00220bb861dde363084cbbb439
4 | Compiled from "WhenWillItExitInt2.java"
5 | public class safepoint.hang.WhenWillItExitInt2
6 | minor version: 0
7 | major version: 52
8 | flags: ACC_PUBLIC, ACC_SUPER
9 | Constant pool:
10 | #1 = Class #2 // safepoint/hang/WhenWillItExitInt2
11 | #2 = Utf8 safepoint/hang/WhenWillItExitInt2
12 | #3 = Class #4 // java/lang/Object
13 | #4 = Utf8 java/lang/Object
14 | #5 = Utf8
15 | #6 = Utf8 ()V
16 | #7 = Utf8 Code
17 | #8 = Methodref #3.#9 // java/lang/Object."":()V
18 | #9 = NameAndType #5:#6 // "":()V
19 | #10 = Utf8 LineNumberTable
20 | #11 = Utf8 LocalVariableTable
21 | #12 = Utf8 this
22 | #13 = Utf8 Lsafepoint/hang/WhenWillItExitInt2;
23 | #14 = Utf8 main
24 | #15 = Utf8 ([Ljava/lang/String;)V
25 | #16 = Utf8 Exceptions
26 | #17 = Class #18 // java/lang/InterruptedException
27 | #18 = Utf8 java/lang/InterruptedException
28 | #19 = Class #20 // java/lang/Thread
29 | #20 = Utf8 java/lang/Thread
30 | #21 = NameAndType #22:#23 // run:()Ljava/lang/Runnable;
31 | #22 = Utf8 run
32 | #23 = Utf8 ()Ljava/lang/Runnable;
33 | #24 = InvokeDynamic #0:#21 // #0:run:()Ljava/lang/Runnable;
34 | #25 = Methodref #19.#26 // java/lang/Thread."":(Ljava/lang/Runnable;)V
35 | #26 = NameAndType #5:#27 // "":(Ljava/lang/Runnable;)V
36 | #27 = Utf8 (Ljava/lang/Runnable;)V
37 | #28 = Methodref #19.#29 // java/lang/Thread.setDaemon:(Z)V
38 | #29 = NameAndType #30:#31 // setDaemon:(Z)V
39 | #30 = Utf8 setDaemon
40 | #31 = Utf8 (Z)V
41 | #32 = Methodref #19.#33 // java/lang/Thread.start:()V
42 | #33 = NameAndType #34:#6 // start:()V
43 | #34 = Utf8 start
44 | #35 = Long 5000l
45 | #37 = Methodref #19.#38 // java/lang/Thread.sleep:(J)V
46 | #38 = NameAndType #39:#40 // sleep:(J)V
47 | #39 = Utf8 sleep
48 | #40 = Utf8 (J)V
49 | #41 = Utf8 argc
50 | #42 = Utf8 [Ljava/lang/String;
51 | #43 = Utf8 t
52 | #44 = Utf8 Ljava/lang/Thread;
53 | #45 = Utf8 countOdds
54 | #46 = Utf8 (I)J
55 | #47 = Utf8 limit
56 | #48 = Utf8 I
57 | #49 = Utf8 l
58 | #50 = Utf8 J
59 | #51 = Utf8 i
60 | #52 = Utf8 j
61 | #53 = Utf8 StackMapTable
62 | #54 = Utf8 lambda$0
63 | #55 = Integer 2147483647
64 | #56 = Methodref #1.#57 // safepoint/hang/WhenWillItExitInt2.countOdds:(I)J
65 | #57 = NameAndType #45:#46 // countOdds:(I)J
66 | #58 = Fieldref #59.#61 // java/lang/System.out:Ljava/io/PrintStream;
67 | #59 = Class #60 // java/lang/System
68 | #60 = Utf8 java/lang/System
69 | #61 = NameAndType #62:#63 // out:Ljava/io/PrintStream;
70 | #62 = Utf8 out
71 | #63 = Utf8 Ljava/io/PrintStream;
72 | #64 = Class #65 // java/lang/StringBuilder
73 | #65 = Utf8 java/lang/StringBuilder
74 | #66 = String #67 // How Odd:
75 | #67 = Utf8 How Odd:
76 | #68 = Methodref #64.#69 // java/lang/StringBuilder."":(Ljava/lang/String;)V
77 | #69 = NameAndType #5:#70 // "":(Ljava/lang/String;)V
78 | #70 = Utf8 (Ljava/lang/String;)V
79 | #71 = Methodref #64.#72 // java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
80 | #72 = NameAndType #73:#74 // append:(J)Ljava/lang/StringBuilder;
81 | #73 = Utf8 append
82 | #74 = Utf8 (J)Ljava/lang/StringBuilder;
83 | #75 = Methodref #64.#76 // java/lang/StringBuilder.toString:()Ljava/lang/String;
84 | #76 = NameAndType #77:#78 // toString:()Ljava/lang/String;
85 | #77 = Utf8 toString
86 | #78 = Utf8 ()Ljava/lang/String;
87 | #79 = Methodref #80.#82 // java/io/PrintStream.println:(Ljava/lang/String;)V
88 | #80 = Class #81 // java/io/PrintStream
89 | #81 = Utf8 java/io/PrintStream
90 | #82 = NameAndType #83:#70 // println:(Ljava/lang/String;)V
91 | #83 = Utf8 println
92 | #84 = Utf8 SourceFile
93 | #85 = Utf8 WhenWillItExitInt2.java
94 | #86 = Utf8 BootstrapMethods
95 | #87 = Methodref #88.#90 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
96 | #88 = Class #89 // java/lang/invoke/LambdaMetafactory
97 | #89 = Utf8 java/lang/invoke/LambdaMetafactory
98 | #90 = NameAndType #91:#92 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
99 | #91 = Utf8 metafactory
100 | #92 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
101 | #93 = MethodHandle #6:#87 // invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
102 | #94 = MethodType #6 // ()V
103 | #95 = Methodref #1.#96 // safepoint/hang/WhenWillItExitInt2.lambda$0:()V
104 | #96 = NameAndType #54:#6 // lambda$0:()V
105 | #97 = MethodHandle #6:#95 // invokestatic safepoint/hang/WhenWillItExitInt2.lambda$0:()V
106 | #98 = MethodType #6 // ()V
107 | #99 = Utf8 InnerClasses
108 | #100 = Class #101 // java/lang/invoke/MethodHandles$Lookup
109 | #101 = Utf8 java/lang/invoke/MethodHandles$Lookup
110 | #102 = Class #103 // java/lang/invoke/MethodHandles
111 | #103 = Utf8 java/lang/invoke/MethodHandles
112 | #104 = Utf8 Lookup
113 | {
114 | public safepoint.hang.WhenWillItExitInt2();
115 | descriptor: ()V
116 | flags: ACC_PUBLIC
117 | Code:
118 | stack=1, locals=1, args_size=1
119 | 0: aload_0
120 | 1: invokespecial #8 // Method java/lang/Object."":()V
121 | 4: return
122 | LineNumberTable:
123 | line 2: 0
124 | LocalVariableTable:
125 | Start Length Slot Name Signature
126 | 0 5 0 this Lsafepoint/hang/WhenWillItExitInt2;
127 |
128 | public static void main(java.lang.String[]) throws java.lang.InterruptedException;
129 | descriptor: ([Ljava/lang/String;)V
130 | flags: ACC_PUBLIC, ACC_STATIC
131 | Exceptions:
132 | throws java.lang.InterruptedException
133 | Code:
134 | stack=3, locals=2, args_size=1
135 | 0: new #19 // class java/lang/Thread
136 | 3: dup
137 | 4: invokedynamic #24, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;
138 | 9: invokespecial #25 // Method java/lang/Thread."":(Ljava/lang/Runnable;)V
139 | 12: astore_1
140 | 13: aload_1
141 | 14: iconst_1
142 | 15: invokevirtual #28 // Method java/lang/Thread.setDaemon:(Z)V
143 | 18: aload_1
144 | 19: invokevirtual #32 // Method java/lang/Thread.start:()V
145 | 22: ldc2_w #35 // long 5000l
146 | 25: invokestatic #37 // Method java/lang/Thread.sleep:(J)V
147 | 28: return
148 | LineNumberTable:
149 | line 4: 0
150 | line 8: 13
151 | line 9: 18
152 | line 10: 22
153 | line 11: 28
154 | LocalVariableTable:
155 | Start Length Slot Name Signature
156 | 0 29 0 argc [Ljava/lang/String;
157 | 13 16 1 t Ljava/lang/Thread;
158 |
159 | private static long countOdds(int);
160 | descriptor: (I)J
161 | flags: ACC_PRIVATE, ACC_STATIC
162 | Code:
163 | stack=4, locals=5, args_size=1
164 | 0: lconst_0
165 | 1: lstore_1
166 | 2: iconst_0
167 | 3: istore_3
168 | 4: goto 37
169 | 7: iconst_0
170 | 8: istore 4
171 | 10: goto 28
172 | 13: iload 4
173 | 15: iconst_1
174 | 16: iand
175 | 17: iconst_1
176 | 18: if_icmpne 25
177 | 21: lload_1
178 | 22: lconst_1
179 | 23: ladd
180 | 24: lstore_1
181 | 25: iinc 4, 1
182 | 28: iload 4
183 | 30: iload_0
184 | 31: if_icmplt 13
185 | 34: iinc 3, 1
186 | 37: iload_3
187 | 38: iload_0
188 | 39: if_icmplt 7
189 | 42: lload_1
190 | 43: lreturn
191 | LineNumberTable:
192 | line 14: 0
193 | line 15: 2
194 | line 16: 7
195 | line 17: 13
196 | line 18: 21
197 | line 16: 25
198 | line 15: 34
199 | line 21: 42
200 | LocalVariableTable:
201 | Start Length Slot Name Signature
202 | 0 44 0 limit I
203 | 2 42 1 l J
204 | 4 38 3 i I
205 | 10 24 4 j I
206 | StackMapTable: number_of_entries = 5
207 | frame_type = 253 /* append */
208 | offset_delta = 7
209 | locals = [ long, int ]
210 | frame_type = 252 /* append */
211 | offset_delta = 5
212 | locals = [ int ]
213 | frame_type = 11 /* same */
214 | frame_type = 2 /* same */
215 | frame_type = 250 /* chop */
216 | offset_delta = 8
217 |
218 | private static void lambda$0();
219 | descriptor: ()V
220 | flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
221 | Code:
222 | stack=4, locals=2, args_size=0
223 | 0: ldc #55 // int 2147483647
224 | 2: invokestatic #56 // Method countOdds:(I)J
225 | 5: lstore_0
226 | 6: getstatic #58 // Field java/lang/System.out:Ljava/io/PrintStream;
227 | 9: new #64 // class java/lang/StringBuilder
228 | 12: dup
229 | 13: ldc #66 // String How Odd:
230 | 15: invokespecial #68 // Method java/lang/StringBuilder."":(Ljava/lang/String;)V
231 | 18: lload_0
232 | 19: invokevirtual #71 // Method java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
233 | 22: invokevirtual #75 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
234 | 25: invokevirtual #79 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
235 | 28: return
236 | LineNumberTable:
237 | line 5: 0
238 | line 6: 6
239 | line 7: 28
240 | LocalVariableTable:
241 | Start Length Slot Name Signature
242 | 6 22 0 l J
243 | }
244 | SourceFile: "WhenWillItExitInt2.java"
245 | BootstrapMethods:
246 | 0: #93 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
247 | Method arguments:
248 | #94 ()V
249 | #97 invokestatic safepoint/hang/WhenWillItExitInt2.lambda$0:()V
250 | #98 ()V
251 | InnerClasses:
252 | public static final #104= #100 of #102; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
253 |
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/eclipse/safepoint/hang/WhenWillItExitInt2.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitsanw/safepoint-experiments/a828993eda77e10b8115fb76da835098e39a34fd/WhenWillItExitInt-bytecode-comparison/eclipse/safepoint/hang/WhenWillItExitInt2.class
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/javac/safepoint/hang/WhenWillItExitInt.bytecode:
--------------------------------------------------------------------------------
1 | Classfile /home/yak/git/safepoint-experiments/WhenWillItExitInt-bytecode-comparison/WhenWillItExitInt.javac.class
2 | Last modified 23 Jan 2016; size 1800 bytes
3 | MD5 checksum e0a53c3191f8e556fa322a4bd09306c4
4 | Compiled from "WhenWillItExitInt.java"
5 | public class safepoint.hang.WhenWillItExitInt
6 | minor version: 0
7 | major version: 52
8 | flags: ACC_PUBLIC, ACC_SUPER
9 | Constant pool:
10 | #1 = Methodref #21.#46 // java/lang/Object."":()V
11 | #2 = Class #47 // java/lang/Thread
12 | #3 = InvokeDynamic #0:#52 // #0:run:()Ljava/lang/Runnable;
13 | #4 = Methodref #2.#53 // java/lang/Thread."":(Ljava/lang/Runnable;)V
14 | #5 = Methodref #2.#54 // java/lang/Thread.setDaemon:(Z)V
15 | #6 = Methodref #2.#55 // java/lang/Thread.start:()V
16 | #7 = Long 5000l
17 | #9 = Methodref #2.#56 // java/lang/Thread.sleep:(J)V
18 | #10 = Class #57 // java/lang/Integer
19 | #11 = Integer 2147483647
20 | #12 = Fieldref #58.#59 // java/lang/System.out:Ljava/io/PrintStream;
21 | #13 = Class #60 // java/lang/StringBuilder
22 | #14 = Methodref #13.#46 // java/lang/StringBuilder."":()V
23 | #15 = String #61 // How Odd:
24 | #16 = Methodref #13.#62 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
25 | #17 = Methodref #13.#63 // java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
26 | #18 = Methodref #13.#64 // java/lang/StringBuilder.toString:()Ljava/lang/String;
27 | #19 = Methodref #65.#66 // java/io/PrintStream.println:(Ljava/lang/String;)V
28 | #20 = Class #67 // safepoint/hang/WhenWillItExitInt
29 | #21 = Class #68 // java/lang/Object
30 | #22 = Utf8
31 | #23 = Utf8 ()V
32 | #24 = Utf8 Code
33 | #25 = Utf8 LineNumberTable
34 | #26 = Utf8 LocalVariableTable
35 | #27 = Utf8 this
36 | #28 = Utf8 Lsafepoint/hang/WhenWillItExitInt;
37 | #29 = Utf8 main
38 | #30 = Utf8 ([Ljava/lang/String;)V
39 | #31 = Utf8 argc
40 | #32 = Utf8 [Ljava/lang/String;
41 | #33 = Utf8 t
42 | #34 = Utf8 Ljava/lang/Thread;
43 | #35 = Utf8 Exceptions
44 | #36 = Class #69 // java/lang/InterruptedException
45 | #37 = Utf8 lambda$main$4
46 | #38 = Utf8 j
47 | #39 = Utf8 I
48 | #40 = Utf8 i
49 | #41 = Utf8 l
50 | #42 = Utf8 J
51 | #43 = Utf8 StackMapTable
52 | #44 = Utf8 SourceFile
53 | #45 = Utf8 WhenWillItExitInt.java
54 | #46 = NameAndType #22:#23 // "":()V
55 | #47 = Utf8 java/lang/Thread
56 | #48 = Utf8 BootstrapMethods
57 | #49 = MethodHandle #6:#70 // invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
58 | #50 = MethodType #23 // ()V
59 | #51 = MethodHandle #6:#71 // invokestatic safepoint/hang/WhenWillItExitInt.lambda$main$4:()V
60 | #52 = NameAndType #72:#73 // run:()Ljava/lang/Runnable;
61 | #53 = NameAndType #22:#74 // "":(Ljava/lang/Runnable;)V
62 | #54 = NameAndType #75:#76 // setDaemon:(Z)V
63 | #55 = NameAndType #77:#23 // start:()V
64 | #56 = NameAndType #78:#79 // sleep:(J)V
65 | #57 = Utf8 java/lang/Integer
66 | #58 = Class #80 // java/lang/System
67 | #59 = NameAndType #81:#82 // out:Ljava/io/PrintStream;
68 | #60 = Utf8 java/lang/StringBuilder
69 | #61 = Utf8 How Odd:
70 | #62 = NameAndType #83:#84 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
71 | #63 = NameAndType #83:#85 // append:(J)Ljava/lang/StringBuilder;
72 | #64 = NameAndType #86:#87 // toString:()Ljava/lang/String;
73 | #65 = Class #88 // java/io/PrintStream
74 | #66 = NameAndType #89:#90 // println:(Ljava/lang/String;)V
75 | #67 = Utf8 safepoint/hang/WhenWillItExitInt
76 | #68 = Utf8 java/lang/Object
77 | #69 = Utf8 java/lang/InterruptedException
78 | #70 = Methodref #91.#92 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
79 | #71 = Methodref #20.#93 // safepoint/hang/WhenWillItExitInt.lambda$main$4:()V
80 | #72 = Utf8 run
81 | #73 = Utf8 ()Ljava/lang/Runnable;
82 | #74 = Utf8 (Ljava/lang/Runnable;)V
83 | #75 = Utf8 setDaemon
84 | #76 = Utf8 (Z)V
85 | #77 = Utf8 start
86 | #78 = Utf8 sleep
87 | #79 = Utf8 (J)V
88 | #80 = Utf8 java/lang/System
89 | #81 = Utf8 out
90 | #82 = Utf8 Ljava/io/PrintStream;
91 | #83 = Utf8 append
92 | #84 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
93 | #85 = Utf8 (J)Ljava/lang/StringBuilder;
94 | #86 = Utf8 toString
95 | #87 = Utf8 ()Ljava/lang/String;
96 | #88 = Utf8 java/io/PrintStream
97 | #89 = Utf8 println
98 | #90 = Utf8 (Ljava/lang/String;)V
99 | #91 = Class #94 // java/lang/invoke/LambdaMetafactory
100 | #92 = NameAndType #95:#99 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
101 | #93 = NameAndType #37:#23 // lambda$main$4:()V
102 | #94 = Utf8 java/lang/invoke/LambdaMetafactory
103 | #95 = Utf8 metafactory
104 | #96 = Class #101 // java/lang/invoke/MethodHandles$Lookup
105 | #97 = Utf8 Lookup
106 | #98 = Utf8 InnerClasses
107 | #99 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
108 | #100 = Class #102 // java/lang/invoke/MethodHandles
109 | #101 = Utf8 java/lang/invoke/MethodHandles$Lookup
110 | #102 = Utf8 java/lang/invoke/MethodHandles
111 | {
112 | public safepoint.hang.WhenWillItExitInt();
113 | descriptor: ()V
114 | flags: ACC_PUBLIC
115 | Code:
116 | stack=1, locals=1, args_size=1
117 | 0: aload_0
118 | 1: invokespecial #1 // Method java/lang/Object."":()V
119 | 4: return
120 | LineNumberTable:
121 | line 2: 0
122 | LocalVariableTable:
123 | Start Length Slot Name Signature
124 | 0 5 0 this Lsafepoint/hang/WhenWillItExitInt;
125 |
126 | public static void main(java.lang.String[]) throws java.lang.InterruptedException;
127 | descriptor: ([Ljava/lang/String;)V
128 | flags: ACC_PUBLIC, ACC_STATIC
129 | Code:
130 | stack=3, locals=2, args_size=1
131 | 0: new #2 // class java/lang/Thread
132 | 3: dup
133 | 4: invokedynamic #3, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;
134 | 9: invokespecial #4 // Method java/lang/Thread."":(Ljava/lang/Runnable;)V
135 | 12: astore_1
136 | 13: aload_1
137 | 14: iconst_1
138 | 15: invokevirtual #5 // Method java/lang/Thread.setDaemon:(Z)V
139 | 18: aload_1
140 | 19: invokevirtual #6 // Method java/lang/Thread.start:()V
141 | 22: ldc2_w #7 // long 5000l
142 | 25: invokestatic #9 // Method java/lang/Thread.sleep:(J)V
143 | 28: return
144 | LineNumberTable:
145 | line 4: 0
146 | line 14: 13
147 | line 15: 18
148 | line 16: 22
149 | line 17: 28
150 | LocalVariableTable:
151 | Start Length Slot Name Signature
152 | 0 29 0 argc [Ljava/lang/String;
153 | 13 16 1 t Ljava/lang/Thread;
154 | Exceptions:
155 | throws java.lang.InterruptedException
156 |
157 | private static void lambda$main$4();
158 | descriptor: ()V
159 | flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
160 | Code:
161 | stack=4, locals=4, args_size=0
162 | 0: lconst_0
163 | 1: lstore_0
164 | 2: iconst_0
165 | 3: istore_2
166 | 4: iload_2
167 | 5: ldc #11 // int 2147483647
168 | 7: if_icmpge 41
169 | 10: iconst_0
170 | 11: istore_3
171 | 12: iload_3
172 | 13: ldc #11 // int 2147483647
173 | 15: if_icmpge 35
174 | 18: iload_3
175 | 19: iconst_1
176 | 20: iand
177 | 21: iconst_1
178 | 22: if_icmpne 29
179 | 25: lload_0
180 | 26: lconst_1
181 | 27: ladd
182 | 28: lstore_0
183 | 29: iinc 3, 1
184 | 32: goto 12
185 | 35: iinc 2, 1
186 | 38: goto 4
187 | 41: getstatic #12 // Field java/lang/System.out:Ljava/io/PrintStream;
188 | 44: new #13 // class java/lang/StringBuilder
189 | 47: dup
190 | 48: invokespecial #14 // Method java/lang/StringBuilder."":()V
191 | 51: ldc #15 // String How Odd:
192 | 53: invokevirtual #16 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
193 | 56: lload_0
194 | 57: invokevirtual #17 // Method java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
195 | 60: invokevirtual #18 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
196 | 63: invokevirtual #19 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
197 | 66: return
198 | LineNumberTable:
199 | line 5: 0
200 | line 6: 2
201 | line 7: 10
202 | line 8: 18
203 | line 9: 25
204 | line 7: 29
205 | line 6: 35
206 | line 12: 41
207 | line 13: 66
208 | LocalVariableTable:
209 | Start Length Slot Name Signature
210 | 12 23 3 j I
211 | 4 37 2 i I
212 | 2 65 0 l J
213 | StackMapTable: number_of_entries = 5
214 | frame_type = 253 /* append */
215 | offset_delta = 4
216 | locals = [ long, int ]
217 | frame_type = 252 /* append */
218 | offset_delta = 7
219 | locals = [ int ]
220 | frame_type = 16 /* same */
221 | frame_type = 250 /* chop */
222 | offset_delta = 5
223 | frame_type = 250 /* chop */
224 | offset_delta = 5
225 | }
226 | SourceFile: "WhenWillItExitInt.java"
227 | InnerClasses:
228 | public static final #97= #96 of #100; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
229 | BootstrapMethods:
230 | 0: #49 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
231 | Method arguments:
232 | #50 ()V
233 | #51 invokestatic safepoint/hang/WhenWillItExitInt.lambda$main$4:()V
234 | #50 ()V
235 |
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/javac/safepoint/hang/WhenWillItExitInt.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitsanw/safepoint-experiments/a828993eda77e10b8115fb76da835098e39a34fd/WhenWillItExitInt-bytecode-comparison/javac/safepoint/hang/WhenWillItExitInt.class
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/javac/safepoint/hang/WhenWillItExitInt1.bytecode:
--------------------------------------------------------------------------------
1 | Classfile /home/yak/git/safepoint-experiments/WhenWillItExitInt-bytecode-comparison/WhenWillItExitInt1.javac.class
2 | Last modified 23 Jan 2016; size 1897 bytes
3 | MD5 checksum a484b287c5a478f6f1048c257d83916b
4 | Compiled from "WhenWillItExitInt1.java"
5 | public class safepoint.hang.WhenWillItExitInt1
6 | minor version: 0
7 | major version: 52
8 | flags: ACC_PUBLIC, ACC_SUPER
9 | Constant pool:
10 | #1 = Methodref #22.#49 // java/lang/Object."":()V
11 | #2 = Class #50 // java/lang/Thread
12 | #3 = InvokeDynamic #0:#55 // #0:run:()Ljava/lang/Runnable;
13 | #4 = Methodref #2.#56 // java/lang/Thread."":(Ljava/lang/Runnable;)V
14 | #5 = Methodref #2.#57 // java/lang/Thread.setDaemon:(Z)V
15 | #6 = Methodref #2.#58 // java/lang/Thread.start:()V
16 | #7 = Long 5000l
17 | #9 = Methodref #2.#59 // java/lang/Thread.sleep:(J)V
18 | #10 = Class #60 // java/lang/Integer
19 | #11 = Integer 2147483647
20 | #12 = Methodref #21.#61 // safepoint/hang/WhenWillItExitInt1.countOdds:()J
21 | #13 = Fieldref #62.#63 // java/lang/System.out:Ljava/io/PrintStream;
22 | #14 = Class #64 // java/lang/StringBuilder
23 | #15 = Methodref #14.#49 // java/lang/StringBuilder."":()V
24 | #16 = String #65 // How Odd:
25 | #17 = Methodref #14.#66 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
26 | #18 = Methodref #14.#67 // java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
27 | #19 = Methodref #14.#68 // java/lang/StringBuilder.toString:()Ljava/lang/String;
28 | #20 = Methodref #69.#70 // java/io/PrintStream.println:(Ljava/lang/String;)V
29 | #21 = Class #71 // safepoint/hang/WhenWillItExitInt1
30 | #22 = Class #72 // java/lang/Object
31 | #23 = Utf8
32 | #24 = Utf8 ()V
33 | #25 = Utf8 Code
34 | #26 = Utf8 LineNumberTable
35 | #27 = Utf8 LocalVariableTable
36 | #28 = Utf8 this
37 | #29 = Utf8 Lsafepoint/hang/WhenWillItExitInt1;
38 | #30 = Utf8 main
39 | #31 = Utf8 ([Ljava/lang/String;)V
40 | #32 = Utf8 argc
41 | #33 = Utf8 [Ljava/lang/String;
42 | #34 = Utf8 t
43 | #35 = Utf8 Ljava/lang/Thread;
44 | #36 = Utf8 Exceptions
45 | #37 = Class #73 // java/lang/InterruptedException
46 | #38 = Utf8 countOdds
47 | #39 = Utf8 ()J
48 | #40 = Utf8 j
49 | #41 = Utf8 I
50 | #42 = Utf8 i
51 | #43 = Utf8 l
52 | #44 = Utf8 J
53 | #45 = Utf8 StackMapTable
54 | #46 = Utf8 lambda$main$0
55 | #47 = Utf8 SourceFile
56 | #48 = Utf8 WhenWillItExitInt1.java
57 | #49 = NameAndType #23:#24 // "":()V
58 | #50 = Utf8 java/lang/Thread
59 | #51 = Utf8 BootstrapMethods
60 | #52 = MethodHandle #6:#74 // invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
61 | #53 = MethodType #24 // ()V
62 | #54 = MethodHandle #6:#75 // invokestatic safepoint/hang/WhenWillItExitInt1.lambda$main$0:()V
63 | #55 = NameAndType #76:#77 // run:()Ljava/lang/Runnable;
64 | #56 = NameAndType #23:#78 // "":(Ljava/lang/Runnable;)V
65 | #57 = NameAndType #79:#80 // setDaemon:(Z)V
66 | #58 = NameAndType #81:#24 // start:()V
67 | #59 = NameAndType #82:#83 // sleep:(J)V
68 | #60 = Utf8 java/lang/Integer
69 | #61 = NameAndType #38:#39 // countOdds:()J
70 | #62 = Class #84 // java/lang/System
71 | #63 = NameAndType #85:#86 // out:Ljava/io/PrintStream;
72 | #64 = Utf8 java/lang/StringBuilder
73 | #65 = Utf8 How Odd:
74 | #66 = NameAndType #87:#88 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
75 | #67 = NameAndType #87:#89 // append:(J)Ljava/lang/StringBuilder;
76 | #68 = NameAndType #90:#91 // toString:()Ljava/lang/String;
77 | #69 = Class #92 // java/io/PrintStream
78 | #70 = NameAndType #93:#94 // println:(Ljava/lang/String;)V
79 | #71 = Utf8 safepoint/hang/WhenWillItExitInt1
80 | #72 = Utf8 java/lang/Object
81 | #73 = Utf8 java/lang/InterruptedException
82 | #74 = Methodref #95.#96 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
83 | #75 = Methodref #21.#97 // safepoint/hang/WhenWillItExitInt1.lambda$main$0:()V
84 | #76 = Utf8 run
85 | #77 = Utf8 ()Ljava/lang/Runnable;
86 | #78 = Utf8 (Ljava/lang/Runnable;)V
87 | #79 = Utf8 setDaemon
88 | #80 = Utf8 (Z)V
89 | #81 = Utf8 start
90 | #82 = Utf8 sleep
91 | #83 = Utf8 (J)V
92 | #84 = Utf8 java/lang/System
93 | #85 = Utf8 out
94 | #86 = Utf8 Ljava/io/PrintStream;
95 | #87 = Utf8 append
96 | #88 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
97 | #89 = Utf8 (J)Ljava/lang/StringBuilder;
98 | #90 = Utf8 toString
99 | #91 = Utf8 ()Ljava/lang/String;
100 | #92 = Utf8 java/io/PrintStream
101 | #93 = Utf8 println
102 | #94 = Utf8 (Ljava/lang/String;)V
103 | #95 = Class #98 // java/lang/invoke/LambdaMetafactory
104 | #96 = NameAndType #99:#103 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
105 | #97 = NameAndType #46:#24 // lambda$main$0:()V
106 | #98 = Utf8 java/lang/invoke/LambdaMetafactory
107 | #99 = Utf8 metafactory
108 | #100 = Class #105 // java/lang/invoke/MethodHandles$Lookup
109 | #101 = Utf8 Lookup
110 | #102 = Utf8 InnerClasses
111 | #103 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
112 | #104 = Class #106 // java/lang/invoke/MethodHandles
113 | #105 = Utf8 java/lang/invoke/MethodHandles$Lookup
114 | #106 = Utf8 java/lang/invoke/MethodHandles
115 | {
116 | public safepoint.hang.WhenWillItExitInt1();
117 | descriptor: ()V
118 | flags: ACC_PUBLIC
119 | Code:
120 | stack=1, locals=1, args_size=1
121 | 0: aload_0
122 | 1: invokespecial #1 // Method java/lang/Object."":()V
123 | 4: return
124 | LineNumberTable:
125 | line 2: 0
126 | LocalVariableTable:
127 | Start Length Slot Name Signature
128 | 0 5 0 this Lsafepoint/hang/WhenWillItExitInt1;
129 |
130 | public static void main(java.lang.String[]) throws java.lang.InterruptedException;
131 | descriptor: ([Ljava/lang/String;)V
132 | flags: ACC_PUBLIC, ACC_STATIC
133 | Code:
134 | stack=3, locals=2, args_size=1
135 | 0: new #2 // class java/lang/Thread
136 | 3: dup
137 | 4: invokedynamic #3, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;
138 | 9: invokespecial #4 // Method java/lang/Thread."":(Ljava/lang/Runnable;)V
139 | 12: astore_1
140 | 13: aload_1
141 | 14: iconst_1
142 | 15: invokevirtual #5 // Method java/lang/Thread.setDaemon:(Z)V
143 | 18: aload_1
144 | 19: invokevirtual #6 // Method java/lang/Thread.start:()V
145 | 22: ldc2_w #7 // long 5000l
146 | 25: invokestatic #9 // Method java/lang/Thread.sleep:(J)V
147 | 28: return
148 | LineNumberTable:
149 | line 4: 0
150 | line 8: 13
151 | line 9: 18
152 | line 10: 22
153 | line 11: 28
154 | LocalVariableTable:
155 | Start Length Slot Name Signature
156 | 0 29 0 argc [Ljava/lang/String;
157 | 13 16 1 t Ljava/lang/Thread;
158 | Exceptions:
159 | throws java.lang.InterruptedException
160 |
161 | private static long countOdds();
162 | descriptor: ()J
163 | flags: ACC_PRIVATE, ACC_STATIC
164 | Code:
165 | stack=4, locals=4, args_size=0
166 | 0: lconst_0
167 | 1: lstore_0
168 | 2: iconst_0
169 | 3: istore_2
170 | 4: iload_2
171 | 5: ldc #11 // int 2147483647
172 | 7: if_icmpge 41
173 | 10: iconst_0
174 | 11: istore_3
175 | 12: iload_3
176 | 13: ldc #11 // int 2147483647
177 | 15: if_icmpge 35
178 | 18: iload_3
179 | 19: iconst_1
180 | 20: iand
181 | 21: iconst_1
182 | 22: if_icmpne 29
183 | 25: lload_0
184 | 26: lconst_1
185 | 27: ladd
186 | 28: lstore_0
187 | 29: iinc 3, 1
188 | 32: goto 12
189 | 35: iinc 2, 1
190 | 38: goto 4
191 | 41: lload_0
192 | 42: lreturn
193 | LineNumberTable:
194 | line 14: 0
195 | line 15: 2
196 | line 16: 10
197 | line 17: 18
198 | line 18: 25
199 | line 16: 29
200 | line 15: 35
201 | line 21: 41
202 | LocalVariableTable:
203 | Start Length Slot Name Signature
204 | 12 23 3 j I
205 | 4 37 2 i I
206 | 2 41 0 l J
207 | StackMapTable: number_of_entries = 5
208 | frame_type = 253 /* append */
209 | offset_delta = 4
210 | locals = [ long, int ]
211 | frame_type = 252 /* append */
212 | offset_delta = 7
213 | locals = [ int ]
214 | frame_type = 16 /* same */
215 | frame_type = 250 /* chop */
216 | offset_delta = 5
217 | frame_type = 250 /* chop */
218 | offset_delta = 5
219 |
220 | private static void lambda$main$0();
221 | descriptor: ()V
222 | flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
223 | Code:
224 | stack=4, locals=2, args_size=0
225 | 0: invokestatic #12 // Method countOdds:()J
226 | 3: lstore_0
227 | 4: getstatic #13 // Field java/lang/System.out:Ljava/io/PrintStream;
228 | 7: new #14 // class java/lang/StringBuilder
229 | 10: dup
230 | 11: invokespecial #15 // Method java/lang/StringBuilder."":()V
231 | 14: ldc #16 // String How Odd:
232 | 16: invokevirtual #17 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
233 | 19: lload_0
234 | 20: invokevirtual #18 // Method java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
235 | 23: invokevirtual #19 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
236 | 26: invokevirtual #20 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
237 | 29: return
238 | LineNumberTable:
239 | line 5: 0
240 | line 6: 4
241 | line 7: 29
242 | LocalVariableTable:
243 | Start Length Slot Name Signature
244 | 4 26 0 l J
245 | }
246 | SourceFile: "WhenWillItExitInt1.java"
247 | InnerClasses:
248 | public static final #101= #100 of #104; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
249 | BootstrapMethods:
250 | 0: #52 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
251 | Method arguments:
252 | #53 ()V
253 | #54 invokestatic safepoint/hang/WhenWillItExitInt1.lambda$main$0:()V
254 | #53 ()V
255 |
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/javac/safepoint/hang/WhenWillItExitInt1.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitsanw/safepoint-experiments/a828993eda77e10b8115fb76da835098e39a34fd/WhenWillItExitInt-bytecode-comparison/javac/safepoint/hang/WhenWillItExitInt1.class
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/javac/safepoint/hang/WhenWillItExitInt2.bytecode:
--------------------------------------------------------------------------------
1 | Classfile /home/yak/git/safepoint-experiments/WhenWillItExitInt-bytecode-comparison/WhenWillItExitInt2.javac.class
2 | Last modified 23 Jan 2016; size 1919 bytes
3 | MD5 checksum 076071691b0360fa90db4a0f63d55ec2
4 | Compiled from "WhenWillItExitInt2.java"
5 | public class safepoint.hang.WhenWillItExitInt2
6 | minor version: 0
7 | major version: 52
8 | flags: ACC_PUBLIC, ACC_SUPER
9 | Constant pool:
10 | #1 = Methodref #22.#50 // java/lang/Object."":()V
11 | #2 = Class #51 // java/lang/Thread
12 | #3 = InvokeDynamic #0:#56 // #0:run:()Ljava/lang/Runnable;
13 | #4 = Methodref #2.#57 // java/lang/Thread."":(Ljava/lang/Runnable;)V
14 | #5 = Methodref #2.#58 // java/lang/Thread.setDaemon:(Z)V
15 | #6 = Methodref #2.#59 // java/lang/Thread.start:()V
16 | #7 = Long 5000l
17 | #9 = Methodref #2.#60 // java/lang/Thread.sleep:(J)V
18 | #10 = Class #61 // java/lang/Integer
19 | #11 = Integer 2147483647
20 | #12 = Methodref #21.#62 // safepoint/hang/WhenWillItExitInt2.countOdds:(I)J
21 | #13 = Fieldref #63.#64 // java/lang/System.out:Ljava/io/PrintStream;
22 | #14 = Class #65 // java/lang/StringBuilder
23 | #15 = Methodref #14.#50 // java/lang/StringBuilder."":()V
24 | #16 = String #66 // How Odd:
25 | #17 = Methodref #14.#67 // java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
26 | #18 = Methodref #14.#68 // java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
27 | #19 = Methodref #14.#69 // java/lang/StringBuilder.toString:()Ljava/lang/String;
28 | #20 = Methodref #70.#71 // java/io/PrintStream.println:(Ljava/lang/String;)V
29 | #21 = Class #72 // safepoint/hang/WhenWillItExitInt2
30 | #22 = Class #73 // java/lang/Object
31 | #23 = Utf8
32 | #24 = Utf8 ()V
33 | #25 = Utf8 Code
34 | #26 = Utf8 LineNumberTable
35 | #27 = Utf8 LocalVariableTable
36 | #28 = Utf8 this
37 | #29 = Utf8 Lsafepoint/hang/WhenWillItExitInt2;
38 | #30 = Utf8 main
39 | #31 = Utf8 ([Ljava/lang/String;)V
40 | #32 = Utf8 argc
41 | #33 = Utf8 [Ljava/lang/String;
42 | #34 = Utf8 t
43 | #35 = Utf8 Ljava/lang/Thread;
44 | #36 = Utf8 Exceptions
45 | #37 = Class #74 // java/lang/InterruptedException
46 | #38 = Utf8 countOdds
47 | #39 = Utf8 (I)J
48 | #40 = Utf8 j
49 | #41 = Utf8 I
50 | #42 = Utf8 i
51 | #43 = Utf8 limit
52 | #44 = Utf8 l
53 | #45 = Utf8 J
54 | #46 = Utf8 StackMapTable
55 | #47 = Utf8 lambda$main$6
56 | #48 = Utf8 SourceFile
57 | #49 = Utf8 WhenWillItExitInt2.java
58 | #50 = NameAndType #23:#24 // "":()V
59 | #51 = Utf8 java/lang/Thread
60 | #52 = Utf8 BootstrapMethods
61 | #53 = MethodHandle #6:#75 // invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
62 | #54 = MethodType #24 // ()V
63 | #55 = MethodHandle #6:#76 // invokestatic safepoint/hang/WhenWillItExitInt2.lambda$main$6:()V
64 | #56 = NameAndType #77:#78 // run:()Ljava/lang/Runnable;
65 | #57 = NameAndType #23:#79 // "":(Ljava/lang/Runnable;)V
66 | #58 = NameAndType #80:#81 // setDaemon:(Z)V
67 | #59 = NameAndType #82:#24 // start:()V
68 | #60 = NameAndType #83:#84 // sleep:(J)V
69 | #61 = Utf8 java/lang/Integer
70 | #62 = NameAndType #38:#39 // countOdds:(I)J
71 | #63 = Class #85 // java/lang/System
72 | #64 = NameAndType #86:#87 // out:Ljava/io/PrintStream;
73 | #65 = Utf8 java/lang/StringBuilder
74 | #66 = Utf8 How Odd:
75 | #67 = NameAndType #88:#89 // append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
76 | #68 = NameAndType #88:#90 // append:(J)Ljava/lang/StringBuilder;
77 | #69 = NameAndType #91:#92 // toString:()Ljava/lang/String;
78 | #70 = Class #93 // java/io/PrintStream
79 | #71 = NameAndType #94:#95 // println:(Ljava/lang/String;)V
80 | #72 = Utf8 safepoint/hang/WhenWillItExitInt2
81 | #73 = Utf8 java/lang/Object
82 | #74 = Utf8 java/lang/InterruptedException
83 | #75 = Methodref #96.#97 // java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
84 | #76 = Methodref #21.#98 // safepoint/hang/WhenWillItExitInt2.lambda$main$6:()V
85 | #77 = Utf8 run
86 | #78 = Utf8 ()Ljava/lang/Runnable;
87 | #79 = Utf8 (Ljava/lang/Runnable;)V
88 | #80 = Utf8 setDaemon
89 | #81 = Utf8 (Z)V
90 | #82 = Utf8 start
91 | #83 = Utf8 sleep
92 | #84 = Utf8 (J)V
93 | #85 = Utf8 java/lang/System
94 | #86 = Utf8 out
95 | #87 = Utf8 Ljava/io/PrintStream;
96 | #88 = Utf8 append
97 | #89 = Utf8 (Ljava/lang/String;)Ljava/lang/StringBuilder;
98 | #90 = Utf8 (J)Ljava/lang/StringBuilder;
99 | #91 = Utf8 toString
100 | #92 = Utf8 ()Ljava/lang/String;
101 | #93 = Utf8 java/io/PrintStream
102 | #94 = Utf8 println
103 | #95 = Utf8 (Ljava/lang/String;)V
104 | #96 = Class #99 // java/lang/invoke/LambdaMetafactory
105 | #97 = NameAndType #100:#104 // metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
106 | #98 = NameAndType #47:#24 // lambda$main$6:()V
107 | #99 = Utf8 java/lang/invoke/LambdaMetafactory
108 | #100 = Utf8 metafactory
109 | #101 = Class #106 // java/lang/invoke/MethodHandles$Lookup
110 | #102 = Utf8 Lookup
111 | #103 = Utf8 InnerClasses
112 | #104 = Utf8 (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
113 | #105 = Class #107 // java/lang/invoke/MethodHandles
114 | #106 = Utf8 java/lang/invoke/MethodHandles$Lookup
115 | #107 = Utf8 java/lang/invoke/MethodHandles
116 | {
117 | public safepoint.hang.WhenWillItExitInt2();
118 | descriptor: ()V
119 | flags: ACC_PUBLIC
120 | Code:
121 | stack=1, locals=1, args_size=1
122 | 0: aload_0
123 | 1: invokespecial #1 // Method java/lang/Object."":()V
124 | 4: return
125 | LineNumberTable:
126 | line 2: 0
127 | LocalVariableTable:
128 | Start Length Slot Name Signature
129 | 0 5 0 this Lsafepoint/hang/WhenWillItExitInt2;
130 |
131 | public static void main(java.lang.String[]) throws java.lang.InterruptedException;
132 | descriptor: ([Ljava/lang/String;)V
133 | flags: ACC_PUBLIC, ACC_STATIC
134 | Code:
135 | stack=3, locals=2, args_size=1
136 | 0: new #2 // class java/lang/Thread
137 | 3: dup
138 | 4: invokedynamic #3, 0 // InvokeDynamic #0:run:()Ljava/lang/Runnable;
139 | 9: invokespecial #4 // Method java/lang/Thread."":(Ljava/lang/Runnable;)V
140 | 12: astore_1
141 | 13: aload_1
142 | 14: iconst_1
143 | 15: invokevirtual #5 // Method java/lang/Thread.setDaemon:(Z)V
144 | 18: aload_1
145 | 19: invokevirtual #6 // Method java/lang/Thread.start:()V
146 | 22: ldc2_w #7 // long 5000l
147 | 25: invokestatic #9 // Method java/lang/Thread.sleep:(J)V
148 | 28: return
149 | LineNumberTable:
150 | line 4: 0
151 | line 8: 13
152 | line 9: 18
153 | line 10: 22
154 | line 11: 28
155 | LocalVariableTable:
156 | Start Length Slot Name Signature
157 | 0 29 0 argc [Ljava/lang/String;
158 | 13 16 1 t Ljava/lang/Thread;
159 | Exceptions:
160 | throws java.lang.InterruptedException
161 |
162 | private static long countOdds(int);
163 | descriptor: (I)J
164 | flags: ACC_PRIVATE, ACC_STATIC
165 | Code:
166 | stack=4, locals=5, args_size=1
167 | 0: lconst_0
168 | 1: lstore_1
169 | 2: iconst_0
170 | 3: istore_3
171 | 4: iload_3
172 | 5: iload_0
173 | 6: if_icmpge 42
174 | 9: iconst_0
175 | 10: istore 4
176 | 12: iload 4
177 | 14: iload_0
178 | 15: if_icmpge 36
179 | 18: iload 4
180 | 20: iconst_1
181 | 21: iand
182 | 22: iconst_1
183 | 23: if_icmpne 30
184 | 26: lload_1
185 | 27: lconst_1
186 | 28: ladd
187 | 29: lstore_1
188 | 30: iinc 4, 1
189 | 33: goto 12
190 | 36: iinc 3, 1
191 | 39: goto 4
192 | 42: lload_1
193 | 43: lreturn
194 | LineNumberTable:
195 | line 14: 0
196 | line 15: 2
197 | line 16: 9
198 | line 17: 18
199 | line 18: 26
200 | line 16: 30
201 | line 15: 36
202 | line 21: 42
203 | LocalVariableTable:
204 | Start Length Slot Name Signature
205 | 12 24 4 j I
206 | 4 38 3 i I
207 | 0 44 0 limit I
208 | 2 42 1 l J
209 | StackMapTable: number_of_entries = 5
210 | frame_type = 253 /* append */
211 | offset_delta = 4
212 | locals = [ long, int ]
213 | frame_type = 252 /* append */
214 | offset_delta = 7
215 | locals = [ int ]
216 | frame_type = 17 /* same */
217 | frame_type = 250 /* chop */
218 | offset_delta = 5
219 | frame_type = 250 /* chop */
220 | offset_delta = 5
221 |
222 | private static void lambda$main$6();
223 | descriptor: ()V
224 | flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
225 | Code:
226 | stack=4, locals=2, args_size=0
227 | 0: ldc #11 // int 2147483647
228 | 2: invokestatic #12 // Method countOdds:(I)J
229 | 5: lstore_0
230 | 6: getstatic #13 // Field java/lang/System.out:Ljava/io/PrintStream;
231 | 9: new #14 // class java/lang/StringBuilder
232 | 12: dup
233 | 13: invokespecial #15 // Method java/lang/StringBuilder."":()V
234 | 16: ldc #16 // String How Odd:
235 | 18: invokevirtual #17 // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
236 | 21: lload_0
237 | 22: invokevirtual #18 // Method java/lang/StringBuilder.append:(J)Ljava/lang/StringBuilder;
238 | 25: invokevirtual #19 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
239 | 28: invokevirtual #20 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
240 | 31: return
241 | LineNumberTable:
242 | line 5: 0
243 | line 6: 6
244 | line 7: 31
245 | LocalVariableTable:
246 | Start Length Slot Name Signature
247 | 6 26 0 l J
248 | }
249 | SourceFile: "WhenWillItExitInt2.java"
250 | InnerClasses:
251 | public static final #102= #101 of #105; //Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
252 | BootstrapMethods:
253 | 0: #53 invokestatic java/lang/invoke/LambdaMetafactory.metafactory:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;
254 | Method arguments:
255 | #54 ()V
256 | #55 invokestatic safepoint/hang/WhenWillItExitInt2.lambda$main$6:()V
257 | #54 ()V
258 |
--------------------------------------------------------------------------------
/WhenWillItExitInt-bytecode-comparison/javac/safepoint/hang/WhenWillItExitInt2.class:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/nitsanw/safepoint-experiments/a828993eda77e10b8115fb76da835098e39a34fd/WhenWillItExitInt-bytecode-comparison/javac/safepoint/hang/WhenWillItExitInt2.class
--------------------------------------------------------------------------------
/pom.xml:
--------------------------------------------------------------------------------
1 |
3 | 4.0.0
4 |
5 | psy.lob.saw
6 | safepoints-experiments
7 | 1.0
8 | jar
9 |
10 | Safepoints Experiments
11 |
12 | 3.0
13 |
14 |
15 |
16 |
17 | org.openjdk.jmh
18 | jmh-core
19 | ${jmh.version}
20 |
21 |
22 | org.openjdk.jmh
23 | jmh-generator-annprocess
24 | ${jmh.version}
25 | provided
26 |
27 |
28 |
29 |
30 | UTF-8
31 | 1.11.3
32 | 1.6
33 | benchmarks
34 |
35 |
36 |
37 |
38 |
39 | org.apache.maven.plugins
40 | maven-compiler-plugin
41 | 3.1
42 |
43 | ${javac.target}
44 | ${javac.target}
45 | ${javac.target}
46 |
47 |
48 |
49 | org.apache.maven.plugins
50 | maven-shade-plugin
51 | 2.2
52 |
53 |
54 | package
55 |
56 | shade
57 |
58 |
59 | ${uberjar.name}
60 |
61 |
62 | org.openjdk.jmh.Main
63 |
64 |
65 |
66 |
67 |
71 | *:*
72 |
73 | META-INF/*.SF
74 | META-INF/*.DSA
75 | META-INF/*.RSA
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 | maven-clean-plugin
88 | 2.5
89 |
90 |
91 | maven-deploy-plugin
92 | 2.8.1
93 |
94 |
95 | maven-install-plugin
96 | 2.5.1
97 |
98 |
99 | maven-jar-plugin
100 | 2.4
101 |
102 |
103 | maven-javadoc-plugin
104 | 2.9.1
105 |
106 |
107 | maven-resources-plugin
108 | 2.6
109 |
110 |
111 | maven-site-plugin
112 | 3.3
113 |
114 |
115 | maven-source-plugin
116 | 2.2.1
117 |
118 |
119 | maven-surefire-plugin
120 | 2.17
121 |
122 |
123 |
124 |
125 |
126 |
127 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/fair/LoveAtATimeOfSafepoints.java:
--------------------------------------------------------------------------------
1 | package safepoint.fair;
2 |
3 | import java.util.concurrent.TimeUnit;
4 | import java.util.concurrent.locks.LockSupport;
5 |
6 | import org.openjdk.jmh.annotations.Benchmark;
7 | import org.openjdk.jmh.annotations.BenchmarkMode;
8 | import org.openjdk.jmh.annotations.Group;
9 | import org.openjdk.jmh.annotations.Mode;
10 | import org.openjdk.jmh.annotations.OutputTimeUnit;
11 | import org.openjdk.jmh.annotations.Param;
12 | import org.openjdk.jmh.annotations.Scope;
13 | import org.openjdk.jmh.annotations.Setup;
14 | import org.openjdk.jmh.annotations.State;
15 |
16 | @BenchmarkMode(Mode.AverageTime)
17 | @OutputTimeUnit(TimeUnit.NANOSECONDS)
18 | @State(Scope.Thread)
19 | public abstract class LoveAtATimeOfSafepoints {
20 | @Param("32768")
21 | int size;
22 | @Param("10")
23 | int k;
24 | @Param("100")
25 | int intervalMs;
26 |
27 | @Param({ "0" })
28 | int idleThreads;
29 | Thread[] pool;
30 |
31 | byte[] soggyBottoms;
32 |
33 | @Setup
34 | public final void bakeACake() {
35 | soggyBottoms = new byte[size];
36 | if (idleThreads != 0) {
37 | pool = new Thread[idleThreads];
38 | for (int i = 0; i < idleThreads; i++) {
39 | pool[i] = new Thread(new Runnable() {
40 |
41 | @Override
42 | public void run() {
43 |
44 | parkDeep(256);
45 | }
46 | });
47 | pool[i].setDaemon(true);
48 | pool[i].start();
49 | }
50 | }
51 | }
52 |
53 | static void parkDeep(int i) {
54 | if (i == 0) {
55 | LockSupport.park();
56 | }
57 | else {
58 | parkDeep(i - 1);
59 | }
60 | }
61 |
62 | @Benchmark
63 | @Group("run_together")
64 | public boolean contains1() {
65 | int needle = 1;
66 | byte[] haystack = soggyBottoms;
67 | return containsNeedle1(needle, haystack);
68 | }
69 |
70 | @Benchmark
71 | @Group("run_together")
72 | public boolean contains1ToK() {
73 | byte[] haystack = soggyBottoms;
74 | for (int needle = 1; needle <= k; needle++) {
75 | if (containsNeedle2(needle, haystack)) {
76 | return true;
77 | }
78 | }
79 | return false;
80 | }
81 |
82 | private static boolean containsNeedle1(int needle, byte[] haystack) {
83 | for (int i = 0; i < haystack.length - 3; i++) {
84 | if (((haystack[i] << 24) | (haystack[i + 1] << 16) | (haystack[i + 2] << 8)
85 | | haystack[i + 3]) == needle) {
86 | return true;
87 | }
88 | }
89 | return false;
90 | }
91 |
92 | private static boolean containsNeedle2(int needle, byte[] haystack) {
93 | for (int i = 0; i < haystack.length - 3; i++) {
94 | if (((haystack[i] << 24) | (haystack[i + 1] << 16) | (haystack[i + 2] << 8)
95 | | haystack[i + 3]) == needle) {
96 | return true;
97 | }
98 | }
99 | return false;
100 | }
101 |
102 | @Benchmark
103 | @Group("run_together")
104 | public Object safepoint() {
105 | if (intervalMs == 0)
106 | return null;
107 | LockSupport.parkNanos(intervalMs * 1000000);
108 | return safepointMethod();
109 | }
110 |
111 | protected abstract Object safepointMethod();
112 |
113 | @Benchmark
114 | @Group("run_together")
115 | public void park() {
116 | if (intervalMs == 0)
117 | return;
118 | LockSupport.parkNanos(intervalMs * 1000000);
119 | }
120 | }
121 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/fair/SafepointUsingFindDeadlocks.java:
--------------------------------------------------------------------------------
1 | package safepoint.fair;
2 |
3 | import java.lang.management.ManagementFactory;
4 |
5 | public class SafepointUsingFindDeadlocks extends SafepointUsingThreadsDump {
6 | @Override
7 | protected Object safepointMethod() {
8 | return ManagementFactory.getThreadMXBean().findDeadlockedThreads();
9 | }
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/fair/SafepointUsingGc.java:
--------------------------------------------------------------------------------
1 | package safepoint.fair;
2 |
3 | public class SafepointUsingGc extends LoveAtATimeOfSafepoints {
4 | @Override
5 | protected Object safepointMethod() {
6 | System.gc();
7 | return null;
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/fair/SafepointUsingThreadGetInfo.java:
--------------------------------------------------------------------------------
1 | package safepoint.fair;
2 |
3 | import java.lang.management.ManagementFactory;
4 | import java.util.concurrent.ThreadLocalRandom;
5 |
6 | public class SafepointUsingThreadGetInfo extends LoveAtATimeOfSafepoints {
7 | @Override
8 | protected Object safepointMethod() {
9 | long[] threadIds = ManagementFactory.getThreadMXBean().getAllThreadIds();
10 | long tid = threadIds[ThreadLocalRandom.current().nextInt(threadIds.length)];
11 | return ManagementFactory.getThreadMXBean().getThreadInfo(tid, 256);
12 | }
13 |
14 | }
15 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/fair/SafepointUsingThreadsDump.java:
--------------------------------------------------------------------------------
1 | package safepoint.fair;
2 |
3 | import java.lang.management.ManagementFactory;
4 |
5 | public class SafepointUsingThreadsDump extends LoveAtATimeOfSafepoints {
6 |
7 |
8 | @Override
9 | protected Object safepointMethod() {
10 | return ManagementFactory.getThreadMXBean().dumpAllThreads(false, false);
11 | }
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/hang/WhenWillItExitInt.java:
--------------------------------------------------------------------------------
1 | package safepoint.hang;
2 |
3 | public class WhenWillItExitInt {
4 | public static void main(String[] argc) throws InterruptedException {
5 | Thread t = new Thread(new Runnable() {
6 | @Override
7 | public void run() {
8 | long l = 0;
9 | for (int i = 0; i < Integer.MAX_VALUE; i++) {
10 | for (int j = 0; j < Integer.MAX_VALUE; j++) {
11 | if ((j & 1) == 1)
12 | l++;
13 | }
14 | }
15 | System.out.println("How Odd:" + l);
16 | }
17 | });
18 | t.setDaemon(true);
19 | t.start();
20 | Thread.sleep(5000);
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/hang/WhenWillItExitInt1.java:
--------------------------------------------------------------------------------
1 | package safepoint.hang;
2 |
3 | public class WhenWillItExitInt1 {
4 | public static void main(String[] argc) throws InterruptedException {
5 | Thread t = new Thread(new Runnable() {
6 |
7 | @Override
8 | public void run() {
9 | long l = countOdds();
10 | System.out.println("How Odd:" + l);
11 | }
12 | });
13 | t.setDaemon(true);
14 | t.start();
15 | Thread.sleep(5000);
16 | }
17 |
18 | private static long countOdds() {
19 | long l = 0;
20 | for (int i = 0; i < Integer.MAX_VALUE; i++) {
21 | for (int j = 0; j < Integer.MAX_VALUE; j++) {
22 | if ((j & 1) == 1)
23 | l++;
24 | }
25 | }
26 | return l;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/hang/WhenWillItExitInt2.java:
--------------------------------------------------------------------------------
1 | package safepoint.hang;
2 |
3 | public class WhenWillItExitInt2 {
4 | public static void main(String[] argc) throws InterruptedException {
5 | Thread t = new Thread(new Runnable() {
6 |
7 | @Override
8 | public void run() {
9 | long l = countOdds(Integer.MAX_VALUE);
10 | System.out.println("How Odd:" + l);
11 | }
12 | });
13 | t.setDaemon(true);
14 | t.start();
15 | Thread.sleep(5000);
16 | }
17 |
18 | private static long countOdds(int limit) {
19 | long l = 0;
20 | for (int i = 0; i < limit; i++) {
21 | for (int j = 0; j < limit; j++) {
22 | if ((j & 1) == 1)
23 | l++;
24 | }
25 | }
26 | return l;
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/hang/WhenWillItExitInt3.java:
--------------------------------------------------------------------------------
1 | package safepoint.hang;
2 |
3 | public class WhenWillItExitInt3 {
4 | public static void main(String[] argc) throws InterruptedException {
5 | for (int i = 0; i < 100000; i++) {
6 | countOdds(10);
7 | }
8 | Thread t = new Thread(new Runnable() {
9 |
10 | @Override
11 | public void run() {
12 | long l = countOdds(Integer.MAX_VALUE);
13 | System.out.println("How Odd:" + l);
14 | }
15 | });
16 | t.setDaemon(true);
17 | t.start();
18 | Thread.sleep(5000);
19 | }
20 |
21 | private static long countOdds(int limit) {
22 | long l = 0;
23 | int i = 0;
24 | while (i++ < limit) {
25 | for (int j = 0; j < limit; j++) {
26 | if ((j & 1) == 1)
27 | l++;
28 | }
29 | }
30 | return l;
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/hang/WhenWillItExitIntInfinite.java:
--------------------------------------------------------------------------------
1 | package safepoint.hang;
2 |
3 | public class WhenWillItExitIntInfinite {
4 | public static void main(String[] argc) throws InterruptedException {
5 | Thread t = new Thread(new Runnable() {
6 |
7 | @Override
8 | public void run() {
9 | long l = 0;
10 | for (int i = 0; i < Integer.MAX_VALUE; i += 2) {
11 | if ((i & 4) == 1)
12 | l++;
13 | }
14 | System.out.println("How Odd:" + l);
15 | }
16 | });
17 | t.setDaemon(true);
18 | t.start();
19 | Thread.sleep(5000);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/hang/WhenWillItExitLong.java:
--------------------------------------------------------------------------------
1 | package safepoint.hang;
2 |
3 | public class WhenWillItExitLong {
4 | public static void main(String[] argc) throws InterruptedException {
5 | Thread t = new Thread(new Runnable() {
6 |
7 | @Override
8 | public void run() {
9 | long l = 0;
10 | for (long i = 0; i < Long.MAX_VALUE; i++) {
11 | if ((i & 1) == 1)
12 | l++;
13 | }
14 | System.out.println("How Odd:" + l);
15 | }
16 | });
17 | t.setDaemon(true);
18 | t.start();
19 | Thread.sleep(5000);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/main/java/safepoint/optimizations/SafepointKillLoopOptimizations.java:
--------------------------------------------------------------------------------
1 | /*
2 | * Licensed under the Apache License, Version 2.0 (the "License");
3 | * you may not use this file except in compliance with the License.
4 | * You may obtain a copy of the License at
5 | *
6 | * http://www.apache.org/licenses/LICENSE-2.0
7 | *
8 | * Unless required by applicable law or agreed to in writing, software
9 | * distributed under the License is distributed on an "AS IS" BASIS,
10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 | * See the License for the specific language governing permissions and
12 | * limitations under the License.
13 | */
14 | package safepoint.optimizations;
15 |
16 | import java.util.Arrays;
17 | import java.util.Random;
18 | import java.util.concurrent.TimeUnit;
19 |
20 | import org.openjdk.jmh.annotations.Benchmark;
21 | import org.openjdk.jmh.annotations.BenchmarkMode;
22 | import org.openjdk.jmh.annotations.Level;
23 | import org.openjdk.jmh.annotations.Mode;
24 | import org.openjdk.jmh.annotations.OutputTimeUnit;
25 | import org.openjdk.jmh.annotations.Param;
26 | import org.openjdk.jmh.annotations.Scope;
27 | import org.openjdk.jmh.annotations.Setup;
28 | import org.openjdk.jmh.annotations.State;
29 |
30 | @State(Scope.Thread)
31 | @BenchmarkMode(Mode.AverageTime)
32 | @OutputTimeUnit(TimeUnit.NANOSECONDS)
33 | public class SafepointKillLoopOptimizations {
34 |
35 | @Param({ "100", "1000", "10000" })
36 | public int size;
37 |
38 | private DataSet datasetA;
39 | private DataSet datasetB;
40 |
41 | private static final class DataSet {
42 | private final int[] data;
43 |
44 | public DataSet(DataSet ds) {
45 | this.data = Arrays.copyOf(ds.data, ds.data.length);
46 | }
47 |
48 | public DataSet(int size) {
49 | Random r = new Random();
50 | data = new int[size];
51 | for (int i = 0; i < size; ++i) {
52 | data[i] = r.nextInt();
53 | }
54 | }
55 |
56 | int intSize() {
57 | return data.length;
58 | }
59 |
60 | int intGet(int index) {
61 | return data[index];
62 | }
63 |
64 | void intSet(int index, int v) {
65 | data[index] = v;
66 | }
67 |
68 | long longSize() {
69 | return data.length;
70 | }
71 |
72 | int longGet(long index) {
73 | return data[(int) index];
74 | }
75 |
76 | void longSet(long index, int v) {
77 | data[(int) index] = v;
78 | }
79 | }
80 |
81 | @Setup(Level.Trial)
82 | public void setup() {
83 | datasetA = new DataSet(size);
84 | datasetB = new DataSet(datasetA);
85 | }
86 |
87 | @Benchmark
88 | public int SumInt() {
89 | int sum = 0;
90 | for (int index = 0; index < datasetA.intSize(); ++index) {
91 | sum += datasetA.intGet(index);
92 | }
93 | return sum;
94 | }
95 |
96 | @Benchmark
97 | public int sumLong() {
98 | int sum = 0;
99 | for (long index = 0; index < datasetA.longSize(); ++index) {
100 | sum += datasetA.longGet(index);
101 | }
102 | return sum;
103 | }
104 |
105 | @Benchmark
106 | public boolean equalsInt() {
107 | for (int index = 0; index < datasetA.intSize(); ++index) {
108 | if (datasetA.intGet(index) != datasetB.intGet(index))
109 | return false;
110 | }
111 | return true;
112 | }
113 |
114 | @Benchmark
115 | public boolean equalsLong() {
116 | for (long index = 0; index < datasetA.longSize(); ++index) {
117 | if (datasetA.longGet(index) != datasetB.longGet(index))
118 | return false;
119 | }
120 | return true;
121 | }
122 |
123 | @Benchmark
124 | public void fillInt() {
125 | for (int index = 0; index < datasetA.intSize(); ++index) {
126 | datasetA.intSet(index, size);
127 | }
128 | }
129 |
130 | @Benchmark
131 | public void fillLong() {
132 | for (long index = 0; index < datasetA.longSize(); ++index) {
133 | datasetA.longSet(index, size);
134 | }
135 | }
136 |
137 | @Benchmark
138 | public void copyInt() {
139 | for (int index = 0; index < datasetA.intSize(); ++index) {
140 | datasetA.intSet(index, datasetB.intGet(index));
141 | }
142 | }
143 |
144 | @Benchmark
145 | public void copyLong() {
146 | for (long index = 0; index < datasetA.longSize(); ++index) {
147 | datasetA.longSet(index, datasetB.longGet(index));
148 | }
149 | }
150 |
151 | @Benchmark
152 | public void copyLongWithBatches() {
153 | long baseIndex = 0;
154 | final long length = datasetA.longSize();
155 | final int copySize = 4096;
156 | for (; baseIndex < length; baseIndex += copySize) {
157 | copyIntLoop(baseIndex, copySize);
158 | }
159 | int leftover = (int) (length & 4095);
160 | copyIntLoop(baseIndex - 4096, leftover);
161 | }
162 |
163 | private void copyIntLoop(long baseIndex, final int copySize) {
164 | for (int offset = 0; offset < copySize; offset++) {
165 | datasetA.longSet(baseIndex + offset, datasetB.longGet(baseIndex + offset));
166 | }
167 | }
168 | }
--------------------------------------------------------------------------------
/src/main/java/safepoint/profiling/SafepointProfiling.java:
--------------------------------------------------------------------------------
1 | package safepoint.profiling;
2 |
3 | import java.util.concurrent.TimeUnit;
4 |
5 | import org.openjdk.jmh.annotations.Benchmark;
6 | import org.openjdk.jmh.annotations.BenchmarkMode;
7 | import org.openjdk.jmh.annotations.CompilerControl;
8 | import org.openjdk.jmh.annotations.Mode;
9 | import org.openjdk.jmh.annotations.OutputTimeUnit;
10 | import org.openjdk.jmh.annotations.Param;
11 | import org.openjdk.jmh.annotations.Scope;
12 | import org.openjdk.jmh.annotations.Setup;
13 | import org.openjdk.jmh.annotations.State;
14 |
15 | @BenchmarkMode(Mode.AverageTime)
16 | @OutputTimeUnit(TimeUnit.NANOSECONDS)
17 | @State(Scope.Thread)
18 | public class SafepointProfiling {
19 | @Param("1000")
20 | int size;
21 | Thread[] pool;
22 |
23 | byte[] buffer;
24 | boolean result;
25 |
26 | @Setup
27 | public final void setup() {
28 | buffer = new byte[size];
29 | }
30 |
31 | @Benchmark
32 | public void blameSetResult() {
33 | byte b = 0;
34 | for (int i = 0; i < size; i++) {
35 | b += buffer[i];
36 | }
37 | setResult(b);
38 | }
39 |
40 | @Benchmark
41 | public void blameSetResultDeep() {
42 | byte b = 0;
43 | for (int i = 0; i < size; i++) {
44 | b += buffer[i];
45 | }
46 | setResult5(b);
47 | }
48 |
49 | @Benchmark
50 | @CompilerControl(CompilerControl.Mode.DONT_INLINE)
51 | public void blameSetResultDeeper() {
52 | byte b = 0;
53 | for (int i = 0; i < size; i++) {
54 | b += buffer[i];
55 | }
56 | setResult8(b);
57 | }
58 |
59 | private void setResult8(byte b) {
60 | setResult7(b);
61 | }
62 |
63 | private void setResult7(byte b) {
64 | setResult6(b);
65 | }
66 |
67 | @CompilerControl(CompilerControl.Mode.DONT_INLINE)
68 | private void setResult6(byte b) {
69 | setResult5(b);
70 | }
71 |
72 | private void setResult5(byte b) {
73 | setResult4(b);
74 | }
75 |
76 | private void setResult4(byte b) {
77 | setResult3(b);
78 | }
79 |
80 | private void setResult3(byte b) {
81 | setResult2(b);
82 | }
83 |
84 | private void setResult2(byte b) {
85 | setResult(b);
86 | }
87 |
88 | private void setResult(byte b) {
89 | setResult(b == 1);
90 | }
91 |
92 | @CompilerControl(CompilerControl.Mode.DONT_INLINE)
93 | private void setResult(boolean b) {
94 | result = b;
95 | }
96 |
97 | @Benchmark
98 | @CompilerControl(CompilerControl.Mode.DONT_INLINE)
99 | public void meSoHotNoInline() {
100 | byte b = 0;
101 | for (int i = 0; i < size; i++) {
102 | b += buffer[i];
103 | }
104 | result = b == 1;
105 | }
106 |
107 | @Benchmark
108 | public void meSoHotInline() {
109 | byte b = 0;
110 | for (int i = 0; i < size; i++) {
111 | b += buffer[i];
112 | }
113 | result = b == 1;
114 | }
115 | }
--------------------------------------------------------------------------------