Carrier classes are Project Amber’s current idea to extend some of records’ benefits to regular classes. Probably the most important among them is deconstruction, which would allow classes to participate in pattern matching and reconstruction. In recent weeks, there have been two mails to the Amber mailing list that describe that idea, and in this episode we discuss them both as well as the evolution between them. We also hear why syntax discussions often provide negative value and get a sneak peak at what will likely be the next Project Amber language feature.
Just ahead of the JavaOne speakers dinner, Nicolai Parlog sits down with Brian Goetz, Java Language Architect in Oracle’s Java Platform Group, for this “Ask the Architect” episode of the Inside Java Podcast.
Links:
Make sure to also check the Duke’s Corner podcast on dev.java.
For more episodes, check out Inside Java, our YouTube playlist, and follow @Java on Twitter.
Contact us here.
]]>Building a compelling desktop app today requires features such as UI controls, charts, interactive media, web content, animation, CSS styling, 2D and 3D rendering, rich text, and property binding, with an easy-to-use programming paradigm that runs cross-platform. JavaFX is all this and more, delivering a rich graphical UI toolkit for building your applications and can also seamlessly interoperate with Swing.
In this session you’ll learn about the new and exciting features we’ve developed over the past couple of years, culminating with the release of JavaFX 26. You’ll also get an update on RichTextArea. We’ll show plenty of demos and sample code, and finish with a sneak peek at what’s coming next.
Make sure to check the JavaOne 2026 playlist.
]]>_Let’s quickly review in definitely under 3 minutes the 10 JEPs (JDK Enhancement Proposals) that were included in the JDK 26 release! Couldn’t make it to JavaOne? Catch the biggest moments by joining us on our livestreams for the opening Keynote and Community Keynotes right here on the Java YouTube Channel! _
Make sure to check the show-notes.
]]>]]>
Cloud native adoption is now mainstream. Kubernetes usage in production has soared to 82% among container[1], and Java applications constitute a substantial share within those clusters. As Kubernetes adoption continues to grow, the need for monitoring, managing and observing Java applications in containers have become more crucial…
In cloud-native architectures, services are typically decomposed into many microservices running across multiple pods. As a result, effective troubleshooting and performance analysis depend on correlating telemetry data (logs, metrics, and traces) across services and performing cross-JVM analysis to diagnose bottlenecks.
While managed Kubernetes platforms provide infrastructure-level metrics such as CPU, memory, logs, and pod health, they do not natively expose JVM-level diagnostic data. JDK Flight Recorder (JFR) is a JVM specific tool that provide these diagnostics such as garbage collection behaviour, allocation profiling, lock contention, safe point analysis, CPU profile shifts, and thread state transitions.
Java Management Service (JMS) in OCI leverages the JFR capabilities to address this gap by providing secure, fleet-scale orchestration of JFR across distributed Kubernetes environments.
Traditional approach to get JVM diagnostics is by accessing the running JVM directly via JMX or command-line tools like jcmd. However, modern microservices architecture introduces following complexities:
These complexities introduce several operational challenges:
jlink-generated runtimes, which may limit the availability of diagnostic utilities within the container.JMS, an OCI native service, provides monitoring and management for Java workloads. It extends OCI observability by enabling secure, scalable JFR captures across Kubernetes clusters without exposing the JMX endpoints or requiring direct container access. It is implemented as a plugin to the Oracle Management Agent (OMA)[3] and key capabilities includes:
JMS enables centralized capture of JFR recordings from a specific container or across selected application containers within a cluster. Through the JMS console or APIs, administrators can select the target workload, configure recording parameters, and initiate a JFR capture request. Upon completion, the recordings from each container are automatically exported to the designated Object Storage bucket. These recordings can then be analysed to diagnose performance bottlenecks, optimize resource utilization, and gain actionable insights into Java application behaviour.
Figure 1: Architecture Overview
JMS integrates with the Oracle Management Agent (OMA) service, which is deployed in the Kubernetes cluster using the OCI Kubernetes Monitoring Solution[2]. The JMS plugin runs within the OMA pod and interacts with application pods to collect Java telemetry data and perform JFR operations.
The JMS plugin communicates with the JMS service running in OCI to transmit telemetry data and manage JFR capture requests. Using Kubernetes client APIs, the plugin discovers Java workloads in the cluster, retrieves Java runtime usage details, and executes commands within the application containers to start and stop JFR recordings. The captured telemetry and JFR data are sent securely to JMS service and Object storage respectively. The JMS console displays this data, providing insights into Java runtime versions and application details across the Kubernetes environment.
Administrators can monitor Java application in active containers and trigger or schedule JFRs.
Operational workflow:
Figure 2: JMS Console displaying active Java containers and JFR controls
In case of an incident, administrators can trigger JFR across all replicas in a single action during live production troubleshooting.
JMS can be integrated with OCI Monitoring to trigger JFR based on real time Kubernetes metrics.
Operational workflow:
(Phase enhancements are planned to reduce trigger latency (~ 10 minutes) for near-immediate recordings)
Automatically capture JFR for a fixed duration after each production deployment and detect performance regression early.
Operational workflow:
Run JFR for 48–72 hours after and compare allocation rate, thread states, blocking time, CPU profile shifts. This reduces MTTR and prevents regression from surfacing an alert noise.
As Kubernetes adoption accelerates, infrastructure-level observability is no longer enough for Java workloads. Organizations need secure JVM intelligence embedded into their cloud operations model. With JMS, OCI provides a centralized framework for Java runtime governance and fleet-scale JFR orchestration across cloud native environments.
Java 26 is getting all packaged up to be shipped worldwide! As with every release of the JDK there are a number of new features, improvements, changes in behavior, and more developers should be aware of before upgrading. In this episode of the Inside Java Newscast we will review all the noteworthy changes coming in Java 26 that will impact developers.
Links to JDK Enhancement Proposals (JEPs):
Links to JDK Bug Systems (JBS) tickets:
Make sure to also check the Duke’s Corner podcast on dev.java.
For more episodes, check out Inside Java, our YouTube playlist, and follow @Java on Twitter.
Contact us here.
]]>The OpenJDK Quality Group is promoting the testing of FOSS projects with OpenJDK builds as a way to improve the overall quality of the release. This heads-up is part of a regular communication sent to the projects involved. To learn more about the program, and how-to join, please check here.
BCP 47, first introduced in 1995, defines tags to identify languages and its primary subtag (the first of potentially multiple subtags) is usually drawn from the much older ISO 639-1 standard. There are exceptions, though, among them these three languages:
Before JDK 17, Java treated the ISO-639 tags of these three languages as canonical and mapped the BCP 47 tags to them (see Locale’s documentation under Legacy language codes):
static void printLocales(String iso, String bcp) {
System.out.println(Locale.forLanguageTag(iso) + " | " + Locale.forLanguageTag(bcp));
}
// on JDK < 17, ISO 639 tags are preferred:
public static void main(String[] args) {
printLocales("iw", "he"); // ~> "iw | iw"
printLocales("in", "id"); // ~> "in | in"
printLocales("ji", "yi"); // ~> "ji | ji"
}
This changed in JDK 17 and since then the default behavior was to map to BCP 47 tags:
// on JDK 17+, BCP 47 tags are preferred:
public static void main(String[] args) {
printLocales("iw", "he"); // ~> "he | he"
printLocales("in", "id"); // ~> "id | id"
printLocales("ji", "yi"); // ~> "yi | yi"
}
To allow applications to update to Java 17 and later without requiring immediate code changes, the temporary system property java.locale.useOldISOCodes was introduced.
Setting it to true reverted to the behavior before Java 17.
JDK 25 deprecated java.locale.useOldISOCodes and JDK 27 will remove it.
Setting it will result in a warning:
WARNING: The system property "java.locale.useOldISOCodes" is no longer supported. Any specified value will be ignored.
Code that relies on java.locale.useOldISOCodes needs to be updated to consistently expect BCP 47 tags when querying Locale instances.
It will remain possible to use the ISO 639 tags to instantiate Locale instances for Hebrew, Indonesian, and Yiddish.