SlideShare a Scribd company logo
Enhancing
Productivity and Insight
A Tour of JDK Tools Progress
Beyond Java 17
Java Champion Alumni, Certified Architect
Senior Developer Advocate at Oracle
“DevOps Tools for Java Developers” guest author
ammbra1508 ammbra1508.mastondon.social
6-Month Release Cadence
Goal
Learn about key enhancements on the JDK tools since
Java 17 so that you can efficiently code, deploy and
monitor your applications.
Image by Efraimstochter from Pixabay
Source and Classfile Tools
Improvements
Compiling and Launching a Java Program
IDE javac java
.java source
file
bytecode .class
file
Program running
Standard Compiler Optimizations
☕ Literal constants are folded.
☕ String concatenation is folded.
☕ Constant fields are inlined.
☕ Dead code branches are eliminated.
☕ These do not require any flag and are part of the compiler specification before JDK 17.
String Concatenation Order of Operations (1)
☕ Strategy before JDK 19
public class Example {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("foo");
System.err.println("" + builder + builder.append("bar"));
}
}
String Concatenation Order of Operations (2)
☕ Strategy before JDK 19
public class Example {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("foo");
System.err.println("" + builder + builder.append("bar"));
// print foobarfoobar
}
}
String Concatenation Order of Operations (3)
☕ After JDK 19 evaluates each argument, eagerly convert it to a string, in left-to-right order.
public class Example {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("foo");
System.err.println("" + builder + builder.append("bar"));
// print foofoobar
}
}
[Indy String Concat Changes Order of Operations — JDK-8273914]
Warnings On Lossy Conversions (1)
☕ Evaluation error before JDK 20
public class LintExample {
public static void main(String[] args) {
long value = 5L;
long b = value + 0.1 * 3L;
}
}
Warnings On Lossy Conversions (2)
☕ Evaluation error before JDK 20
public class LintExample {
public static void main(String[] args) {
long value = 5L;
long b = value + 0.1 * 3L;
// incompatible types: possible lossy conversion
// from double to long
}
}
Warnings On Lossy Conversions (3)
☕ Evaluation before JDK 20
public class Example {
public static void main(String[] args) {
long b = 5L;
b += 0.1 * 3L;
//no error
}
}
Warnings On Lossy Conversions (4)
☕ Evaluation after JDK 20
$ javac Example.java -Xlint:all
> Example.java:4: warning: [lossy-conversions] implicit cast > from
double to long in compound assignment is possibly lossy
> b += 0.1 * 3L;
^
> 1 warning
[Warn compound assignment is possibly lossy — JDK-8244681]
Warnings about possible this escapes (1)
☕ DO NOT call overridable methods from a constructor!
public class LintExample {
public LintExample() {
System.out.println(this.hashCode());
}
public static void main(String[] args) {
new LintExample();
// all good
}
}
Warnings about possible this escapes (2)
☕ Since JDK 21 The compiler has a new -Xlint:this-escape key
$ javac LintExample.java -Xlint:[all|this-escape]
> LintExample.java 3: warning: [this-escape] possible 'this' escape
> before subclass is fully initialized
> System.out.println(this.hashCode());
^
> 1 warning
Towards Enhanced Usability
☕ Since JDK 11 you have single-file execution java HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Launch Java Applications Easier
☕ Since JDK 11 you have single-file execution java HelloWorld.java
☕ JEP 458 ㉒ Run a Java program supplied as multiple files
java -cp‘*’ HelloWorld.java
// HelloWorld.java
class HelloWorld {
public static void main(String[] args) { Helper.run();}
}
// Helper.java
class Helper {
static void run() { System.out.println("Hello World!"); }
}
Generate Great API
Documentation
Goals for API Documentation
☕ Helps with product maintenance.
☕ Technical users can understand your APIs goals.
☕ Can increase awareness/adoption of your software.
☕ Third-party developers can start quickly by trying out API examples.
Words may come easy, yet
examples require extra care.
Inserting Fragments Of Source Code In
Documentation
☕ Wrap code examples inside <pre> and {@code ...}
☕ Automatically escape special characters with {@code ...}
☕ No control over indentation
☕ No code highlighting
/**
* <p>Java class for user complex type.
* <p/>
* <p>The following schema fragment specifies the expected content for the User class.
* <p/>
* <pre> {@code
* <complexType name="user">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="id" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
* <element name="email" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="firstName” type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="userName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* }
* </pre>
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”})
public class User {
//..
/**
* <p>Java class for user complex type.
* <p/>
* <p>The following schema fragment specifies the expected content for the User class.
* <p/>
* <pre> {@code
* <complexType name="user">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* <element name="id" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
* <element name="email" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="firstName” type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="userName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* }
* </pre>
*
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”})
public class User {
//..
Enhancing Productivity and Insight  A Tour of JDK Tools Progress Beyond Java 17
Elegant Inclusion Of Code Examples
☕ JEP 413 introduced {@snippet ...} tag in JDK 18
☕ A better presentation of the targeted code examples via regions.
☕ Control code via @highlight, @replace, @link tags and using region or region=name.
/**
* <p>Java class for user complex type.
* </p>
* <p>The following schema fragment specifies the expected content for the User class.
* </p>
* {@snippet lang=xml :
* //@start region="type"
* <complexType name="user">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* //@highlight region="element" regex="name=.w+."
* <element name="id" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
* <element name="email" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="firstName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="userName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* //@end region="element"
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* //@end region="type"
* }
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”})
public class User {
/**
* <p>Java class for user complex type.
* </p>
* <p>The following schema fragment specifies the expected content for the User class.
* </p>
* {@snippet lang=xml :
* //@start region="type"
* <complexType name="user">
* <complexContent>
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
* <sequence>
* //@highlight region="element" regex="name=.w+."
* <element name="id" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/>
* <element name="email" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="firstName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* <element name="userName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
* //@end region="element"
* </sequence>
* </restriction>
* </complexContent>
* </complexType>
* //@end region="type"
* }
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”})
public class User {
Enhancing Productivity and Insight  A Tour of JDK Tools Progress Beyond Java 17
Efficient Inclusion Of Code Examples
☕ JEP 413 introduced {@snippet ...} tag in JDK 18
☕ A better presentation of the targeted code examples via regions.
☕ Control code via @highlight, @replace, @link tags and using region or region=name.
☕ The tag accepts separate files that contain the content of the snippet.
$ javadoc # other options...
--snippet-path ./src/xml User.java
/**
* <p>Java class for user complex type.
* </p>
* <p>The following schema fragment specifies the expected content for the User class.
* </p>
* {@snippet file="user.xml" lang=xml}
*
*/
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”})
public class User {
//..
/**
* <p>Java class for user complex type.
* </p>
* <p>The following schema fragment specifies the expected content for the User class.
* </p>
* {@snippet file="user.xml" lang=xml}
*
*/
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”})
public class User {
//..
Benefit of Interactive Documentation
☕ Configure the --add-script <file> option of javadoc.
$ cat interact.js
> alert("Okey-dokey! Get ready to move your fingers!");
$ javadoc # options...
$ --add-script interact.js User.java
☕ Use the option to add multiple scripts in your generated documentation.
[Add scripts to generated documentation— JDK-8275786]
Development and Deployment
Tools Updates
Fast Prototyping Java Code with jshell
☕ Quickly try, debug and learn Java and its APIs.
☕ Experiment with Java by bypassing the compile stage.
☕ Get immediate feedback on your code.
☕ Exposes a programmatic API
Highlighting Deprecated Elements,
Variables And Keywords
jshell> var check = new Boolean("true");
| Warning:
| Boolean(java.lang.String) in java.lang.Boolean has been
| deprecated and marked for removal
| var check = new Boolean("true");
| ^-----------------^
check ==> true
[jshell outlines deprecated elements ⑲ — JDK-8274148]
JDK Tool Access in jshell
☕ jshell supports loading scripts.
☕ Scripts can be local files or one of the predefined scripts.
☕ Scripts may hold any valid code snippets or jshell commands.
Predefined jshell Scripts
Predefined script Description
DEFAULT Loads the default entries, which are commonly used as imports.
JAVASE Imports all Java SE packages.
PRINTING Defines print, println, and printf as jshell methods
for use within the tool.
TOOLING㉑ Defines javac, jar, and other methods for running JDK tools
via their command-line interface within the jshell tool.
Loading TOOLING script
☕ When you start jshell
$ jshell TOOLING
☕ Inside a jshell session
jshell> /open TOOLING
Using the TOOLING script
☕ Check available tools
jshell> tools()
☕ Execute a tool command in a jshell session
jshell> run("javac", "-version")
javac 21
[JDK tools in jshell ㉑ — JDK-8306560]
What tool would you use for local
prototyping, testing or debugging a
client-server setup?
[Introducing jwebserver ⑱ — JEP 408]
Use Cases for jwebserver (1)
☕ Web development testing, to simulate locally a client-server setup.
$ jwebserver
> Binding to loopback by default. For all interfaces use "-b 0.0.0.0"
> or "-b ::".
> Serving /cwd and subdirectories on 127.0.0.1 port 8000
> URL: http://127.0.0.1:8000/
Use Cases for jwebserver (2)
☕ Web development testing, to simulate locally a client-server setup.
☕ Use static files as API stubs for web-service prototyping or application testing.
$ jwebserver -p 9000
> Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or
> "-b ::". Serving /example and subdirectories on 127.0.0.1 port 9000
> URL http://127.0.0.1:9000/
> 127.0.0.1 -- [09/Feb/2024:3:02:05 +0200] "GET /api/a1.json HTTP/1.1" 200
> 127.0.0.1 -- [09/Feb/2024:3:02:06 +0200] "GET /api/a2.json HTTP/1.1" 200
Use Cases for jwebserver (3)
☕ Web development testing, to simulate locally a client-server setup.
☕ Use static files as API stubs for web-service prototyping or application testing.
☕ Search a directory on a remote server from your local machine.
$ jwebserver -b 0.0.0.0
> Serving /work and subdirectories on 0.0.0.0 (all interfaces) port 8000
> URL http://192.168.178.41:8000/
Use Cases for jwebserver (4)
☕ Web development testing, to simulate locally a client-server setup.
☕ Web-service or application testing
☕ Search a directory on a remote server from your local machine.
☕ Great for learning purposes.
Working With The Simple Web Server API
$jshell
jshell> var server = SimpleFileServer.createFileServer(new InetSocketAddress(8080),
...> Path.of("/some/path"), OutputLevel.VERBOSE);
jshell> server.start()
The SimpleFileServer class supports the creation of
☕ file server
☕ file handler
☕ an output filter
Packaging Self-Contained
Java Applications
Intro to jpackage
☕ Packages self-contained Java applications.
☕ Prior JDK19, installing a jpackaged app was system-wide.
☕ For modular applications, jpackage will automatically run jlink and generate a runtime
with the modules needed.
Using jpackage
jpackage --input target/ --name JDemoApp --main-jar JDemoApp.jar
--main-class org.example.JDemoApp --type app-image
JDemoApp.app/
Contents/
Info.plist
MacOS/ //Application launchers
JDemoApp
Resources/ // Icons, etc.
app/
JDemoApp.cfg //Configuration info, made by jpackage
JDemoApp.jar //JAR file, copied from the --input directory
runtime/ //Java runtime image
Installation of a packaged application after
JDK 19
Application launcher will look up the .cfg file in user-specific directories.
Linux
~/.local/${PACKAGE_NAME}
~/.${PACKAGE_NAME}
macOS
~/Library/Application Support/${PACKAGE_NAME}
Windows
%LocalAppData%%PACKAGE_NAME%
%AppData%%PACKAGE_NAME%
# ${PACKAGE_NAME} and %PACKAGE_NAME% refer to jpackaged application name.
Installation of a jpackaged application
after JDK 19
Application launcher will look up the .cfg file:
☕ In user-specific directories.
☕ From the installation directory if .cfg file is not found.
☕ From the application image directory if the application launcher is executed from that location.
Security Tools Enhancements
Updated Options for keytool
☕ Since JDK 18, you can check the version of keytool and jarsigner.
$ keytool -version & jarsigner -version
[1] 83711 jarsigner 21 keytool 21
[Add -version option to keytool and jarsigner ⑱ — JDK-8272163]
Updated Options for keytool
As of JDK 21, keytool warns you when using weak password-based encryption algorithms via:
☕ -genseckey option
☕ -importpass option
[keytool warns about weak PBE algorithms ㉑ — JDK-8286907]
Detecting Weak Password-Based
Encryption Algorithms
$ keytool -genseckey -alias secret -keypass changeit 
-keyalg RC4 -keysize 128 -keystore example.p12 
-storepass changeit -storetype PKCS12 -v
> Generated 128-bit ARCFOUR secret key [Storing example.p12]
> Warning:
> The generated secret key uses the ARCFOUR algorithm which
> is considered a security risk.
Updated Options for jarsigner
☕ As of JDK 19, specify the classpath for providers via –providerPath
$ jarsigner -keystore keystore -storetype CUSTOMKS 
-providerPath /path/to/test.myks 
-providerClass my.custom.AnotherProvider signed.jar mykey
☕ The options -altsigner and -altsignerpath have been removed in JDK 21.
[Add -providerPath option to jarsigner ⑲ — JDK-8281175]
Monitoring Tools Updates
Monitoring Java Applications
Technology Goal
JDK Flight Recorder (JFR) Collects diagnostic and profiling data about a running
Java application.
JFR Event Streaming API API for the continuous consumption of JFR data on disk.
JDK Mission Control (JMC) A set of tools for managing, monitoring, profiling, and
troubleshooting Java applications.
New jfr view Command
☕ Start JFR a recording via -XX:StartFlightRecording or jcmd.
$ java -XX:StartFlightRecording -jar imaging.jar
☕ Use the PID or jar name in the command
☕ Use jps JDK tool to list all running Java processes (PID).
[JFR view command ㉑ — JDK-8306704]
jfr view Command Example
$ jcmd imaging.jar JFR.view hot-methods
30598:
Java Methods that Executes the Most
Method Samples Percent
--------------------------------------------------------------------- ------- -------
org.springframework.boot.loader.jar.JarFileEntries.sort(int, int) 1 33,33%
jdk.internal.util.ArraysSupport.signedHashCode(int, byte[], int, int) 1 33,33%
java.net.URLStreamHandler.toExternalForm(URL) 1 33,33%
Timespan: 15:46:40 - 15:56:40
JFR Event for Finalization
jdk.FinalizerStatistics
☕ Identifies classes at runtime that use finalizers.
☕ No event is sent if java --finalization=disabled.
☕ Enabled by default in the default.jfc and profile.jfc JFR configuration files.
☕ Disable via
$ jfr configure jdk.FinalizerStatistics#enabled=false #or
$ java -XX:StartFlightRecording:settings=none,+jdk.FinalizerStatistics#enabled=false
[A finalization JFR event — JDK-8266936]
Recording Initial Security Properties with JFR
jdk.InitialSecurityProperty cryptographic event.
☕ Enabled by default in the default.jfc and profile.jfc JFR configuration files.
☕ Disable via
$ jfr configure jdk.InitialSecurityProperty#enabled=false
$ #or on launch
$ java -XX:StartFlightRecording:settings=none,+jdk.InitialSecurityProperty#enabled=false
Recording Details About Security Provider
Instance Requests
jdk.SecurityProviderService cryptographic event
☕ Disabled by default.
☕ Records details about java.security.Provider.getService(…) calls.
☕ Can be enabled via:
$ jfr configure jdk.SecurityProviderService#enabled=true or
$ java -XX:StartFlightRecording:settings=none,+jdk.SecurityProviderService#enabled=true
Graph Views for Performance Analysis
and Monitoring
☕ The Graph View was updated to allow limiting the number of nodes displayed.
☕ Focus on most impactful nodes by using smart pruning.
☕ Example use case: focus on how often a specific method is ran based on sampling.
Open JFR Recording -> Method Profiling -> Select method -> Graph View
Enhancing Productivity and Insight  A Tour of JDK Tools Progress Beyond Java 17
Flame View Graphs for Performance
Analysis and Monitoring
☕ Flame View has options that limit the data displayed on the view.
☕ In the Samples drop-down, select either Allocation Size, Sample Weight or TLAB Size.
☕ Example use case: visualize where your program is spending its memory.
Open JFR Recording -> Memory -> Flame View
Enhancing Productivity and Insight  A Tour of JDK Tools Progress Beyond Java 17
New Dependency View
☕ The Dependency View shows the relationships between packages within a stack trace.
☕ Visualize dependencies as a chord graph, a circle showing how packages call one another.
☕ A chord graph has thicker lines to represent stronger connections.
☕ Example use case: check dependency view for classes in Memory page.
Open JFR Recording -> Memory -> Select Class -> Dependency View
Enhancing Productivity and Insight  A Tour of JDK Tools Progress Beyond Java 17
Stay Tuned for More
Inside.jav
a
Dev.jav
a
youtube.com/java
Useful Links
☕ Programmer’s Guide to Snippets: https://docs.oracle.com/en/java/javase/21/javadoc/programmers-guide-snippets.html
☕ Java 21 Tool Enhancements: Better Across the Board #RoadTo21 https://www.youtube.com/embed/nFJBVuaIsRg
☕ Using Jshell API https://inside.java/2022/11/21/jshell-java-source-browser/
☕ Christian Stein’s article on jshell tooling https://sormuras.github.io/blog/2023-03-09-jshell-tooling
☕ Julia Boes article on more advanced jwebserver usage https://inside.java/2021/12/06/working-with-the-simple-web-server/
☕ JEP 408 on jwebserver https://openjdk.org/jeps/408
☕ More on jpackage: https://dev.java/learn/jvm/tool/jpackage/
☕ Package a JavaFX application as a native executable https://inside.java/2023/11/14/package-javafx-native-exec/
☕ Stack Walker ep 2 on JFR https://inside.java/2023/05/14/stackwalker-02/
☕ Monitoring Java Application Security with JDK tools and JFR Events: https://dev.java/learn/security/monitor/
Ad

More Related Content

Similar to Enhancing Productivity and Insight A Tour of JDK Tools Progress Beyond Java 17 (20)

Spring Boot
Spring BootSpring Boot
Spring Boot
Jiayun Zhou
 
Commenting in Agile Development
Commenting in Agile DevelopmentCommenting in Agile Development
Commenting in Agile Development
Jan Rybák Benetka
 
Symfony2 - from the trenches
Symfony2 - from the trenchesSymfony2 - from the trenches
Symfony2 - from the trenches
Lukas Smith
 
Code Documentation. That ugly thing...
Code Documentation. That ugly thing...Code Documentation. That ugly thing...
Code Documentation. That ugly thing...
Christos Manios
 
Java doc Pr ITM2
Java doc Pr ITM2Java doc Pr ITM2
Java doc Pr ITM2
Aram Mohammed
 
Python RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutionsPython RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutions
Solution4Future
 
Java Docs
Java DocsJava Docs
Java Docs
Pallavi Srivastava
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the Trenches
Jonathan Wage
 
Advanced Java - Praticals
Advanced Java - PraticalsAdvanced Java - Praticals
Advanced Java - Praticals
Fahad Shaikh
 
Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2
Hugo Hamon
 
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
James Titcumb
 
Jacarashed-1746968053-300050282-Java.ppt
Jacarashed-1746968053-300050282-Java.pptJacarashed-1746968053-300050282-Java.ppt
Jacarashed-1746968053-300050282-Java.ppt
DilipDas70
 
Ordering System IP2buildclasses.netbeans_automatic_buildO.docx
Ordering System IP2buildclasses.netbeans_automatic_buildO.docxOrdering System IP2buildclasses.netbeans_automatic_buildO.docx
Ordering System IP2buildclasses.netbeans_automatic_buildO.docx
hopeaustin33688
 
Nick: A Nearly Headless CMS
Nick: A Nearly Headless CMSNick: A Nearly Headless CMS
Nick: A Nearly Headless CMS
Rob Gietema
 
JDBC Tutorial
JDBC TutorialJDBC Tutorial
JDBC Tutorial
Information Technology
 
Idiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin Writing
Schalk Cronjé
 
Jdbc tutorial
Jdbc tutorialJdbc tutorial
Jdbc tutorial
Dharma Kshetri
 
Play 2.0
Play 2.0Play 2.0
Play 2.0
elizhender
 
Core Java Programming Language (JSE) : Chapter II - Object Oriented Programming.
Core Java Programming Language (JSE) : Chapter II - Object Oriented Programming.Core Java Programming Language (JSE) : Chapter II - Object Oriented Programming.
Core Java Programming Language (JSE) : Chapter II - Object Oriented Programming.
WebStackAcademy
 
Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15
Murat Yener
 
Commenting in Agile Development
Commenting in Agile DevelopmentCommenting in Agile Development
Commenting in Agile Development
Jan Rybák Benetka
 
Symfony2 - from the trenches
Symfony2 - from the trenchesSymfony2 - from the trenches
Symfony2 - from the trenches
Lukas Smith
 
Code Documentation. That ugly thing...
Code Documentation. That ugly thing...Code Documentation. That ugly thing...
Code Documentation. That ugly thing...
Christos Manios
 
Python RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutionsPython RESTful webservices with Python: Flask and Django solutions
Python RESTful webservices with Python: Flask and Django solutions
Solution4Future
 
Symfony2 from the Trenches
Symfony2 from the TrenchesSymfony2 from the Trenches
Symfony2 from the Trenches
Jonathan Wage
 
Advanced Java - Praticals
Advanced Java - PraticalsAdvanced Java - Praticals
Advanced Java - Praticals
Fahad Shaikh
 
Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2Build powerfull and smart web applications with Symfony2
Build powerfull and smart web applications with Symfony2
Hugo Hamon
 
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
Kicking off with Zend Expressive and Doctrine ORM (PHP Srbija 2017)
James Titcumb
 
Jacarashed-1746968053-300050282-Java.ppt
Jacarashed-1746968053-300050282-Java.pptJacarashed-1746968053-300050282-Java.ppt
Jacarashed-1746968053-300050282-Java.ppt
DilipDas70
 
Ordering System IP2buildclasses.netbeans_automatic_buildO.docx
Ordering System IP2buildclasses.netbeans_automatic_buildO.docxOrdering System IP2buildclasses.netbeans_automatic_buildO.docx
Ordering System IP2buildclasses.netbeans_automatic_buildO.docx
hopeaustin33688
 
Nick: A Nearly Headless CMS
Nick: A Nearly Headless CMSNick: A Nearly Headless CMS
Nick: A Nearly Headless CMS
Rob Gietema
 
Idiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin WritingIdiomatic Gradle Plugin Writing
Idiomatic Gradle Plugin Writing
Schalk Cronjé
 
Core Java Programming Language (JSE) : Chapter II - Object Oriented Programming.
Core Java Programming Language (JSE) : Chapter II - Object Oriented Programming.Core Java Programming Language (JSE) : Chapter II - Object Oriented Programming.
Core Java Programming Language (JSE) : Chapter II - Object Oriented Programming.
WebStackAcademy
 
Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15Android and the Seven Dwarfs from Devox'15
Android and the Seven Dwarfs from Devox'15
Murat Yener
 

More from Ana-Maria Mihalceanu (20)

Des joyaux de code natif aux trésors Java avec jextract
Des joyaux de code natif aux trésors Java avec jextractDes joyaux de code natif aux trésors Java avec jextract
Des joyaux de code natif aux trésors Java avec jextract
Ana-Maria Mihalceanu
 
From native code gems to Java treasures with jextract
From native code gems to Java treasures with jextractFrom native code gems to Java treasures with jextract
From native code gems to Java treasures with jextract
Ana-Maria Mihalceanu
 
Exciting Features and Enhancements in Java 23 and 24
Exciting Features and Enhancements in Java 23 and 24Exciting Features and Enhancements in Java 23 and 24
Exciting Features and Enhancements in Java 23 and 24
Ana-Maria Mihalceanu
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
From native code gems to Java treasures with jextract
From native code gems to Java treasures with jextractFrom native code gems to Java treasures with jextract
From native code gems to Java treasures with jextract
Ana-Maria Mihalceanu
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Java 23 and Beyond - A Roadmap Of Innovations
Java 23 and Beyond - A Roadmap Of InnovationsJava 23 and Beyond - A Roadmap Of Innovations
Java 23 and Beyond - A Roadmap Of Innovations
Ana-Maria Mihalceanu
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Java 22 and Beyond- A Roadmap of Innovations
Java 22 and Beyond- A Roadmap of InnovationsJava 22 and Beyond- A Roadmap of Innovations
Java 22 and Beyond- A Roadmap of Innovations
Ana-Maria Mihalceanu
 
Surveillance de la sécurité des applications Java avec les outils du JDK e...
Surveillance de la sécurité des applications Java  avec les outils du JDK e...Surveillance de la sécurité des applications Java  avec les outils du JDK e...
Surveillance de la sécurité des applications Java avec les outils du JDK e...
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxA Glance At The Java Performance Toolbox
A Glance At The Java Performance Toolbox
Ana-Maria Mihalceanu
 
Monitoring Java Application Security with JDK Tools and JFR Events.pdf
Monitoring Java Application Security with JDK Tools and JFR Events.pdfMonitoring Java Application Security with JDK Tools and JFR Events.pdf
Monitoring Java Application Security with JDK Tools and JFR Events.pdf
Ana-Maria Mihalceanu
 
Java 21 Language Features and Beyond
Java 21 Language Features and BeyondJava 21 Language Features and Beyond
Java 21 Language Features and Beyond
Ana-Maria Mihalceanu
 
From Java 17 to 21- A Showcase of JDK Security Enhancements
From Java 17 to 21- A Showcase of JDK Security EnhancementsFrom Java 17 to 21- A Showcase of JDK Security Enhancements
From Java 17 to 21- A Showcase of JDK Security Enhancements
Ana-Maria Mihalceanu
 
Java 21 and Beyond- A Roadmap of Innovations
Java 21 and Beyond- A Roadmap of InnovationsJava 21 and Beyond- A Roadmap of Innovations
Java 21 and Beyond- A Roadmap of Innovations
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox
 A Glance At The Java Performance Toolbox A Glance At The Java Performance Toolbox
A Glance At The Java Performance Toolbox
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox.pdf
 A Glance At The Java Performance Toolbox.pdf A Glance At The Java Performance Toolbox.pdf
A Glance At The Java Performance Toolbox.pdf
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox-TIA.pdf
 A Glance At The Java Performance Toolbox-TIA.pdf A Glance At The Java Performance Toolbox-TIA.pdf
A Glance At The Java Performance Toolbox-TIA.pdf
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox.pdf
 A Glance At The Java Performance Toolbox.pdf A Glance At The Java Performance Toolbox.pdf
A Glance At The Java Performance Toolbox.pdf
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox.pdf
 A Glance At The Java Performance Toolbox.pdf A Glance At The Java Performance Toolbox.pdf
A Glance At The Java Performance Toolbox.pdf
Ana-Maria Mihalceanu
 
Des joyaux de code natif aux trésors Java avec jextract
Des joyaux de code natif aux trésors Java avec jextractDes joyaux de code natif aux trésors Java avec jextract
Des joyaux de code natif aux trésors Java avec jextract
Ana-Maria Mihalceanu
 
From native code gems to Java treasures with jextract
From native code gems to Java treasures with jextractFrom native code gems to Java treasures with jextract
From native code gems to Java treasures with jextract
Ana-Maria Mihalceanu
 
Exciting Features and Enhancements in Java 23 and 24
Exciting Features and Enhancements in Java 23 and 24Exciting Features and Enhancements in Java 23 and 24
Exciting Features and Enhancements in Java 23 and 24
Ana-Maria Mihalceanu
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
From native code gems to Java treasures with jextract
From native code gems to Java treasures with jextractFrom native code gems to Java treasures with jextract
From native code gems to Java treasures with jextract
Ana-Maria Mihalceanu
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Java 23 and Beyond - A Roadmap Of Innovations
Java 23 and Beyond - A Roadmap Of InnovationsJava 23 and Beyond - A Roadmap Of Innovations
Java 23 and Beyond - A Roadmap Of Innovations
Ana-Maria Mihalceanu
 
Monitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR EventsMonitoring Java Application Security with JDK Tools and JFR Events
Monitoring Java Application Security with JDK Tools and JFR Events
Ana-Maria Mihalceanu
 
Java 22 and Beyond- A Roadmap of Innovations
Java 22 and Beyond- A Roadmap of InnovationsJava 22 and Beyond- A Roadmap of Innovations
Java 22 and Beyond- A Roadmap of Innovations
Ana-Maria Mihalceanu
 
Surveillance de la sécurité des applications Java avec les outils du JDK e...
Surveillance de la sécurité des applications Java  avec les outils du JDK e...Surveillance de la sécurité des applications Java  avec les outils du JDK e...
Surveillance de la sécurité des applications Java avec les outils du JDK e...
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox
A Glance At The Java Performance ToolboxA Glance At The Java Performance Toolbox
A Glance At The Java Performance Toolbox
Ana-Maria Mihalceanu
 
Monitoring Java Application Security with JDK Tools and JFR Events.pdf
Monitoring Java Application Security with JDK Tools and JFR Events.pdfMonitoring Java Application Security with JDK Tools and JFR Events.pdf
Monitoring Java Application Security with JDK Tools and JFR Events.pdf
Ana-Maria Mihalceanu
 
Java 21 Language Features and Beyond
Java 21 Language Features and BeyondJava 21 Language Features and Beyond
Java 21 Language Features and Beyond
Ana-Maria Mihalceanu
 
From Java 17 to 21- A Showcase of JDK Security Enhancements
From Java 17 to 21- A Showcase of JDK Security EnhancementsFrom Java 17 to 21- A Showcase of JDK Security Enhancements
From Java 17 to 21- A Showcase of JDK Security Enhancements
Ana-Maria Mihalceanu
 
Java 21 and Beyond- A Roadmap of Innovations
Java 21 and Beyond- A Roadmap of InnovationsJava 21 and Beyond- A Roadmap of Innovations
Java 21 and Beyond- A Roadmap of Innovations
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox
 A Glance At The Java Performance Toolbox A Glance At The Java Performance Toolbox
A Glance At The Java Performance Toolbox
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox.pdf
 A Glance At The Java Performance Toolbox.pdf A Glance At The Java Performance Toolbox.pdf
A Glance At The Java Performance Toolbox.pdf
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox-TIA.pdf
 A Glance At The Java Performance Toolbox-TIA.pdf A Glance At The Java Performance Toolbox-TIA.pdf
A Glance At The Java Performance Toolbox-TIA.pdf
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox.pdf
 A Glance At The Java Performance Toolbox.pdf A Glance At The Java Performance Toolbox.pdf
A Glance At The Java Performance Toolbox.pdf
Ana-Maria Mihalceanu
 
A Glance At The Java Performance Toolbox.pdf
 A Glance At The Java Performance Toolbox.pdf A Glance At The Java Performance Toolbox.pdf
A Glance At The Java Performance Toolbox.pdf
Ana-Maria Mihalceanu
 
Ad

Recently uploaded (20)

Cyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of securityCyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of security
riccardosl1
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...
Vishnu Singh Chundawat
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
Rusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond SparkRusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond Spark
carlyakerly1
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
BookNet Canada
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx
Samuele Fogagnolo
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptxIncreasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Anoop Ashok
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager APIUiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPathCommunity
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
Cyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of securityCyber Awareness overview for 2025 month of security
Cyber Awareness overview for 2025 month of security
riccardosl1
 
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath MaestroDev Dives: Automate and orchestrate your processes with UiPath Maestro
Dev Dives: Automate and orchestrate your processes with UiPath Maestro
UiPathCommunity
 
What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...What is Model Context Protocol(MCP) - The new technology for communication bw...
What is Model Context Protocol(MCP) - The new technology for communication bw...
Vishnu Singh Chundawat
 
Procurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptxProcurement Insights Cost To Value Guide.pptx
Procurement Insights Cost To Value Guide.pptx
Jon Hansen
 
Rusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond SparkRusty Waters: Elevating Lakehouses Beyond Spark
Rusty Waters: Elevating Lakehouses Beyond Spark
carlyakerly1
 
TrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business ConsultingTrsLabs - Fintech Product & Business Consulting
TrsLabs - Fintech Product & Business Consulting
Trs Labs
 
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
#StandardsGoals for 2025: Standards & certification roundup - Tech Forum 2025
BookNet Canada
 
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
Transcript: #StandardsGoals for 2025: Standards & certification roundup - Tec...
BookNet Canada
 
Mobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi ArabiaMobile App Development Company in Saudi Arabia
Mobile App Development Company in Saudi Arabia
Steve Jonas
 
2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx2025-05-Q4-2024-Investor-Presentation.pptx
2025-05-Q4-2024-Investor-Presentation.pptx
Samuele Fogagnolo
 
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven InsightsAndrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell: Transforming Business Strategy Through Data-Driven Insights
Andrew Marnell
 
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptxIncreasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Increasing Retail Store Efficiency How can Planograms Save Time and Money.pptx
Anoop Ashok
 
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul Shares 5 Steps to Implement AI Agents for Maximum Business Efficien...
Noah Loul
 
Big Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur MorganBig Data Analytics Quick Research Guide by Arthur Morgan
Big Data Analytics Quick Research Guide by Arthur Morgan
Arthur Morgan
 
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
IEDM 2024 Tutorial2_Advances in CMOS Technologies and Future Directions for C...
organizerofv
 
Heap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and DeletionHeap, Types of Heap, Insertion and Deletion
Heap, Types of Heap, Insertion and Deletion
Jaydeep Kale
 
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager APIUiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPath Community Berlin: Orchestrator API, Swagger, and Test Manager API
UiPathCommunity
 
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Massive Power Outage Hits Spain, Portugal, and France: Causes, Impact, and On...
Aqusag Technologies
 
Drupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy ConsumptionDrupalcamp Finland – Measuring Front-end Energy Consumption
Drupalcamp Finland – Measuring Front-end Energy Consumption
Exove
 
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdfSAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
SAP Modernization: Maximizing the Value of Your SAP S/4HANA Migration.pdf
Precisely
 
Ad

Enhancing Productivity and Insight A Tour of JDK Tools Progress Beyond Java 17

  • 1. Enhancing Productivity and Insight A Tour of JDK Tools Progress Beyond Java 17
  • 2. Java Champion Alumni, Certified Architect Senior Developer Advocate at Oracle “DevOps Tools for Java Developers” guest author ammbra1508 ammbra1508.mastondon.social
  • 4. Goal Learn about key enhancements on the JDK tools since Java 17 so that you can efficiently code, deploy and monitor your applications. Image by Efraimstochter from Pixabay
  • 5. Source and Classfile Tools Improvements
  • 6. Compiling and Launching a Java Program IDE javac java .java source file bytecode .class file Program running
  • 7. Standard Compiler Optimizations ☕ Literal constants are folded. ☕ String concatenation is folded. ☕ Constant fields are inlined. ☕ Dead code branches are eliminated. ☕ These do not require any flag and are part of the compiler specification before JDK 17.
  • 8. String Concatenation Order of Operations (1) ☕ Strategy before JDK 19 public class Example { public static void main(String[] args) { StringBuilder builder = new StringBuilder("foo"); System.err.println("" + builder + builder.append("bar")); } }
  • 9. String Concatenation Order of Operations (2) ☕ Strategy before JDK 19 public class Example { public static void main(String[] args) { StringBuilder builder = new StringBuilder("foo"); System.err.println("" + builder + builder.append("bar")); // print foobarfoobar } }
  • 10. String Concatenation Order of Operations (3) ☕ After JDK 19 evaluates each argument, eagerly convert it to a string, in left-to-right order. public class Example { public static void main(String[] args) { StringBuilder builder = new StringBuilder("foo"); System.err.println("" + builder + builder.append("bar")); // print foofoobar } } [Indy String Concat Changes Order of Operations — JDK-8273914]
  • 11. Warnings On Lossy Conversions (1) ☕ Evaluation error before JDK 20 public class LintExample { public static void main(String[] args) { long value = 5L; long b = value + 0.1 * 3L; } }
  • 12. Warnings On Lossy Conversions (2) ☕ Evaluation error before JDK 20 public class LintExample { public static void main(String[] args) { long value = 5L; long b = value + 0.1 * 3L; // incompatible types: possible lossy conversion // from double to long } }
  • 13. Warnings On Lossy Conversions (3) ☕ Evaluation before JDK 20 public class Example { public static void main(String[] args) { long b = 5L; b += 0.1 * 3L; //no error } }
  • 14. Warnings On Lossy Conversions (4) ☕ Evaluation after JDK 20 $ javac Example.java -Xlint:all > Example.java:4: warning: [lossy-conversions] implicit cast > from double to long in compound assignment is possibly lossy > b += 0.1 * 3L; ^ > 1 warning [Warn compound assignment is possibly lossy — JDK-8244681]
  • 15. Warnings about possible this escapes (1) ☕ DO NOT call overridable methods from a constructor! public class LintExample { public LintExample() { System.out.println(this.hashCode()); } public static void main(String[] args) { new LintExample(); // all good } }
  • 16. Warnings about possible this escapes (2) ☕ Since JDK 21 The compiler has a new -Xlint:this-escape key $ javac LintExample.java -Xlint:[all|this-escape] > LintExample.java 3: warning: [this-escape] possible 'this' escape > before subclass is fully initialized > System.out.println(this.hashCode()); ^ > 1 warning
  • 17. Towards Enhanced Usability ☕ Since JDK 11 you have single-file execution java HelloWorld.java public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, World!"); } }
  • 18. Launch Java Applications Easier ☕ Since JDK 11 you have single-file execution java HelloWorld.java ☕ JEP 458 ㉒ Run a Java program supplied as multiple files java -cp‘*’ HelloWorld.java // HelloWorld.java class HelloWorld { public static void main(String[] args) { Helper.run();} } // Helper.java class Helper { static void run() { System.out.println("Hello World!"); } }
  • 20. Goals for API Documentation ☕ Helps with product maintenance. ☕ Technical users can understand your APIs goals. ☕ Can increase awareness/adoption of your software. ☕ Third-party developers can start quickly by trying out API examples.
  • 21. Words may come easy, yet examples require extra care.
  • 22. Inserting Fragments Of Source Code In Documentation ☕ Wrap code examples inside <pre> and {@code ...} ☕ Automatically escape special characters with {@code ...} ☕ No control over indentation ☕ No code highlighting
  • 23. /** * <p>Java class for user complex type. * <p/> * <p>The following schema fragment specifies the expected content for the User class. * <p/> * <pre> {@code * <complexType name="user"> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element name="id" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/> * <element name="email" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="firstName” type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="userName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * </sequence> * </restriction> * </complexContent> * </complexType> * } * </pre> * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”}) public class User { //..
  • 24. /** * <p>Java class for user complex type. * <p/> * <p>The following schema fragment specifies the expected content for the User class. * <p/> * <pre> {@code * <complexType name="user"> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * <element name="id" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/> * <element name="email" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="firstName” type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="userName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * </sequence> * </restriction> * </complexContent> * </complexType> * } * </pre> * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”}) public class User { //..
  • 26. Elegant Inclusion Of Code Examples ☕ JEP 413 introduced {@snippet ...} tag in JDK 18 ☕ A better presentation of the targeted code examples via regions. ☕ Control code via @highlight, @replace, @link tags and using region or region=name.
  • 27. /** * <p>Java class for user complex type. * </p> * <p>The following schema fragment specifies the expected content for the User class. * </p> * {@snippet lang=xml : * //@start region="type" * <complexType name="user"> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * //@highlight region="element" regex="name=.w+." * <element name="id" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/> * <element name="email" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="firstName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="userName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * //@end region="element" * </sequence> * </restriction> * </complexContent> * </complexType> * //@end region="type" * } */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”}) public class User {
  • 28. /** * <p>Java class for user complex type. * </p> * <p>The following schema fragment specifies the expected content for the User class. * </p> * {@snippet lang=xml : * //@start region="type" * <complexType name="user"> * <complexContent> * <restriction base="{http://www.w3.org/2001/XMLSchema}anyType"> * <sequence> * //@highlight region="element" regex="name=.w+." * <element name="id" type="{http://www.w3.org/2001/XMLSchema}long" minOccurs="0"/> * <element name="email" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="firstName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="lastName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * <element name="userName" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/> * //@end region="element" * </sequence> * </restriction> * </complexContent> * </complexType> * //@end region="type" * } */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”}) public class User {
  • 30. Efficient Inclusion Of Code Examples ☕ JEP 413 introduced {@snippet ...} tag in JDK 18 ☕ A better presentation of the targeted code examples via regions. ☕ Control code via @highlight, @replace, @link tags and using region or region=name. ☕ The tag accepts separate files that contain the content of the snippet. $ javadoc # other options... --snippet-path ./src/xml User.java
  • 31. /** * <p>Java class for user complex type. * </p> * <p>The following schema fragment specifies the expected content for the User class. * </p> * {@snippet file="user.xml" lang=xml} * */ */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”}) public class User { //..
  • 32. /** * <p>Java class for user complex type. * </p> * <p>The following schema fragment specifies the expected content for the User class. * </p> * {@snippet file="user.xml" lang=xml} * */ */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "user", propOrder = {"id", "email", "firstName", "lastName","userName”}) public class User { //..
  • 33. Benefit of Interactive Documentation ☕ Configure the --add-script <file> option of javadoc. $ cat interact.js > alert("Okey-dokey! Get ready to move your fingers!"); $ javadoc # options... $ --add-script interact.js User.java ☕ Use the option to add multiple scripts in your generated documentation. [Add scripts to generated documentation— JDK-8275786]
  • 35. Fast Prototyping Java Code with jshell ☕ Quickly try, debug and learn Java and its APIs. ☕ Experiment with Java by bypassing the compile stage. ☕ Get immediate feedback on your code. ☕ Exposes a programmatic API
  • 36. Highlighting Deprecated Elements, Variables And Keywords jshell> var check = new Boolean("true"); | Warning: | Boolean(java.lang.String) in java.lang.Boolean has been | deprecated and marked for removal | var check = new Boolean("true"); | ^-----------------^ check ==> true [jshell outlines deprecated elements ⑲ — JDK-8274148]
  • 37. JDK Tool Access in jshell ☕ jshell supports loading scripts. ☕ Scripts can be local files or one of the predefined scripts. ☕ Scripts may hold any valid code snippets or jshell commands.
  • 38. Predefined jshell Scripts Predefined script Description DEFAULT Loads the default entries, which are commonly used as imports. JAVASE Imports all Java SE packages. PRINTING Defines print, println, and printf as jshell methods for use within the tool. TOOLING㉑ Defines javac, jar, and other methods for running JDK tools via their command-line interface within the jshell tool.
  • 39. Loading TOOLING script ☕ When you start jshell $ jshell TOOLING ☕ Inside a jshell session jshell> /open TOOLING
  • 40. Using the TOOLING script ☕ Check available tools jshell> tools() ☕ Execute a tool command in a jshell session jshell> run("javac", "-version") javac 21 [JDK tools in jshell ㉑ — JDK-8306560]
  • 41. What tool would you use for local prototyping, testing or debugging a client-server setup? [Introducing jwebserver ⑱ — JEP 408]
  • 42. Use Cases for jwebserver (1) ☕ Web development testing, to simulate locally a client-server setup. $ jwebserver > Binding to loopback by default. For all interfaces use "-b 0.0.0.0" > or "-b ::". > Serving /cwd and subdirectories on 127.0.0.1 port 8000 > URL: http://127.0.0.1:8000/
  • 43. Use Cases for jwebserver (2) ☕ Web development testing, to simulate locally a client-server setup. ☕ Use static files as API stubs for web-service prototyping or application testing. $ jwebserver -p 9000 > Binding to loopback by default. For all interfaces use "-b 0.0.0.0" or > "-b ::". Serving /example and subdirectories on 127.0.0.1 port 9000 > URL http://127.0.0.1:9000/ > 127.0.0.1 -- [09/Feb/2024:3:02:05 +0200] "GET /api/a1.json HTTP/1.1" 200 > 127.0.0.1 -- [09/Feb/2024:3:02:06 +0200] "GET /api/a2.json HTTP/1.1" 200
  • 44. Use Cases for jwebserver (3) ☕ Web development testing, to simulate locally a client-server setup. ☕ Use static files as API stubs for web-service prototyping or application testing. ☕ Search a directory on a remote server from your local machine. $ jwebserver -b 0.0.0.0 > Serving /work and subdirectories on 0.0.0.0 (all interfaces) port 8000 > URL http://192.168.178.41:8000/
  • 45. Use Cases for jwebserver (4) ☕ Web development testing, to simulate locally a client-server setup. ☕ Web-service or application testing ☕ Search a directory on a remote server from your local machine. ☕ Great for learning purposes.
  • 46. Working With The Simple Web Server API $jshell jshell> var server = SimpleFileServer.createFileServer(new InetSocketAddress(8080), ...> Path.of("/some/path"), OutputLevel.VERBOSE); jshell> server.start() The SimpleFileServer class supports the creation of ☕ file server ☕ file handler ☕ an output filter
  • 48. Intro to jpackage ☕ Packages self-contained Java applications. ☕ Prior JDK19, installing a jpackaged app was system-wide. ☕ For modular applications, jpackage will automatically run jlink and generate a runtime with the modules needed.
  • 49. Using jpackage jpackage --input target/ --name JDemoApp --main-jar JDemoApp.jar --main-class org.example.JDemoApp --type app-image JDemoApp.app/ Contents/ Info.plist MacOS/ //Application launchers JDemoApp Resources/ // Icons, etc. app/ JDemoApp.cfg //Configuration info, made by jpackage JDemoApp.jar //JAR file, copied from the --input directory runtime/ //Java runtime image
  • 50. Installation of a packaged application after JDK 19 Application launcher will look up the .cfg file in user-specific directories. Linux ~/.local/${PACKAGE_NAME} ~/.${PACKAGE_NAME} macOS ~/Library/Application Support/${PACKAGE_NAME} Windows %LocalAppData%%PACKAGE_NAME% %AppData%%PACKAGE_NAME% # ${PACKAGE_NAME} and %PACKAGE_NAME% refer to jpackaged application name.
  • 51. Installation of a jpackaged application after JDK 19 Application launcher will look up the .cfg file: ☕ In user-specific directories. ☕ From the installation directory if .cfg file is not found. ☕ From the application image directory if the application launcher is executed from that location.
  • 53. Updated Options for keytool ☕ Since JDK 18, you can check the version of keytool and jarsigner. $ keytool -version & jarsigner -version [1] 83711 jarsigner 21 keytool 21 [Add -version option to keytool and jarsigner ⑱ — JDK-8272163]
  • 54. Updated Options for keytool As of JDK 21, keytool warns you when using weak password-based encryption algorithms via: ☕ -genseckey option ☕ -importpass option [keytool warns about weak PBE algorithms ㉑ — JDK-8286907]
  • 55. Detecting Weak Password-Based Encryption Algorithms $ keytool -genseckey -alias secret -keypass changeit -keyalg RC4 -keysize 128 -keystore example.p12 -storepass changeit -storetype PKCS12 -v > Generated 128-bit ARCFOUR secret key [Storing example.p12] > Warning: > The generated secret key uses the ARCFOUR algorithm which > is considered a security risk.
  • 56. Updated Options for jarsigner ☕ As of JDK 19, specify the classpath for providers via –providerPath $ jarsigner -keystore keystore -storetype CUSTOMKS -providerPath /path/to/test.myks -providerClass my.custom.AnotherProvider signed.jar mykey ☕ The options -altsigner and -altsignerpath have been removed in JDK 21. [Add -providerPath option to jarsigner ⑲ — JDK-8281175]
  • 58. Monitoring Java Applications Technology Goal JDK Flight Recorder (JFR) Collects diagnostic and profiling data about a running Java application. JFR Event Streaming API API for the continuous consumption of JFR data on disk. JDK Mission Control (JMC) A set of tools for managing, monitoring, profiling, and troubleshooting Java applications.
  • 59. New jfr view Command ☕ Start JFR a recording via -XX:StartFlightRecording or jcmd. $ java -XX:StartFlightRecording -jar imaging.jar ☕ Use the PID or jar name in the command ☕ Use jps JDK tool to list all running Java processes (PID). [JFR view command ㉑ — JDK-8306704]
  • 60. jfr view Command Example $ jcmd imaging.jar JFR.view hot-methods 30598: Java Methods that Executes the Most Method Samples Percent --------------------------------------------------------------------- ------- ------- org.springframework.boot.loader.jar.JarFileEntries.sort(int, int) 1 33,33% jdk.internal.util.ArraysSupport.signedHashCode(int, byte[], int, int) 1 33,33% java.net.URLStreamHandler.toExternalForm(URL) 1 33,33% Timespan: 15:46:40 - 15:56:40
  • 61. JFR Event for Finalization jdk.FinalizerStatistics ☕ Identifies classes at runtime that use finalizers. ☕ No event is sent if java --finalization=disabled. ☕ Enabled by default in the default.jfc and profile.jfc JFR configuration files. ☕ Disable via $ jfr configure jdk.FinalizerStatistics#enabled=false #or $ java -XX:StartFlightRecording:settings=none,+jdk.FinalizerStatistics#enabled=false [A finalization JFR event — JDK-8266936]
  • 62. Recording Initial Security Properties with JFR jdk.InitialSecurityProperty cryptographic event. ☕ Enabled by default in the default.jfc and profile.jfc JFR configuration files. ☕ Disable via $ jfr configure jdk.InitialSecurityProperty#enabled=false $ #or on launch $ java -XX:StartFlightRecording:settings=none,+jdk.InitialSecurityProperty#enabled=false
  • 63. Recording Details About Security Provider Instance Requests jdk.SecurityProviderService cryptographic event ☕ Disabled by default. ☕ Records details about java.security.Provider.getService(…) calls. ☕ Can be enabled via: $ jfr configure jdk.SecurityProviderService#enabled=true or $ java -XX:StartFlightRecording:settings=none,+jdk.SecurityProviderService#enabled=true
  • 64. Graph Views for Performance Analysis and Monitoring ☕ The Graph View was updated to allow limiting the number of nodes displayed. ☕ Focus on most impactful nodes by using smart pruning. ☕ Example use case: focus on how often a specific method is ran based on sampling. Open JFR Recording -> Method Profiling -> Select method -> Graph View
  • 66. Flame View Graphs for Performance Analysis and Monitoring ☕ Flame View has options that limit the data displayed on the view. ☕ In the Samples drop-down, select either Allocation Size, Sample Weight or TLAB Size. ☕ Example use case: visualize where your program is spending its memory. Open JFR Recording -> Memory -> Flame View
  • 68. New Dependency View ☕ The Dependency View shows the relationships between packages within a stack trace. ☕ Visualize dependencies as a chord graph, a circle showing how packages call one another. ☕ A chord graph has thicker lines to represent stronger connections. ☕ Example use case: check dependency view for classes in Memory page. Open JFR Recording -> Memory -> Select Class -> Dependency View
  • 70. Stay Tuned for More Inside.jav a Dev.jav a youtube.com/java
  • 71. Useful Links ☕ Programmer’s Guide to Snippets: https://docs.oracle.com/en/java/javase/21/javadoc/programmers-guide-snippets.html ☕ Java 21 Tool Enhancements: Better Across the Board #RoadTo21 https://www.youtube.com/embed/nFJBVuaIsRg ☕ Using Jshell API https://inside.java/2022/11/21/jshell-java-source-browser/ ☕ Christian Stein’s article on jshell tooling https://sormuras.github.io/blog/2023-03-09-jshell-tooling ☕ Julia Boes article on more advanced jwebserver usage https://inside.java/2021/12/06/working-with-the-simple-web-server/ ☕ JEP 408 on jwebserver https://openjdk.org/jeps/408 ☕ More on jpackage: https://dev.java/learn/jvm/tool/jpackage/ ☕ Package a JavaFX application as a native executable https://inside.java/2023/11/14/package-javafx-native-exec/ ☕ Stack Walker ep 2 on JFR https://inside.java/2023/05/14/stackwalker-02/ ☕ Monitoring Java Application Security with JDK tools and JFR Events: https://dev.java/learn/security/monitor/