├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── java10 ├── Application-Class-Data-Sharing.md ├── Local-Variable-Type-Inference.md ├── Parallel-Full-GC-for-G1.md └── others.md ├── java11 ├── Deprecate-the-Nashorn-JavaScript-Engine.md ├── EE-and-CORBA-Modules.md ├── Flight-Recorder.md ├── HTTP-Client.md ├── Improve-String-Class.md ├── Remove-the-Java └── others.md └── java9 ├── Convenience-Factory-Methods-for-Collections.md ├── JShell.md ├── Stack-Walking.md ├── VarHandles.md ├── g1gc.md └── others.md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.jar 15 | *.war 16 | *.nar 17 | *.ear 18 | *.zip 19 | *.tar.gz 20 | *.rar 21 | 22 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 23 | hs_err_pid* 24 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Yoshio Terada 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Java 9 から Java 17 までのアップデートのまとめ 2 | 3 | ## Java SE 9 4 | 5 | [Java SE 9 の全機能一覧](https://openjdk.java.net/projects/jdk9/) 6 | 7 | ### 代表的なアップデート機能 8 | 9 | * [JEP 193: Var Handles](https://openjdk.java.net/jeps/193) 10 | - [Variable Handles についてのまとめ (2021/10/3 Added by 寺田)](./java9/VarHandles.md) 11 | * [JEP 222: JShell: The Java Shell (Read-Eval-Print Loop)](https://openjdk.java.net/jeps/222) 12 | * [JEP 248: Make G1 the Default Garbage Collector](https://openjdk.java.net/jeps/248) 13 | * [JEP 259: Stack-Walking API](https://openjdk.java.net/jeps/259) 14 | * [JEP 269: Convenience Factory Methods for Collections](https://openjdk.java.net/jeps/269) 15 | * [JEP 223: New Version-String Scheme](https://openjdk.java.net/jeps/223) 16 | 17 | #### モジュール関連 18 | 19 | * [JEP 200: The Modular JDK](https://openjdk.java.net/jeps/200) 20 | * [JEP 201: Modular Source Code](https://openjdk.java.net/jeps/201) 21 | * [JEP 220: Modular Run-Time Images](https://openjdk.java.net/jeps/220) 22 | * [JEP 260: Encapsulate Most Internal APIs](https://openjdk.java.net/jeps/260) 23 | * [JEP 261: Module System](https://openjdk.java.net/jeps/261) 24 | * [JEP 275: Modular Java Application Packaging](https://openjdk.java.net/jeps/275) 25 | * [JEP 282: jlink: The Java Linker](https://openjdk.java.net/jeps/282) 26 | 27 | ### その他 28 | 29 | * [Other Enhancements](./java9/others.md) 30 | * Removed tools.jar 31 | - Attach API, Compiler API, JavaDoc API, etc 32 | * Removed Java DB (Aparch Derby) 33 | * Removed ***endorsed*** and ***extension*** directory 34 | - $JAVA_HOME/lib/endorsed 35 | - $JAVA_HOME/jre/lib/ext 36 | * Class Loading implementation changed to support module 37 | 38 | 39 | ## Java SE 10 40 | 41 | [Java SE 10 の全機能一覧](https://openjdk.java.net/projects/jdk/10/) 42 | 43 | ### 代表的なアップデート機能 44 | 45 | * [JEP 286: Local-Variable Type Inference](https://openjdk.java.net/jeps/286) 46 | * [JEP 307: Parallel Full GC for G1](https://openjdk.java.net/jeps/307) 47 | * [JEP 310: Application Class-Data Sharing](https://openjdk.java.net/jeps/310) 48 | 49 | 50 | ### その他 51 | 52 | * [Other Enhancements](./java10/others.md) 53 | * Docker Awareness (on by default) 54 | - [Improved Docker Container Integration with Java 10](https://blog.docker.com/2018/04/improved-docker-container-integration-with-java-10) 55 | - -XX:-UseContainerSupport 56 | VMで自動コンテナ検出サポートが提供されるようになり、これによって、Dockerコンテナ内で実行されるJavaプロセスで使用可能なメモリーの容量およびプロセッサの数をVMで決定できるようになりました。この情報はシステム・リソースを割り当てるために使用されます。このサポートはLinux x64プラットフォームでのみ使用できます。サポートされている場合、このフラグのデフォルトはtrueで、コンテナのサポートはデフォルトで有効になります。これは、-XX:-UseContainerSupportを使用して無効にできます。 57 | * [GraalVM](https://www.graalvm.org/) as experimental in this time 58 | 59 | ## Java SE 11 60 | 61 | [Java SE 11 の全機能一覧](https://openjdk.java.net/projects/jdk/11/) 62 | 63 | ### 代表的なアップデート機能 64 | 65 | * [JEP 181: Nest-Based Access Control](https://openjdk.java.net/jeps/181) 66 | * [JEP 321: HTTP Client](https://openjdk.java.net/jeps/321) 67 | * [JEP 328: Flight Recorder](https://openjdk.java.net/jeps/328) 68 | * [JEP 320: Remove the Java EE and CORBA Modules](https://openjdk.java.net/jeps/320) 69 | * [JEP 335: Deprecate the Nashorn JavaScript Engine](https://openjdk.java.net/jeps/335) 70 | * [JEP 330: Launch Single-File Source-Code Programs](https://openjdk.java.net/jeps/330) 71 | * [JEP 331: Low-Overhead Heap Profiling](https://openjdk.java.net/jeps/331) 72 | * [JEP 332: Transport Layer Security (TLS) 1.3](https://openjdk.java.net/jeps/332) 73 | * [JEP 318: Epsilon: A No-Op Garbage Collector](https://openjdk.java.net/jeps/318) 74 | * [JEP 333: ZGC: A Scalable Low-Latency Garbage Collector(Experimental)](https://openjdk.java.net/jeps/333) 75 | 76 | 77 | ### その他 78 | 79 | * [Other Enhancements](./java11/others.md) 80 | * [New Method added in String class](./java11/Improve-String-Class.md) 81 | - [isBlank](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html#isBlank()) 82 | - [lines](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html#lines()) 83 | - [repeat](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html#repeat(int)) 84 | - [strip](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html#strip()) 85 | - [stripLeading](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html#stripLeading()) 86 | - [stripTrailing](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html#stripTrailing()) 87 | 88 | ## Java SE 12 89 | 90 | [Java SE 12 の全機能一覧](https://openjdk.java.net/projects/jdk/12/) 91 | 92 | ### 代表的なアップデート機能 93 | 94 | * [JEP 230: Microbenchmark Suite](https://openjdk.java.net/jeps/230) 95 | * [JEP 334: JVM Constants API](https://openjdk.java.net/jeps/334) 96 | * [JEP 340: One AArch64 Port, Not Two](https://openjdk.java.net/jeps/340) 97 | * [JEP 341: Default CDS Archives](https://openjdk.java.net/jeps/341) 98 | * [JEP 344: Abortable Mixed Collections for G1](https://openjdk.java.net/jeps/344) 99 | * [JEP 346: Promptly Return Unused Committed Memory from G1](https://openjdk.java.net/jeps/346) 100 | 101 | 102 | ## Java SE 13 103 | [Java SE 13 の全機能一覧](https://openjdk.java.net/projects/jdk/13/) 104 | 105 | ### 代表的なアップデート機能 106 | 107 | * [JEP 353: Reimplement the Legacy Socket API](https://openjdk.java.net/jeps/353) 108 | * [AArch64: ZGC for Aarch64](https://bugs.openjdk.java.net/browse/JDK-8214527) 109 | 110 | 111 | ### その他 112 | 113 | * [JEP 350: Dynamic CDS Archives](https://openjdk.java.net/jeps/350) 114 | * [JEP 351: ZGC: Uncommit Unused Memory](https://openjdk.java.net/jeps/351) 115 | 116 | 117 | 118 | ## Java SE 14 119 | [Java SE 14 の全機能一覧](https://openjdk.java.net/projects/jdk/14/) 120 | 121 | ### 代表的なアップデート機能 122 | 123 | * [JEP 349: JFR Event Streaming](https://openjdk.java.net/jeps/349) 124 | * [JEP 358: Helpful NullPointerExceptions](https://openjdk.java.net/jeps/358) 125 | * [JEP 361: Switch Expressions](https://openjdk.java.net/jeps/361) 126 | * [JEP 363: Remove the Concurrent Mark Sweep (CMS) Garbage Collector](https://openjdk.java.net/jeps/363) 127 | 128 | ### その他 129 | 130 | * [JPE 345: NUMA-Aware Memory Allocation for G1](https://openjdk.java.net/jeps/345) 131 | * [JPE 352: Non-Volatile Mapped Byte Buffers](https://openjdk.java.net/jeps/352) 132 | * [JPE 362: Deprecate the Solaris and SPARC Ports](https://openjdk.java.net/jeps/362) 133 | * [JPE 364: ZGC on macOS](https://openjdk.java.net/jeps/364) 134 | * [JPE 365: ZGC on Windows](https://openjdk.java.net/jeps/365) 135 | * [JPE 366: Deprecate the ParallelScavenge + SerialOld GC Combination](https://openjdk.java.net/jeps/366) 136 | * [JPE 367: Remove the Pack200 Tools and API](https://openjdk.java.net/jeps/367) 137 | 138 | 139 | ## Java SE 15 140 | [Java SE 15 の全機能一覧](https://openjdk.java.net/projects/jdk/15/) 141 | 142 | ### 代表的なアップデート機能 143 | 144 | * [JEP 371: Hidden Classes](https://openjdk.java.net/jeps/371) 145 | * [JEP 372: Remove the Nashorn JavaScript Engine](https://openjdk.java.net/jeps/372) 146 | * [JEP 373: Reimplement the Legacy DatagramSocket API](https://openjdk.java.net/jeps/373) 147 | * [JEP 374: Deprecate and Disable Biased Locking](https://openjdk.java.net/jeps/374) 148 | * [JEP 378: Text Blocks](https://openjdk.java.net/jeps/378) 149 | * [JEP 377: ZGC: A Scalable Low-Latency Garbage Collector (Production)](https://openjdk.java.net/jeps/377) 150 | * [JEP 379: Shenandoah: A Low-Pause-Time Garbage Collector (Production)](https://openjdk.java.net/jeps/379) 151 | 152 | ### その他 153 | 154 | * [JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA)](https://openjdk.java.net/jeps/339) 155 | * [JEP 377: ZGC: A Scalable Low-Latency Garbage Collector](https://openjdk.java.net/jeps/377) 156 | * [JEP 381: Remove the Solaris and SPARC Ports](https://openjdk.java.net/jeps/381) 157 | * [JEP 385: Deprecate RMI Activation for Removal](https://openjdk.java.net/jeps/385) 158 | 159 | 160 | ## Java SE 16 161 | [Java SE 16 の全機能一覧](https://openjdk.java.net/projects/jdk/16/) 162 | 163 | ### 代表的なアップデート機能 164 | 165 | * [JEP 347: Enable C++14 Language Features](https://openjdk.java.net/jeps/347) 166 | * [JEP 357: Migrate from Mercurial to Git](https://openjdk.java.net/jeps/357) 167 | * [JEP 369: Migrate to GitHub](https://openjdk.java.net/jeps/369) 168 | * [JEP 376: ZGC: Concurrent Thread-Stack Processing (ZGC Improvement)](https://openjdk.java.net/jeps/376) 169 | * [JEP 380: Unix-Domain Socket Channels](https://openjdk.java.net/jeps/380) 170 | * [JEP 387: Elastic Metaspace](https://openjdk.java.net/jeps/387) 171 | * [JEP 392: Packaging Tool](https://openjdk.java.net/jeps/392) 172 | * [JEP 395: Records](https://openjdk.java.net/jeps/395) 173 | * [JEP 396: Strongly Encapsulate JDK Internals by Default](https://openjdk.java.net/jeps/396) 174 | 175 | ### その他 176 | 177 | * [JEP 386: Alpine Linux Port](https://openjdk.java.net/jeps/386) 178 | * [JEP 388: Windows/AArch64 Port](https://openjdk.java.net/jeps/388) 179 | * [JEP 390: Warnings for Value-Based Classes](https://openjdk.java.net/jeps/390) 180 | * [JEP 394: Pattern Matching for instanceof](https://openjdk.java.net/jeps/394) 181 | 182 | 183 | ## Java SE 17 184 | [Java SE 16 の全機能一覧](https://openjdk.java.net/projects/jdk/17/) 185 | 186 | ### 代表的なアップデート機能 187 | 188 | * [JEP 356: Enhanced Pseudo-Random Number Generators](https://openjdk.java.net/jeps/356) 189 | * [JEP 398: Deprecate the Applet API for Removal](https://openjdk.java.net/jeps/398) 190 | * [JEP 409: Sealed Classes](https://openjdk.java.net/jeps/409) 191 | * [JEP 410: Remove the Experimental AOT and JIT Compiler](https://openjdk.java.net/jeps/410) 192 | h 193 | * [JEP 411: Deprecate the Security Manager for Removal](https://openjdk.java.net/jeps/411) 194 | 195 | ### その他 196 | 197 | * [JEP 306: Restore Always-Strict Floating-Point Semantics](https://openjdk.java.net/jeps/306) 198 | * [JEP 382: New macOS Rendering Pipeline](https://openjdk.java.net/jeps/382) 199 | * [JEP 391: macOS/AArch64 Port](https://openjdk.java.net/jeps/391) 200 | * [JEP 403: Strongly Encapsulate JDK Internals](https://openjdk.java.net/jeps/403) 201 | * [JEP 407: Remove RMI Activation](https://openjdk.java.net/jeps/407) 202 | * [JEP 415: Context-Specific Deserialization Filters](https://openjdk.java.net/jeps/415) 203 | 204 | ## Java SE 17 Migration Guide 205 | [Java SE 17 Migration Guide](https://docs.oracle.com/en/java/javase/17/migrate/getting-started.html) 206 | 207 | * JDKの大幅な変更 (Significant Changes in the JDK) 208 | - [JDK 17 リリースの大幅な変更](https://docs.oracle.com/en/java/javase/17/migrate/significant-changes-jdk-release.html#GUID-339B2415-8BA8-438C-93AF-F9C746F7CE45) 209 | - [JDK 16 リリースの大幅な変更](https://docs.oracle.com/en/java/javase/17/migrate/significant-changes-jdk-release.html#GUID-327C39ED-C3FD-4637-906A-36C6697E85D5) 210 | - [JDK 15 リリースの大幅な変更](https://docs.oracle.com/en/java/javase/17/migrate/significant-changes-jdk-release.html#GUID-F0F718F5-13E5-45DC-BD8E-D1C455CA9977) 211 | - [JDK 14 リリースの大幅な変更](https://docs.oracle.com/en/java/javase/17/migrate/significant-changes-jdk-release.html#GUID-6B103F24-CA12-4645-A37C-7AB9E7EF1878) 212 | - [JDK 13 リリースの大幅な変更](https://docs.oracle.com/en/java/javase/17/migrate/significant-changes-jdk-release.html#GUID-E2EE0BC5-F0AA-4F83-A344-B9D5E424E040) 213 | - [JDK 12 リリースの大幅な変更](https://docs.oracle.com/en/java/javase/17/migrate/significant-changes-jdk-release.html#GUID-7D4768D0-738C-4554-BAC5-A8DBBEFA3857) 214 | - [JDK 11 リリースの大幅な変更](https://docs.oracle.com/en/java/javase/17/migrate/significant-changes-jdk-release.html#GUID-7D4768D0-738C-4554-BAC5-A8DBBEFA3857) 215 | 216 | * セキュリティ更新プログラム (Security Updates) 217 | - [JDK 17 のセキュリティ更新プログラム](https://docs.oracle.com/en/java/javase/17/migrate/security-updates.html#GUID-0A1C677D-F9A3-4B61-8D09-EFB793859789) 218 | - [JDK 16 のセキュリティ更新プログラム](https://docs.oracle.com/en/java/javase/17/migrate/security-updates.html#GUID-89D42765-3057-4054-9386-4748BC45585E) 219 | - [JDK 15 のセキュリティ更新プログラム](https://docs.oracle.com/en/java/javase/17/migrate/security-updates.html#GUID-9C6409FA-3EE2-4717-A1B4-B9A01690C081) 220 | - [JDK 14 のセキュリティ更新プログラム](https://docs.oracle.com/en/java/javase/17/migrate/security-updates.html#GUID-0AF2966D-5A34-4AC5-8FE1-D9E6E8788D55) 221 | - [JDK 13 のセキュリティ更新プログラム](https://docs.oracle.com/en/java/javase/17/migrate/security-updates.html#GUID-19C53993-A9C3-48EC-BD8E-3F3934CF9D6D) 222 | - [JDK 11 および JDK 12 のセキュリティ更新プログラム](https://docs.oracle.com/en/java/javase/17/migrate/security-updates.html#GUID-8C36237D-76BB-4ADD-B026-4EB3EAA6BE99) 223 | - [JDK 9 および JDK 10 のセキュリティ更新プログラム](https://docs.oracle.com/en/java/javase/17/migrate/security-updates.html#GUID-D6EE05FB-6791-43B3-A610-3F4416DEE508) 224 | 225 | * 削除された API (Removed APIs) 226 | - [JDK 17 で削除された API](https://docs.oracle.com/en/java/javase/17/migrate/removed-apis.html#GUID-9EF06707-9441-433E-BA50-9DD99F1C07F4) 227 | - [JDK 16 で削除された API](https://docs.oracle.com/en/java/javase/17/migrate/removed-apis.html#GUID-902FAA85-CFCF-4FD4-A25D-5060C7DBE650) 228 | - [JDK 15 で削除された API](https://docs.oracle.com/en/java/javase/17/migrate/removed-apis.html#GUID-233853B8-0782-429E-BEF7-7532EE610E63) 229 | - [JDK 14 で削除された API](https://docs.oracle.com/en/java/javase/17/migrate/removed-apis.html#GUID-4BB7838C-7F93-4C3B-86AD-28FFE46F736B) 230 | - [JDK 13 で削除された API](https://docs.oracle.com/en/java/javase/17/migrate/removed-apis.html#GUID-D78F54F4-24CC-41BE-AD7A-A11B28FDDD33) 231 | - [JDK 12 で削除された API](https://docs.oracle.com/en/java/javase/17/migrate/removed-apis.html#GUID-A7ABC76A-5037-4052-8718-562923FC7028) 232 | - [JDK 11 で削除された API](https://docs.oracle.com/en/java/javase/17/migrate/removed-apis.html#GUID-4B613B7E-B150-4D0A-835C-2393C60BE1F8) 233 | - [JDK 10 で削除された API](https://docs.oracle.com/en/java/javase/17/migrate/removed-apis.html#GUID-246BC701-2A75-4F3F-B0E2-CB0F20E523B7) 234 | - [JDK 9 で削除された API](https://docs.oracle.com/en/java/javase/17/migrate/removed-apis.html#GUID-2A8D44E2-DB96-4C2D-9BE4-CFF9FC524397) 235 | 236 | * 削除されたツールとコンポーネント (Removed Tools and Components) 237 | - [JDK 17 で削除されたツールとコンポーネント](https://docs.oracle.com/en/java/javase/17/migrate/removed-tools-and-components.html#GUID-D6C71B90-5F66-4426-899B-899B110CC64D) 238 | - [JDK 16 で削除されたツールとコンポーネント](https://docs.oracle.com/en/java/javase/17/migrate/removed-tools-and-components.html#GUID-F182E075-858A-4468-9434-8FC1704E7BB7) 239 | - [JDK 15 で削除されたツールとコンポーネント](https://docs.oracle.com/en/java/javase/17/migrate/removed-tools-and-components.html#GUID-BBCF36FE-C892-4769-95CB-AB3FFC3A3B13) 240 | - [JDK 14 で削除されたツールとコンポーネント](https://docs.oracle.com/en/java/javase/17/migrate/removed-tools-and-components.html#GUID-DC21025C-3236-4ACA-A23E-35B07BB7C21A) 241 | - [JDK 13 で削除されたツールとコンポーネント](https://docs.oracle.com/en/java/javase/17/migrate/removed-tools-and-components.html#GUID-7699DC53-53F9-4FB9-A548-05C58EC4F47F) 242 | - [JDK 12 で削除されたツールとコンポーネント](https://docs.oracle.com/en/java/javase/17/migrate/removed-tools-and-components.html#GUID-11F78105-D735-430D-92DD-6C37958FCBC3) 243 | - [JDK 11 で削除されたツールとコンポーネント](https://docs.oracle.com/en/java/javase/17/migrate/removed-tools-and-components.html#GUID-460800EF-A523-4B10-B694-E3536AC419C1) 244 | - [JDK 9 および JDK 10 で削除されたツールとコンポーネント](https://docs.oracle.com/en/java/javase/17/migrate/removed-tools-and-components.html#GUID-12237744-E23B-42F8-8892-26BA1BDD63F2) 245 | 246 | * Migrating From JDK 8 to Later JDK Releases 247 | 248 | - [Strong Encapsulation in the JDK](https://docs.oracle.com/en/java/javase/17/migrate/migrating-jdk-8-later-jdk-releases.html#GUID-7BB28E4D-99B3-4078-BDC4-FC24180CE82B) 249 | - [New Version-String Scheme](https://docs.oracle.com/en/java/javase/17/migrate/migrating-jdk-8-later-jdk-releases.html#GUID-3A71ECEF-5FC5-46FE-9BA9-88CBFCE828CB) 250 | - [Changes to the Installed JDK/JRE Image](https://docs.oracle.com/en/java/javase/17/migrate/migrating-jdk-8-later-jdk-releases.html#GUID-D867DCCC-CEB5-4AFA-9D11-9C62B7A3FAB1) 251 | - [Deployment](https://docs.oracle.com/en/java/javase/17/migrate/migrating-jdk-8-later-jdk-releases.html#GUID-954372A5-5954-4075-A1AF-6A9168371246) 252 | - [Changes to Garbage Collection](https://docs.oracle.com/en/java/javase/17/migrate/migrating-jdk-8-later-jdk-releases.html#GUID-1F270BDA-50B0-49C8-807E-0B727CCC5169) 253 | - [Running Java Applets](https://docs.oracle.com/en/java/javase/17/migrate/migrating-jdk-8-later-jdk-releases.html#GUID-430961F0-C3DF-4F31-BC02-1FE5414B1062) 254 | - [Behavior Change in Regular Expression Matching](https://docs.oracle.com/en/java/javase/17/migrate/migrating-jdk-8-later-jdk-releases.html#GUID-7DACC239-E71D-4B89-B582-201EA7CEBC38) 255 | - [Security Manager Deprecated for Removal](https://openjdk.java.net/jeps/411) 256 | -------------------------------------------------------------------------------- /java10/Application-Class-Data-Sharing.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java10/Application-Class-Data-Sharing.md -------------------------------------------------------------------------------- /java10/Local-Variable-Type-Inference.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java10/Local-Variable-Type-Inference.md -------------------------------------------------------------------------------- /java10/Parallel-Full-GC-for-G1.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java10/Parallel-Full-GC-for-G1.md -------------------------------------------------------------------------------- /java10/others.md: -------------------------------------------------------------------------------- 1 | # Other Enhancements 2 | 3 | * [JEP 296: Consolidate the JDK Forest into a Single Repository](https://openjdk.java.net/jeps/296) 4 | * [JEP 304: Garbage-Collector Interface](https://openjdk.java.net/jeps/304) 5 | * [JEP 312: Thread-Local Handshakes](https://openjdk.java.net/jeps/312) 6 | * [JEP 313: Remove the Native-Header Generation Tool (javah)](https://openjdk.java.net/jeps/313) 7 | * [JEP 314: Additional Unicode Language-Tag Extensions](https://openjdk.java.net/jeps/314) 8 | * [JEP 316: Heap Allocation on Alternative Memory Devices](https://openjdk.java.net/jeps/316) 9 | * [JEP 317: Experimental Java-Based JIT Compiler](https://openjdk.java.net/jeps/317) 10 | * [JEP 319: Root Certificates](https://openjdk.java.net/jeps/310) 11 | * [JEP 322: Time-Based Release Versioning](https://openjdk.java.net/jeps/322) 12 | -------------------------------------------------------------------------------- /java11/Deprecate-the-Nashorn-JavaScript-Engine.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java11/Deprecate-the-Nashorn-JavaScript-Engine.md -------------------------------------------------------------------------------- /java11/EE-and-CORBA-Modules.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java11/EE-and-CORBA-Modules.md -------------------------------------------------------------------------------- /java11/Flight-Recorder.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java11/Flight-Recorder.md -------------------------------------------------------------------------------- /java11/HTTP-Client.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java11/HTTP-Client.md -------------------------------------------------------------------------------- /java11/Improve-String-Class.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java11/Improve-String-Class.md -------------------------------------------------------------------------------- /java11/Remove-the-Java: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java11/Remove-the-Java -------------------------------------------------------------------------------- /java11/others.md: -------------------------------------------------------------------------------- 1 | # Other Enhancements 2 | 3 | * [JEP 309: Dynamic Class-File Constants](https://openjdk.java.net/jeps/309) 4 | * [JEP 315: Improve Aarch64 Intrinsics](https://openjdk.java.net/jeps/315) 5 | * [JEP 323: Local-Variable Syntax for Lambda Parameters](https://openjdk.java.net/jeps/323) 6 | * [JEP 324: Key Agreement with Curve25519 and Curve448](https://openjdk.java.net/jeps/324) 7 | * [JEP 327: Unicode 10](https://openjdk.java.net/jeps/327) 8 | * [JEP 329: ChaCha20 and Poly1305 Cryptographic Algorithms](https://openjdk.java.net/jeps/329) 9 | * [JEP 336: Deprecate the Pack200 Tools and API](https://openjdk.java.net/jeps/336) 10 | -------------------------------------------------------------------------------- /java9/Convenience-Factory-Methods-for-Collections.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java9/Convenience-Factory-Methods-for-Collections.md -------------------------------------------------------------------------------- /java9/JShell.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java9/JShell.md -------------------------------------------------------------------------------- /java9/Stack-Walking.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java9/Stack-Walking.md -------------------------------------------------------------------------------- /java9/VarHandles.md: -------------------------------------------------------------------------------- 1 | # JEP 193: Variable Handles について 2 | 3 | Java 9 で Variable Handles と呼ばれる新しい API が追加されました。これは Java 7 の [MethodHandle](https://docs.oracle.com/javase/jp/16/docs/api/java.base/java/lang/invoke/MethodHandle.html) を拡張し、クラス [java.lang.invoke.VarHandle](https://docs.oracle.com/javase/jp/9/docs/api/java/lang/invoke/VarHandle.html) でフィールドの変数や配列に対して強い型付けを持って参照ができます。ただし変数の参照だけでなく、Atomic 操作やリフレクションなどの操作に利用可能です。 4 | 例えば、ある一つの変数に対してアトミック操作を行うことによって、並列プログラミング時に変数に対するアクセスを保護を行うことができます。 5 | これまでは、[アトミック関連クラス](https://docs.oracle.com/javase/jp/9/docs/api/java/util/concurrent/atomic/package-summary.html)でこれらの操作を行ってきましたが、これからは、Variable Handles を使用することができます。 6 | また、リフレクションの代わりに使用することもできます。リフレクション API と比較した場合、優れたパフォーマンスを発揮し、型安全性を持たせることができます。 7 | 8 | つまり、Variable Handles はパフォーマンスが求められる場面における、リフレクションの代替として、もしくはアトミック操作を利用する場面において利用を検討することができます。 9 | 10 | ```text 11 | アトミック操作(不可分操作)とは 12 | 途中に割り込みが入らない操作の事で、例えば、銀行口座の入金や出金の処理では、金額の不一致を防ぐために排他制御が必要です。例えば、排他制御を行いアトミック性を確保します。 13 | 14 | NOTE: 15 | Java で、変数に volatile キーワードをつけても Atomic にはならず排他制御には利用できません。 16 | ``` 17 | 18 | ```text 19 | Variable Handles は、C/C++11 Atomic と互換性を持つように設計されています。今回の VarHandle を実装せずに、従来のAtomic API に対して修正を加えた場合、C/C++ 11 で追加されたメモリモデルを利用するために、追加のアクセス整合性ポリシーが必要となり、実装が複雑化する可能性がありました。それを避けるために Variable Handles を導入しています 20 | 21 | C/C++11: 2011年に見直されたC言語の仕様の規格: 22 | C/C++11のメモリの取得と解放の詳細については、 23 | https://cpprefjp.github.io/reference/atomic.html 24 | https://cpprefjp.github.io/reference/atomic/memory_order.html 25 | ``` 26 | 27 | ## Variable Handle の目的 28 | 29 | Variable Handle は下記の4点を考慮して提供される API です。 30 | 31 | * ***安全性:*** JVM を壊さないように メモリを扱う 32 | * ***整合性:*** フィールドへのアクセスは、getfield および putfield バイト・コードと同じアクセス規則に従う (final は操作不可) 33 | * ***パフォーマンス:*** sun.misc.Unsafe と同等のパフォーマンスを提供 34 | * ***ユーザビリティ:*** sun.misc.Unsafe よりも優れた API を提供 35 | 36 | 並列処理プログラミングの需要が増える一方で、今まで、クラスの変数(フィールド)に対する操作を、アトミック操作や順序付けされた操作として、うまく実装できない課題がありました。 37 | 38 | これまで、これらを実現する為に、synchronized を使用するか、 [java.util.concurrent.atomic](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/atomic/package-summary.html) を使用してきました。しかし、パフォーマンスが悪かったり、処理に対するオーバヘッドが大きいため、よりパフォーマンスを求めるために、[sun.misc.Unsafe](http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/sun/misc/Unsafe.java) という、非推奨で非サポートの JVM の組み込み関数が使用されてきました(Java 1.5 以降では、java.util.concurrent.atomic 配下のクラスで内部的に Unsafe を利用)。 特に、Unsafe の組み込み関数は高速であるため、非推奨であるにもかかわらず、フレームワークやライブラリ等で幅広く利用され、結果として移植性や安全性が損なわれていました。 39 | 40 | ### 現在の実装の問題点 41 | 42 | [JEP 193: Variable Handles](https://openjdk.java.net/jeps/193) のオーナーの ***Paul Sandoz*** によると現在の問題点を、[下記のように説明](http://cr.openjdk.java.net/~psandoz/varhandles/jvmls14-varHandles.pdf)しています。 43 | 44 | ```text 45 | * Atomic* classes have overhead 46 | • Not used in j.u.concurrent classes 47 | * sun.misc.Unsafe is... 48 | unsafe, not “portable”, and going away 49 | • CAS is too important to relegate 50 | * No unified/safe model for accessing on and off-heap 51 | ``` 52 | 53 | 訳すと下記の通りです。 54 | 55 | * Atomic 関連のクラスは、オーバヘッドが高い 56 | - パフォーマンスが悪いため Atomic 関連クラスを java.util.concurrent クラスの中で使用していない 57 | * sun.misc.Unsafe は 58 | - 安全でなく、ポータビリティもない、そして今後取り除かれる。 59 | - CAS(Copy and Set)は移管するのにとても重要 60 | * Heap に対してアクセスするための統合的で安全なモデルがない 61 | 62 | 63 | ## sun.misc.Unsafe を利用した実装例(非推奨) 64 | 65 | sun.misc.Unsafe を使用した変数を Atomic で書き換える例を下記に記載します。 66 | MyCounter のコンストラクターで counter のメモリ・アドレス の offset 値を取得しています。incrementAndGet() メソッドで、この offset 値を使用して変数(フィールド)の値を更新します。 67 | 書き換える対象の変数は、値を読み書きするすべてのスレッドから見えるように、volatile として宣言する必要があります。([JLS 8.3.1.4. volatile Fields](https://docs.oracle.com/javase/specs/jls/se17/html/jls-8.html#jls-8.3.1.4)) 68 | 69 | incrementAndGet()メソッドでは while ループを使用し、成功するまで操作を繰り返し行います。 実際には compareAndSwapLong() を呼び出し、変数が記載されているメモリのオフセットを指定し、現在の値と比較したのち、以前の値を1増加しています。そして更新したのち、以前の値が変更されたかどうかを確認しています。ここではブロッキング処理は実装していないため、高速にクラス内のインスタンス変数を書き換えることができています。 70 | しかし、型安全性がないため Java 言語の観点では推奨された実装方法ではありません。 71 | 72 | ```java 73 | import java.util.stream.IntStream; 74 | import java.lang.reflect.Field; 75 | import sun.misc.Unsafe; 76 | 77 | class MyCounter { 78 | private Unsafe unsafe; 79 | private volatile long counter = 0; 80 | private long valueOffset; 81 | 82 | public MyCounter() throws IllegalAccessException, NoSuchFieldException { 83 | unsafe = getUnsafe(); 84 | valueOffset = unsafe.objectFieldOffset(MyCounter.class.getDeclaredField("counter")); 85 | } 86 | 87 | public static void main(String... argv){ 88 | try{ 89 | MyCounter main = new MyCounter(); 90 | 91 | IntStream.range(0,100) 92 | .forEach(num -> { 93 | //実際にはここが並列処理として実行される 94 | System.out.println(main.incrementAndGet()); 95 | }); 96 | }catch (IllegalAccessException | NoSuchFieldException e){ 97 | e.printStackTrace(); 98 | } 99 | } 100 | 101 | private Unsafe getUnsafe() throws IllegalAccessException, NoSuchFieldException { 102 | Field f = Unsafe.class.getDeclaredField("theUnsafe"); 103 | f.setAccessible(true); 104 | return (Unsafe) f.get(null); 105 | } 106 | 107 | public long incrementAndGet() { 108 | long current = counter; 109 | long next = current + 1; 110 | 111 | while (!unsafe.compareAndSwapLong(this, valueOffset, current, next)) { 112 | counter = next; 113 | } 114 | return counter; 115 | } 116 | } 117 | ``` 118 | 119 | ### Java 11 移行の sun.misc.Unsafe の扱い 120 | 121 | [sun.misc.Unsafe は Java11 から非サポート](http://hg.openjdk.java.net/jdk/jdk11/file/6889f13694c6/src/jdk.unsupported/share/classes/sun/misc/Unsafe.java)になります。 122 | 123 | java.util.concurrent.atomic パッケージ配下の Atomic* 関連クラスも、将来的に VarHandles で書き換えられるようです。 124 | 実際に、Java 17 の [java.util.concurrent.atomic.AtomicInteger](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/concurrent/atomic/AtomicInteger.html) のソースコードを確認した所、下記のようにコメントが記載されていました。これによると、現時点では、まだ起動時の依存関係で未解決の問題があるため Unsafe を利用しているようですが、将来的には書き換えられると思われます。 125 | 126 | ```java 127 | import jdk.internal.misc.Unsafe; 128 | 129 | /* 130 | * This class intended to be implemented using VarHandles, but there 131 | * are unresolved cyclic startup dependencies. 132 | */ 133 | private static final Unsafe U = Unsafe.getUnsafe(); 134 | private static final long VALUE 135 | = U.objectFieldOffset(AtomicInteger.class, "value"); 136 | ``` 137 | 138 | Java 11 で危険を承知で利用したい場合は、module-info.java に require を記載する等の方法で回避できますが 139 | 基本的には非推奨なため、ここではその詳細については割愛します。 140 | 141 | ## java.lang.invoke.VarHandle の利用方法 142 | 143 | VarHandle を利用するためには、下記のクラスを利用します。 144 | [クラス java.lang.invoke.VarHandle](https://docs.oracle.com/javase/jp/9/docs/api/java/lang/invoke/VarHandle.html) 145 | 146 | ### サンプルコード 147 | 148 | 複数のスレッドから変更されるインスタンス変数(フィールド)を持つクラスを定義します。 149 | 150 | 151 | ```java 152 | import java.nio.ByteBuffer; 153 | 154 | public class Data { 155 | public int counter = 1; 156 | private int privateField = 10; 157 | public String name = "Yoshio Terada"; 158 | public byte[] data = new byte[]{1, 0, 0, 0, 1, 0, 0, 0}; 159 | public char[] charArray = new char[]{'A','B','C','D','E','F'}; 160 | public ByteBuffer dataBuffer = ByteBuffer.wrap(this.data); 161 | } 162 | ``` 163 | 164 | VarHandle を利用して読み書きをするコード例を下記に示します。ここでは最初に ATOMIC 操作ではない API を利用しています。 165 | 166 | ```java 167 | public void nonAtomicGetAndSetEvaluation(Data data){ 168 | try { 169 | VarHandle varHandle = MethodHandles.lookup().findVarHandle(Data.class,"counter", int.class); 170 | Data data = new Data(); 171 | 172 | //Read Access 173 | System.out.println(varHandle.get(data)); //アクセスモード: GET 174 | System.out.println(varHandle.getVolatile(data)); //アクセスモード: GET_VOLATILE 175 | System.out.println(varHandle.getOpaque(data)); //アクセスモード: GET_OPAQUE 176 | System.out.println(varHandle.getAcquire(data)); //アクセスモード: GET_ACQUIRE 177 | 178 | //Write Access 179 | int newValue = 2; 180 | varHandle.set(data, newValue); //アクセスモード: SET 181 | System.out.println(varHandle.get(data)); //アクセスモード: GET 182 | varHandle.setVolatile(data, newValue + 1); //アクセスモード: SET_VOLATILE 183 | System.out.println(varHandle.get(data)); 184 | varHandle.setOpaque(data, newValue + 2); //アクセスモード: SET_OPAQUE 185 | System.out.println(varHandle.get(data)); 186 | varHandle.setRelease(data, newValue + 3); //アクセスモード: SET_RELEASE 187 | System.out.println(varHandle.get(data)); 188 | 189 | } catch (NoSuchFieldException | IllegalAccessException e) { 190 | e.printStackTrace(); 191 | } 192 | } 193 | 194 | public void arrayCheck(Data data) { 195 | VarHandle byteArrayViewVarHandle = MethodHandles.arrayElementVarHandle(char[].class); 196 | // char 配列 {'A','B','C','D','E','F'} より char を一つづつ取得 197 | for (int i = 0; i < data.charArray.length; i++) { 198 | var out = byteArrayViewVarHandle.getAcquire(data.charArray, i); 199 | System.out.println(out); 200 | // char が 'C' , 'D' ならば 'Z' に置き換え 201 | if (out.equals('C')|| out.equals('D')) { 202 | byteArrayViewVarHandle.setRelease(data.charArray, i, 'Z'); 203 | } 204 | } 205 | // char 配列は {'A','B','Z','Z','E','F'} に置き換わる 206 | } 207 | ``` 208 | 209 | ### ソースコードの説明 210 | 211 | [VarHandle](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/invoke/VarHandle.html) オブジェクトは、[MethodHandles.Lookup](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/invoke/MethodHandles.Lookup.html) クラスのファクトリ・メソッドを使用して作成できます。 212 | 213 | Lookup のファクトリから VarHandle を生成するために3種類のメソッドが用意されています。インスタンス変数、クラス変数用、そしてリフレクションの代わりに利用可能な VarHandle を生成することができます。 214 | 215 | * [findStaticVarHandle​(Class decl, String name, Class type)](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/invoke/MethodHandles.Lookup.html#findStaticVarHandle(java.lang.Class,java.lang.String,java.lang.Class)) 216 | 217 | ```java 218 | VarHandle staticVarHandle = MethodHandles.lookup() 219 | .findStaticVarHandle(Hello.class, "staticConter", int.class); 220 | ``` 221 | 222 | * [findVarHandle​(Class recv, String name, Class type)](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/invoke/MethodHandles.Lookup.html#findVarHandle(java.lang.Class,java.lang.String,java.lang.Class)) 223 | 224 | ```java 225 | VarHandle varHandle = MethodHandles.lookup() 226 | .findVarHandle(Hello.class, "count", int.class); 227 | ``` 228 | 229 | * [unreflectVarHandle​(Field f)](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/invoke/MethodHandles.Lookup.html#unreflectVarHandle(java.lang.reflect.Field)) 230 | 231 | ```java 232 | VarHandle unreflectVarHandle = MethodHandles 233 | .lookup() 234 | .unreflectVarHandle(Hello.class.getDeclaredField("count")); 235 | ``` 236 | 237 | 238 | ### アクセスモード 239 | 240 | VarHandle は異なるアクセスモードで変数への読み取り、書き込みのアクセスをサポートしています。 241 | 242 | [列挙型 VarHandle.AccessMode](https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/invoke/VarHandle.AccessMode.html) に31 個のアクセスモードが定義されており、AccessMode ごとに、VarHandle 内に対応メソッドがあります。たとえば、アクセス モード GET_AND_ADD の場合、VarHandle.getAndAdd() メソッドを使用します。 243 | 上記のサンプルコードでは、ATOMIC ではないアクセス・モードを利用しています。 244 | 245 | #### ATOMIC ではない読み書き用のアクセス・タイプと対応するメソッド 246 | 247 | | アクセスモード | 対応するメソッド | ATOMIC か否か | 248 | | ---- | ---- | ---- | 249 | |GET |get()| NON ATOMIC| 250 | |GET_ACQUIRE |getAcquire()| NON ATOMIC| 251 | |GET_OPAQUE |getOpaque()| NON ATOMIC| 252 | |GET_VOLATILE|getVolatile()| NON ATOMIC| 253 | |SET|set()| NON ATOMIC| 254 | |SET_OPAQUE |setOpaque()| NON ATOMIC| 255 | |SET_RELEASE|setRelease()| NON ATOMIC| 256 | |SET_VOLATILE|setVolatile()| NON ATOMIC| 257 | 258 | #### ATOMIC で読み書きをするアクセスタイプと対応するメソッドを下記に示します。 259 | 260 | * アトミックで比較・設定する更新アクセスモード 261 | 262 | | アクセスモード | 対応するメソッド | ATOMIC か否か | 263 | | ---- | ---- | ---- | 264 | |COMPARE_AND_EXCHANGE|compareAndExchange()|ATOMIC| 265 | |COMPARE_AND_EXCHANGE_ACQUIRE|compareAndExchangeAcquire()|ATOMIC| 266 | |COMPARE_AND_EXCHANGE_RELEASE|compareAndExchangeRelease()|ATOMIC| 267 | |COMPARE_AND_SET|compareAndSet()|ATOMIC| 268 | |GET_AND_SET|getAndSet()|ATOMIC| 269 | |GET_AND_SET_ACQUIRE|getAndSetAcquire()|ATOMIC| 270 | |GET_AND_SET_RELEASE|getAndSetRelease()|ATOMIC| 271 | |WEAK_COMPARE_AND_SET|weakCompareAndSet()|できる限り(Possibly) ATOMIC| 272 | |WEAK_COMPARE_AND_SET_ACQUIRE|weakCompareAndSetAcquire()|できる限り(Possibly) ATOMIC| 273 | |WEAK_COMPARE_AND_SET_PLAIN|weakCompareAndSetPlain()|できる限り(Possibly) ATOMIC| 274 | |WEAK_COMPARE_AND_SET_RELEASE|weakCompareAndSetRelease()|できる限り(Possibly) ATOMIC| 275 | 276 | * 数値用のアトミック更新アクセスモード 277 | 278 | | アクセスモード | 対応するメソッド | ATOMIC か否か | 279 | | ---- | ---- | ---- | 280 | |GET_AND_ADD| getAndAdd()|ATOMIC| 281 | |GET_AND_ADD_ACQUIRE|getAndAddAcquire()|ATOMIC| 282 | |GET_AND_ADD_RELEASE|getAndAddRelease()|ATOMIC| 283 | 284 | * ビット単位でのアトミック更新アクセスモード 285 | 286 | | アクセスモード | 対応するメソッド | ATOMIC か否か | 287 | | ---- | ---- | ---- | 288 | |GET_AND_BITWISE_AND|getAndBitwiseAnd()|ATOMIC| 289 | |GET_AND_BITWISE_AND_ACQUIRE|getAndBitwiseAndAcquire()|ATOMIC| 290 | |GET_AND_BITWISE_AND_RELEASE|getAndBitwiseAndRelease()|ATOMIC| 291 | |GET_AND_BITWISE_OR|getAndBitwiseOr()|ATOMIC| 292 | |GET_AND_BITWISE_OR_ACQUIRE|getAndBitwiseOrAcquire()|ATOMIC| 293 | |GET_AND_BITWISE_OR_RELEASE|getAndBitwiseOrRelease()|ATOMIC| 294 | |GET_AND_BITWISE_XOR|getAndBitwiseXor()|ATOMIC| 295 | |GET_AND_BITWISE_XOR_ACQUIRE|getAndBitwiseXorAcquire()|ATOMIC| 296 | |GET_AND_BITWISE_XOR_RELEASE|getAndBitwiseXorRelease|ATOMIC| 297 | 298 | ### Atomic での更新サンプル 299 | 300 | 上記のアクセスモードの内 ATOMIC 操作が可能なメソッドを利用して実装を行います。数値用、ビット単位、比較をして更新するメソッドが用意されているため、必要に応じたメソッドを呼び出します。 301 | 302 | ```java 303 | public void atomicUpdate(Data data){ 304 | try { 305 | VarHandle varHandle = MethodHandles.lookup().findVarHandle(Data.class, "name", String.class); 306 | String expectedValue = "Yoshio Terada"; 307 | String newValue = "I Love Duke!!"; 308 | 309 | // compareAndSet() は比較・更新に成功したか否かを真偽値で返す (ここでは true が表示、値は I Love Duke に変更) 310 | System.out.println(varHandle.compareAndSet(data, expectedValue, newValue)); 311 | // compareAndExchangeAcquire は読み込み時にメモリをバリアし比較・更新したい場合に利用、返り値は変更前の値(ここでは I Love Duke が表示、値は Yoshio Teradaに変更) 312 | System.out.println(varHandle.compareAndExchangeAcquire(data, newValue, expectedValue)); 313 | // compareAndExchangeRelease は書き込み時にメモリをバリアし比較・更新したい場合に利用、返り値は変更前の値(ここでは Yoshio Terada が表示、値は I Love Dukeに変更) 314 | System.out.println(varHandle.compareAndExchangeRelease(data, expectedValue, newValue)); 315 | // getAndSetAcquire は読み込み時にメモリをバリアし更新したい場合に利用、返り値は変更前の値(ここでは I Love Duke が表示、値は Yoshio Teradaに変更) 316 | System.out.println(varHandle.getAndSetAcquire(data, expectedValue)); 317 | //最後に Yoshio Terada が表示される 318 | System.out.println(data.name); 319 | } catch (NoSuchFieldException | IllegalAccessException e) { 320 | e.printStackTrace(); 321 | } 322 | } 323 | 324 | public void numericAtomicUpdate (Data data) { 325 | try { 326 | VarHandle varHandle = MethodHandles.lookup().findVarHandle(Data.class, "counter", int.class); 327 | final int adder = 1; 328 | 329 | //読み込み時にメモリをバリアしたい場合 Acquire を利用、返り値は変更前の値(ここでは1が表示) 330 | System.out.println(varHandle.getAndAddAcquire(data,adder)); 331 | //書き込み時にメモリをバリアしたい場合 Release を利用 返り値は変更前の値 (ここでは2が表示) 332 | System.out.println(varHandle.getAndAddRelease(data,adder)); 333 | System.out.println(data.counter); // (ここで3が表示) 334 | } catch (NoSuchFieldException | IllegalAccessException e) { 335 | e.printStackTrace(); 336 | } 337 | } 338 | 339 | ``` 340 | 341 | ### リフレクションの代わりに Variable Handles を利用する 342 | 343 | 最後に、リフレクション API を利用する代わりに、VarHandle を利用する方法を紹介します。 344 | ここでは、private フィールドにアクセスし、その値を確認したり、更新するサンプルを下記に紹介します。MethodHandles のルックアップで unreflectVarHandle() を呼び出して VarHandle のインスタンスを生成します。 345 | そして、get(), set() などのメソッドを呼び出して値を更新しています。 346 | 347 | ```java 348 | public class Data { 349 | private int privateField = 10; 350 | } 351 | 352 | import java.lang.invoke.MethodHandles; 353 | import java.lang.invoke.VarHandle; 354 | import java.lang.reflect.Field; 355 | 356 | public class DataUpdater { 357 | public static void main(String... argv) { 358 | DataUpdater main = new DataUpdater(); 359 | Data data = new Data(); 360 | main.insteadOfReflectionTest(data); 361 | } 362 | 363 | public void insteadOfReflectionTest() { 364 | 365 | public void insteadOfReflectionTest(Data data) { 366 | try { 367 | Class class1 = data.getClass(); 368 | Field privateField = class1.getDeclaredField("privateField"); 369 | 370 | // private フィールドにアクセスするための VarHandle を取得 371 | VarHandle unreflectVarHandle = MethodHandles.privateLookupIn(class1, MethodHandles.lookup()) 372 | .unreflectVarHandle(privateField); 373 | 374 | // private フィールドの現在値を取得 10 を出力 375 | System.out.println(unreflectVarHandle.get(data)); 376 | // private フィールドを新しい値で更新 377 | unreflectVarHandle.set(data, 20); 378 | // private フィールドの現在値を取得 20 を出力 379 | System.out.println(unreflectVarHandle.get(data)); 380 | 381 | } catch (NoSuchFieldException | SecurityException | IllegalAccessException e) { 382 | e.printStackTrace(); 383 | } 384 | } 385 | } 386 | ``` 387 | 388 | ### メモリ・フェンス 389 | 390 | 今回、詳しく取り上げていませんが、VarHandle は C++11 の [atomic_thread_fence](https://cpprefjp.github.io/reference/atomic/atomic_thread_fence.html) に対応したメモリの順番を制御するためのメモリ・フェンスの機能も持っています。 391 | フェンス操作は、メモリ順序をきめ細かく制御するための最小限の機能を提要しています。VarHandle では、異なるフェンスを作成するために 5 つの static メソッドを提供しています。 392 | 393 | ***フェンスの強弱*** 394 | loadLoadFence fence(弱) < acquire fence(中) < full fence(強) 395 | storeStoreFence fence(弱) < release fence(中) < full fence(強) 396 | 397 | | Method | フェンス前の操作 |フェンス後の操作 | C++ 11 atomic_thread_fence との対応 | 意味 | 398 | | ---- | ---- | ---- | ---- | ---- | 399 | | fullFence()|loads and stores|loads and stores|memory_order_seq_cst|フェンス前のロードとストアが、フェンス後、ロードとストアで並べ替えられないようにする| 400 | | acquireFence()|loads|loads and stores|memory_order_acquire|フェンス前のロードがフェンス後にロードおよびストアで並べ替えられないようにする| 401 | | releaseFence()|loads and stores|stores|memory_order_release|フェンス前のロードとストアがフェンス後にストアで並び替えられないようにする| 402 | | loadLoadFence()|loads|loads||フェンス前のロードがフェンス後のロードと並び替えられないようにする| 403 | | storeStoreFence()|stores|stores||フェンス前のストアがフェンス後のストアと並べ替えられないようにする| 404 | 405 | 406 | ## まとめ 407 | 408 | 上記のサンプル・コードで示したように、VarHandle はアトミック操作やリフレクションの代わりに、利用できることがわかりました。[アトミック関連クラス](https://docs.oracle.com/javase/jp/9/docs/api/java/util/concurrent/atomic/package-summary.html)は、利用する際にオーバヘッドが高く、sun.misc.Unsafe はハイ・パフォーマンスではあるものの、非推奨のクラスでした。こうした課題を解決するために提供された VarHandle はパフォーマンスが求められる場面において利用が可能です。 409 | 利用する上では、いくつかの注意点があります。そこで実際に使用する際には API ドキュメントを注意深く読んで、理解してお使いください。 410 | 注意点を理解した上でご利用いただく事で、推奨された方法で並列プログラミング時のパフォーマンスを向上させることも可能ですので、この記事を手始めにお試しください。 411 | 412 | 備考 413 | VarHandle は既に Fork/Join 関連クラスで実際に sun.misc.Unsafe から書き換えられています。下記の ForkJoinPool の実装中では Fence の実際の使用例も記載されていますので、参照してください。 414 | (参照:[ForkJoinPool](https://github.com/yoshioterada/jdk/blob/master/src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java), [ForkJoinTask](https://github.com/yoshioterada/jdk/blob/master/src/java.base/share/classes/java/util/concurrent/ForkJoinTask.java)) 415 | 416 | また現在、Incubator のプロジェクトとして位置づけされている [JEP 412: Foreign Function & Memory API (Incubator)](https://openjdk.java.net/jeps/412) は実装で Variable Handle を利用して実装しています。 417 | [Foreign Function & Memory API のソースコードはこちら](https://github.com/yoshioterada/jdk/tree/master/src/jdk.incubator.foreign/share/classes/jdk/incubator/foreign) 418 | 419 | ## 参考 420 | 421 | * [java.lang.invoke.VarHandle](https://docs.oracle.com/javase/jp/9/docs/api/java/lang/invoke/VarHandle.html) 422 | * [JEP 193: Variable Handles](https://openjdk.java.net/jeps/193) 423 | * [Using JDK 9 Memory Order Modes by Doug Lea.](http://gee.cs.oswego.edu/dl/html/j9mm.html) 424 | * [Acquire and Release Semantics](https://preshing.com/20120913/acquire-and-release-semantics/) 425 | 426 | --- 427 | ***TODO: 上記のサンプルをマルチ・スレッドのコードに書き直し、もう少し検証をしたい。*** 428 | -------------------------------------------------------------------------------- /java9/g1gc.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/yoshioterada/Java-Update-From-JavaSE9-to-Java17/9ffa03072b0dee6f52e42344f3e828294187f217/java9/g1gc.md -------------------------------------------------------------------------------- /java9/others.md: -------------------------------------------------------------------------------- 1 | # Other Enhancements 2 | 3 | * [JEP 102: Process API Updates](https://openjdk.java.net/jeps/102) 4 | * [JEP 110: HTTP 2 Client](https://openjdk.java.net/jeps/110) 5 | * [JEP 143: Improve Contended Locking](https://openjdk.java.net/jeps/143) 6 | * [JEP 158: Unified JVM Logging](https://openjdk.java.net/jeps/158) 7 | * [JEP 165: Compiler Control](https://openjdk.java.net/jeps/165) 8 | * [JEP 197: Segmented Code Cache](https://openjdk.java.net/jeps/197) 9 | * [JEP 199: Smart Java Compilation, Phase Two](https://openjdk.java.net/jeps/199) 10 | * [JEP 211: Elide Deprecation Warnings on Import Statements](https://openjdk.java.net/jeps/211) 11 | * [JEP 212: Resolve Lint and Doclint Warnings](https://openjdk.java.net/jeps/212) 12 | * [JEP 213: Milling Project Coin](https://openjdk.java.net/jeps/213) 13 | * [JEP 214: Remove GC Combinations Deprecated in JDK 8](https://openjdk.java.net/jeps/214) 14 | * [JEP 215: Tiered Attribution for javac](https://openjdk.java.net/jeps/215) 15 | * [JEP 216: Process Import Statements Correctly](https://openjdk.java.net/jeps/216) 16 | * [JEP 217: Annotations Pipeline 2.0](https://openjdk.java.net/jeps/217) 17 | * [JEP 219: Datagram Transport Layer Security (DTLS)](https://openjdk.java.net/jeps/219) 18 | * [JEP 221: Simplified Doclet API](https://openjdk.java.net/jeps/221) 19 | * [JEP 224: HTML5 Javadoc](https://openjdk.java.net/jeps/224) 20 | * [JEP 225: Javadoc Search](https://openjdk.java.net/jeps/225) 21 | * [JEP 226: UTF-8 Property Files](https://openjdk.java.net/jeps/226) 22 | * [JEP 227: Unicode 7.0](https://openjdk.java.net/jeps/227) 23 | * [JEP 228: Add More Diagnostic Commands](https://openjdk.java.net/jeps/228) 24 | * [JEP 229: Create PKCS12 Keystores by Default](https://openjdk.java.net/jeps/229) 25 | * [JEP 231: Remove Launch-Time JRE Version Selection](https://openjdk.java.net/jeps/231) 26 | * [JEP 232: Improve Secure Application Performance](https://openjdk.java.net/jeps/232) 27 | * [JEP 233: Generate Run-Time Compiler Tests Automatically](https://openjdk.java.net/jeps/233) 28 | * [JEP 235: Test Class-File Attributes Generated by javac](https://openjdk.java.net/jeps/235) 29 | * [JEP 236: Parser API for Nashorn](https://openjdk.java.net/jeps/236) 30 | * [JEP 237: Linux/AArch64 Port](https://openjdk.java.net/jeps/237) 31 | * [JEP 238: Multi-Release JAR Files](https://openjdk.java.net/jeps/238) 32 | * [JEP 240: Remove the JVM TI hprof Agent](https://openjdk.java.net/jeps/240) 33 | * [JEP 241: Remove the jhat Tool](https://openjdk.java.net/jeps/241) 34 | * [JEP 243: Java-Level JVM Compiler Interface](https://openjdk.java.net/jeps/243) 35 | * [JEP 244: TLS Application-Layer Protocol Negotiation Extension](https://openjdk.java.net/jeps/244) 36 | * [JEP 245: Validate JVM Command-Line Flag Arguments](245) 37 | * [JEP 246: Leverage CPU Instructions for GHASH and RSA](https://openjdk.java.net/jeps/246) 38 | * [JEP 247: Compile for Older Platform Versions](https://openjdk.java.net/jeps/247) 39 | * [JEP 249: OCSP Stapling for TLS](https://openjdk.java.net/jeps/249) 40 | * [JEP 250: Store Interned Strings in CDS Archives](https://openjdk.java.net/jeps/250) 41 | * [JEP 251: Multi-Resolution Images](https://openjdk.java.net/jeps/251) 42 | * [JEP 252: Use CLDR Locale Data by Default](https://openjdk.java.net/jeps/252) 43 | * [JEP 253: Prepare JavaFX UI Controls & CSS APIs for Modularization](https://openjdk.java.net/jeps/253) 44 | * [JEP 254: Compact Strings](https://openjdk.java.net/jeps/254) 45 | * [JEP 255: Merge Selected Xerces 2.11.0 Updates into JAXP](https://openjdk.java.net/jeps/255) 46 | * [JEP 256: BeanInfo Annotations](https://openjdk.java.net/jeps/256) 47 | * [JEP 257: Update JavaFX/Media to Newer Version of GStreamer](https://openjdk.java.net/jeps/257) 48 | * [JEP 258: HarfBuzz Font-Layout Engine](https://openjdk.java.net/jeps/258) 49 | * [JEP 262: TIFF Image I/O](https://openjdk.java.net/jeps/262) 50 | * [JEP 263: HiDPI Graphics on Windows and Linux](https://openjdk.java.net/jeps/263) 51 | * [JEP 264: Platform Logging API and Service](https://openjdk.java.net/jeps/264) 52 | * [JEP 265: Marlin Graphics Renderer](https://openjdk.java.net/jeps/265) 53 | * [JEP 266: More Concurrency Updates](https://openjdk.java.net/jeps/266) 54 | * [JEP 267: Unicode 8.0](https://openjdk.java.net/jeps/267) 55 | * [JEP 268: XML Catalogs](https://openjdk.java.net/jeps/268) 56 | * [JEP 270: Reserved Stack Areas for Critical Sections](https://openjdk.java.net/jeps/270) 57 | * [JEP 271: Unified GC Logging](https://openjdk.java.net/jeps/271) 58 | * [JEP 272: Platform-Specific Desktop Features](https://openjdk.java.net/jeps/272) 59 | * [JEP 273: DRBG-Based SecureRandom Implementations](https://openjdk.java.net/jeps/273) 60 | * [JEP 274: Enhanced Method Handles](https://openjdk.java.net/jeps/274) 61 | * [JEP 276: Dynamic Linking of Language-Defined Object Models](https://openjdk.java.net/jeps/276) 62 | * [JEP 277: Enhanced Deprecation](277) 63 | * [JEP 278: Additional Tests for Humongous Objects in G1](https://openjdk.java.net/jeps/278) 64 | * [JEP 279: Improve Test-Failure Troubleshooting](https://openjdk.java.net/jeps/279) 65 | * [JEP 280: Indify String Concatenation](https://openjdk.java.net/jeps/280) 66 | * [JEP 281: HotSpot C++ Unit-Test Framework](https://openjdk.java.net/jeps/281) 67 | * [JEP 283: Enable GTK 3 on Linux](https://openjdk.java.net/jeps/283) 68 | * [JEP 284: New HotSpot Build System](https://openjdk.java.net/jeps/284) 69 | * [JEP 285: Spin-Wait Hints](https://openjdk.java.net/jeps/285) 70 | * [JEP 287: SHA-3 Hash Algorithms](https://openjdk.java.net/jeps/287) 71 | * [JEP 288: Disable SHA-1 Certificates](https://openjdk.java.net/jeps/288) 72 | * [JEP 289: Deprecate the Applet API](https://openjdk.java.net/jeps/289) 73 | * [JEP 290: Filter Incoming Serialization Data](https://openjdk.java.net/jeps/290) 74 | * [JEP 291: Deprecate the Concurrent Mark Sweep (CMS) Garbage Collector](https://openjdk.java.net/jeps/291) 75 | * [JEP 292: Implement Selected ECMAScript 6 Features in Nashorn](https://openjdk.java.net/jeps/292) 76 | * [JEP 294: Linux/s390x Port](https://openjdk.java.net/jeps/294) 77 | * [JEP 295: Ahead-of-Time Compilation](295) 78 | * [JEP 297: Unified arm32/arm64 Port](297) 79 | * [JEP 298: Remove Demos and Samples](298) 80 | * [JEP 299: Reorganize Documentation](299) 81 | --------------------------------------------------------------------------------