This document provides an overview of tools available in the Java Development Kit (JDK) that allow for powerful introspection and manipulation of the Java Virtual Machine (JVM) and running applications. It discusses the java.lang.instrument API for injecting Java agents, the Java Debugging Interface (JDI) for debugging, the JVM Tool Interface (JVMTI) for heap and frame introspection, and examples of using these tools to build interactive debuggers, inject code at runtime, and test concurrency. Code samples and links to further resources are also provided.
An overview how to realize code generation of languages on the JVM that implement other class layouts than the Java programming languages. As an example, the inline-mock-maker for Mockito is discussed which supports languages like Kotlin that make any property final by default.
Making Java more dynamic: runtime code generation for the JVMRafael Winterhalter
While Java’s strict type system is a great help for avoiding programming errors, it also takes away some of the flexibility that developers appreciate when using dynamic languages. By using runtime code generation, it is possible to bring some of this flexibility back to the Java virtual machine. For this reason, runtime code generation is widely used by many state-of-the-art Java frameworks for implementing POJO-centric APIs but it also opens the door to assembling more modular applications. This presentation offers an introduction to the complex of runtime code generation and its use on the Java platform. Furthermore, it discusses the up- and downsides of several code generation libraries such as ASM, Javassist, cglib and Byte Buddy.
Java 9 introduces modules to the Java programming language and its runtime. Despite this feature being optional, due to the modularization of the standard library existing applications might behave differently when running on a version 9 JVM. Furthermore, because of changes in the runtime, existing libraries and frameworks might not yet correctly process your modularized code. As a result, updating to a Java 9 VM and taking Java 9 into brings its challanges.
This talk discusses the practical implications of module boundaries and analyzes new limitations Java 9 imposes on the reflection API. This talk explains how reflection is used in popular frameworks like Spring and Hibernate and explains why existing applications might break or change their behavior when facing modularized code. Finally, this talk showcases alternatives to now failing Java programming patterns and weights their robustness with regard to the Java releases 10 and upward.
The presenter is an active contributor to open source and helped to migrate many popular Java libraries to supporting Java 9. As a consequence, he as been working with Java 9 for almost two years.
GeeCON 2017 - TestContainers. Integration testing without the hassleAnton Arhipov
TestContainers is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.
An overview how to realize code generation of languages on the JVM that implement other class layouts than the Java programming languages. As an example, the inline-mock-maker for Mockito is discussed which supports languages like Kotlin that make any property final by default.
Making Java more dynamic: runtime code generation for the JVMRafael Winterhalter
While Java’s strict type system is a great help for avoiding programming errors, it also takes away some of the flexibility that developers appreciate when using dynamic languages. By using runtime code generation, it is possible to bring some of this flexibility back to the Java virtual machine. For this reason, runtime code generation is widely used by many state-of-the-art Java frameworks for implementing POJO-centric APIs but it also opens the door to assembling more modular applications. This presentation offers an introduction to the complex of runtime code generation and its use on the Java platform. Furthermore, it discusses the up- and downsides of several code generation libraries such as ASM, Javassist, cglib and Byte Buddy.
Java 9 introduces modules to the Java programming language and its runtime. Despite this feature being optional, due to the modularization of the standard library existing applications might behave differently when running on a version 9 JVM. Furthermore, because of changes in the runtime, existing libraries and frameworks might not yet correctly process your modularized code. As a result, updating to a Java 9 VM and taking Java 9 into brings its challanges.
This talk discusses the practical implications of module boundaries and analyzes new limitations Java 9 imposes on the reflection API. This talk explains how reflection is used in popular frameworks like Spring and Hibernate and explains why existing applications might break or change their behavior when facing modularized code. Finally, this talk showcases alternatives to now failing Java programming patterns and weights their robustness with regard to the Java releases 10 and upward.
The presenter is an active contributor to open source and helped to migrate many popular Java libraries to supporting Java 9. As a consequence, he as been working with Java 9 for almost two years.
GeeCON 2017 - TestContainers. Integration testing without the hassleAnton Arhipov
TestContainers is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container.
Java agents and their instrumentation API offer developers the most powerful toolset to interact with a Java application. Using this API, it becomes possible to alter the code of running applications, for example to add monitoring or to inject security checks as it is done by many enterprise products for the Java ecosystem.
In this session, developers will learn how to program Java agents of their own that make use of the instrumentation API. Doing so, developers learn how the majority of tooling for the JVM is implemented and will learn about Byte Buddy, a high level code generation library that does not require any knowledge of Java byte code that is normally required for writing agents. In the process, developers will see how Java classes can be used as templates for implementing highly performant code changes that avoid the boilerplate of alternative solutions such as AspectJ or Javassist while still performing better than agents implemented in low-level libraries such as ASM.
While software engineers can disagree on almost any concept of programming best-practice, the necessity of writing unit tests remains undisputed. With the advent of concurrent applications and the ongoing deprecation of the one-thread-per-request model, unit tests do however miss an increasing fraction of programming errors such as race conditions or dead-locking code. But is it even possible to write tests that revise such errors? In the end, a good unit test is characterized by a determined execution path what effectively prevents the use of concurrency within a single test. However, there are tools and programming principles that allow for unit tests of concurrent code. This talk reviews typical mistakes made when concurrent code is tested and introduces Thread Weaver, a test suite for writing valid unit tests that uncover concurrency-related programming errors.
While most bugs reveal their cause within their stack trace, Java’s OutOfMemoryError is less talkative and therefore regarded as being difficult to debug by a majority of developers. With the right techniques and tools, memory leaks in Java programs can however be tackled like any other programming error. This talks discusses how a JVM stores data, categorizes different types of memory leaks that can occur in a Java program and presents techniques for fixing such errors. Furthermore, we will have a closer look at lambda expressions and their considerable potential of introducing memory leaks when they are used incautiously.
https://www.youtube.com/watch?v=VNmtmz3mJN4&
Deep dive into InjectionTDD - how to perform iOS unit tests realtime, without rebuilding entire Xcode project.
#ITsubbotnik Spring 2017: Roman Iovlev "Java edge in test automation"epamspb
Автоматизаторы старатются упростить рутинную работу ручных тестировщиков, но оказывается и работу автоматизатора можно улучшить. Сделать написание авто тестов проще, быстрее и с большим качеством.
Как этого добиться? Об этом я и хочу рассказать.
Мы поговорим про возможности Java 8, популярную библиотеку-плагин Lombok и мощный фреймворк для автоматизированного тестирования JDI.
Ten useful JavaScript tips & best practicesAnkit Rastogi
In this presentation there are ten useful JavaScript techniques which can be included in your application easily with less friction along with some AngularJs tips and best practices as a bonus. These tips and best practices are accompanied by examples & will cover script loading, design pattern, performance optimization and other areas.
Since best practices are very subjective topics, proper benchmarking needs to be done.
JEEConf 2017 - Having fun with JavassistAnton Arhipov
Javassist makes Java bytecode manipulation simple. At ZeroTurnaround we use Javassist a lot to implement the integrations for our tools.
In this talk we will go through the examples of how Javassist can be applied to alter the applications behavior and do all kind of fun stuff with it.
Why is it interesting? Because while trying to do unusual things in Java, you learn much more about the language and the platform itself and learning about Javassist will actually make you a better Java developer!
Java agents and their instrumentation API offer developers the most powerful toolset to interact with a Java application. Using this API, it becomes possible to alter the code of running applications, for example to add monitoring or to inject security checks as it is done by many enterprise products for the Java ecosystem.
In this session, developers will learn how to program Java agents of their own that make use of the instrumentation API. Doing so, developers learn how the majority of tooling for the JVM is implemented and will learn about Byte Buddy, a high level code generation library that does not require any knowledge of Java byte code that is normally required for writing agents. In the process, developers will see how Java classes can be used as templates for implementing highly performant code changes that avoid the boilerplate of alternative solutions such as AspectJ or Javassist while still performing better than agents implemented in low-level libraries such as ASM.
While software engineers can disagree on almost any concept of programming best-practice, the necessity of writing unit tests remains undisputed. With the advent of concurrent applications and the ongoing deprecation of the one-thread-per-request model, unit tests do however miss an increasing fraction of programming errors such as race conditions or dead-locking code. But is it even possible to write tests that revise such errors? In the end, a good unit test is characterized by a determined execution path what effectively prevents the use of concurrency within a single test. However, there are tools and programming principles that allow for unit tests of concurrent code. This talk reviews typical mistakes made when concurrent code is tested and introduces Thread Weaver, a test suite for writing valid unit tests that uncover concurrency-related programming errors.
While most bugs reveal their cause within their stack trace, Java’s OutOfMemoryError is less talkative and therefore regarded as being difficult to debug by a majority of developers. With the right techniques and tools, memory leaks in Java programs can however be tackled like any other programming error. This talks discusses how a JVM stores data, categorizes different types of memory leaks that can occur in a Java program and presents techniques for fixing such errors. Furthermore, we will have a closer look at lambda expressions and their considerable potential of introducing memory leaks when they are used incautiously.
https://www.youtube.com/watch?v=VNmtmz3mJN4&
Deep dive into InjectionTDD - how to perform iOS unit tests realtime, without rebuilding entire Xcode project.
#ITsubbotnik Spring 2017: Roman Iovlev "Java edge in test automation"epamspb
Автоматизаторы старатются упростить рутинную работу ручных тестировщиков, но оказывается и работу автоматизатора можно улучшить. Сделать написание авто тестов проще, быстрее и с большим качеством.
Как этого добиться? Об этом я и хочу рассказать.
Мы поговорим про возможности Java 8, популярную библиотеку-плагин Lombok и мощный фреймворк для автоматизированного тестирования JDI.
Ten useful JavaScript tips & best practicesAnkit Rastogi
In this presentation there are ten useful JavaScript techniques which can be included in your application easily with less friction along with some AngularJs tips and best practices as a bonus. These tips and best practices are accompanied by examples & will cover script loading, design pattern, performance optimization and other areas.
Since best practices are very subjective topics, proper benchmarking needs to be done.
JEEConf 2017 - Having fun with JavassistAnton Arhipov
Javassist makes Java bytecode manipulation simple. At ZeroTurnaround we use Javassist a lot to implement the integrations for our tools.
In this talk we will go through the examples of how Javassist can be applied to alter the applications behavior and do all kind of fun stuff with it.
Why is it interesting? Because while trying to do unusual things in Java, you learn much more about the language and the platform itself and learning about Javassist will actually make you a better Java developer!
Presented at JavaOne 2013, Tuesday September 24.
"Data Modeling Patterns" co-created with Ian Robinson.
"Pitfalls and Anti-Patterns" created by Ian Robinson.
A graph is a structure composed of a set of vertices (i.e.~nodes, dots) connected to one another by a set of edges (i.e.~links, lines). The concept of a graph has been around since the late 19th century, however, only in recent decades has there been a strong resurgence in the development of both graph theories and applications. In applied computing, since the late 1960s, the interlinked table structure of the relational database has been the predominant information storage and retrieval paradigm. With the growth of graph/network-based data and the need to efficiently process such data, new data management systems have been developed. In contrast to the index-intensive, set-theoretic operations of relational databases, graph databases make use of index-free traversals. This presentation will discuss the graph traversal programming pattern and its application to problem-solving with graph databases.
JVM Mechanics: When Does the JVM JIT & Deoptimize?Doug Hawkins
HotSpot promises to do the "right" thing for us by identifying our hot code and compiling "just-in-time", but how does HotSpot make those decisions?
This presentation aims to detail how HotSpot makes those decisions and how it corrects its mistakes through a series of demos that you run yourself.
Lambda Chops - Recipes for Simpler, More Expressive CodeIan Robertson
While the new Streams API has been a great showcase for lambda methods, there are many other ways this new language feature can be used to make friendlier APIs and more expressive code. Lambdas can be used for a number of tasks which historically required significant boilerplate, type-unsafe constructs, or both. From new ways to express metedata, to emulating Groovy's null-safe navigation operator, we'll take a look at a myriad of ways, big and small, that you can use lambdas to improve APIs and streamline your code. We'll also look at some of the limitations of lambdas, and some techniques for overcoming them.
JavaFX 8 est disponible depuis mars 2014 et apporte son lot de nouveautés. Gradle est en version 2 depuis juillet 2014. Deux technologies plus que prometteuses: JavaFX donne un coup de jeune au développement d’applications desktop en Java en apportant un navigateur web intégré, le support des WebSockets, de la 3D, et bien d’autres. Gradle est l’outil de d’automatisation de build à la mode, apportant de superbes possibilités par rapport rapport à maven, outil vieillissant, grâce à l’engouement de la communauté vis à vis de cet outil mais aussi par le fait de la technologie utilisée en son sein: groovy. Venez découvrir comment il est possible de réaliser rapidement une application à la mode en JavaFX avec un outil à la mode également. Bref venez à une session trendy.
Azul Virtual Machine Engineer Douglas Hawkins describes how decisions made by the JVM affect how your code is compiled and run. Learn how this affects application performance and what steps you can take to optimize how the JVM acts on your code.
Epistemic Interaction - tuning interfaces to provide information for AI supportAlan Dix
Paper presented at SYNERGY workshop at AVI 2024, Genoa, Italy. 3rd June 2024
https://alandix.com/academic/papers/synergy2024-epistemic/
As machine learning integrates deeper into human-computer interactions, the concept of epistemic interaction emerges, aiming to refine these interactions to enhance system adaptability. This approach encourages minor, intentional adjustments in user behaviour to enrich the data available for system learning. This paper introduces epistemic interaction within the context of human-system communication, illustrating how deliberate interaction design can improve system understanding and adaptation. Through concrete examples, we demonstrate the potential of epistemic interaction to significantly advance human-computer interaction by leveraging intuitive human communication strategies to inform system design and functionality, offering a novel pathway for enriching user-system engagements.
zkStudyClub - Reef: Fast Succinct Non-Interactive Zero-Knowledge Regex ProofsAlex Pruden
This paper presents Reef, a system for generating publicly verifiable succinct non-interactive zero-knowledge proofs that a committed document matches or does not match a regular expression. We describe applications such as proving the strength of passwords, the provenance of email despite redactions, the validity of oblivious DNS queries, and the existence of mutations in DNA. Reef supports the Perl Compatible Regular Expression syntax, including wildcards, alternation, ranges, capture groups, Kleene star, negations, and lookarounds. Reef introduces a new type of automata, Skipping Alternating Finite Automata (SAFA), that skips irrelevant parts of a document when producing proofs without undermining soundness, and instantiates SAFA with a lookup argument. Our experimental evaluation confirms that Reef can generate proofs for documents with 32M characters; the proofs are small and cheap to verify (under a second).
Paper: https://eprint.iacr.org/2023/1886
State of ICS and IoT Cyber Threat Landscape Report 2024 previewPrayukth K V
The IoT and OT threat landscape report has been prepared by the Threat Research Team at Sectrio using data from Sectrio, cyber threat intelligence farming facilities spread across over 85 cities around the world. In addition, Sectrio also runs AI-based advanced threat and payload engagement facilities that serve as sinks to attract and engage sophisticated threat actors, and newer malware including new variants and latent threats that are at an earlier stage of development.
The latest edition of the OT/ICS and IoT security Threat Landscape Report 2024 also covers:
State of global ICS asset and network exposure
Sectoral targets and attacks as well as the cost of ransom
Global APT activity, AI usage, actor and tactic profiles, and implications
Rise in volumes of AI-powered cyberattacks
Major cyber events in 2024
Malware and malicious payload trends
Cyberattack types and targets
Vulnerability exploit attempts on CVEs
Attacks on counties – USA
Expansion of bot farms – how, where, and why
In-depth analysis of the cyber threat landscape across North America, South America, Europe, APAC, and the Middle East
Why are attacks on smart factories rising?
Cyber risk predictions
Axis of attacks – Europe
Systemic attacks in the Middle East
Download the full report from here:
https://sectrio.com/resources/ot-threat-landscape-reports/sectrio-releases-ot-ics-and-iot-security-threat-landscape-report-2024/
Encryption in Microsoft 365 - ExpertsLive Netherlands 2024Albert Hoitingh
In this session I delve into the encryption technology used in Microsoft 365 and Microsoft Purview. Including the concepts of Customer Key and Double Key Encryption.
PHP Frameworks: I want to break free (IPC Berlin 2024)Ralf Eggert
In this presentation, we examine the challenges and limitations of relying too heavily on PHP frameworks in web development. We discuss the history of PHP and its frameworks to understand how this dependence has evolved. The focus will be on providing concrete tips and strategies to reduce reliance on these frameworks, based on real-world examples and practical considerations. The goal is to equip developers with the skills and knowledge to create more flexible and future-proof web applications. We'll explore the importance of maintaining autonomy in a rapidly changing tech landscape and how to make informed decisions in PHP development.
This talk is aimed at encouraging a more independent approach to using PHP frameworks, moving towards a more flexible and future-proof approach to PHP development.
In his public lecture, Christian Timmerer provides insights into the fascinating history of video streaming, starting from its humble beginnings before YouTube to the groundbreaking technologies that now dominate platforms like Netflix and ORF ON. Timmerer also presents provocative contributions of his own that have significantly influenced the industry. He concludes by looking at future challenges and invites the audience to join in a discussion.
The Art of the Pitch: WordPress Relationships and SalesLaura Byrne
Clients don’t know what they don’t know. What web solutions are right for them? How does WordPress come into the picture? How do you make sure you understand scope and timeline? What do you do if sometime changes?
All these questions and more will be explored as we talk about matching clients’ needs with what your agency offers without pulling teeth or pulling your hair out. Practical tips, and strategies for successful relationship building that leads to closing the deal.
Dev Dives: Train smarter, not harder – active learning and UiPath LLMs for do...UiPathCommunity
💥 Speed, accuracy, and scaling – discover the superpowers of GenAI in action with UiPath Document Understanding and Communications Mining™:
See how to accelerate model training and optimize model performance with active learning
Learn about the latest enhancements to out-of-the-box document processing – with little to no training required
Get an exclusive demo of the new family of UiPath LLMs – GenAI models specialized for processing different types of documents and messages
This is a hands-on session specifically designed for automation developers and AI enthusiasts seeking to enhance their knowledge in leveraging the latest intelligent document processing capabilities offered by UiPath.
Speakers:
👨🏫 Andras Palfi, Senior Product Manager, UiPath
👩🏫 Lenka Dulovicova, Product Program Manager, UiPath
Accelerate your Kubernetes clusters with Varnish CachingThijs Feryn
A presentation about the usage and availability of Varnish on Kubernetes. This talk explores the capabilities of Varnish caching and shows how to use the Varnish Helm chart to deploy it to Kubernetes.
This presentation was delivered at K8SUG Singapore. See https://feryn.eu/presentations/accelerate-your-kubernetes-clusters-with-varnish-caching-k8sug-singapore-28-2024 for more details.
Climate Impact of Software Testing at Nordic Testing DaysKari Kakkonen
My slides at Nordic Testing Days 6.6.2024
Climate impact / sustainability of software testing discussed on the talk. ICT and testing must carry their part of global responsibility to help with the climat warming. We can minimize the carbon footprint but we can also have a carbon handprint, a positive impact on the climate. Quality characteristics can be added with sustainability, and then measured continuously. Test environments can be used less, and in smaller scale and on demand. Test techniques can be used in optimizing or minimizing number of tests. Test automation can be used to speed up testing.
Observability Concepts EVERY Developer Should Know -- DeveloperWeek Europe.pdfPaige Cruz
Monitoring and observability aren’t traditionally found in software curriculums and many of us cobble this knowledge together from whatever vendor or ecosystem we were first introduced to and whatever is a part of your current company’s observability stack.
While the dev and ops silo continues to crumble….many organizations still relegate monitoring & observability as the purview of ops, infra and SRE teams. This is a mistake - achieving a highly observable system requires collaboration up and down the stack.
I, a former op, would like to extend an invitation to all application developers to join the observability party will share these foundational concepts to build on:
By Design, not by Accident - Agile Venture Bolzano 2024
JDK Power Tools
1. JDK Power Tools
an overview of fun and useful tools
the JDK already provides you with
Tobias Lindaaker
Software Developer @ Neo Technology
twitter:! @thobe / @neo4j / #neo4j
email:! tobias@neotechnology.com
web:! http://neo4j.org/
web:! http://thobe.org/
7. public static void agentmain(
String agentArgs, Instrumentation inst)
7
๏Executed when the agent attaches to an already running JVM
๏Instrumentation parameter is optional in the signature
๏META-INF/MANIFEST.MF:
•Agentmain-Class
+the same optional parameters as for premain():
+Boot-Class-Path
+Can-Redefine-Classes
+Can-Retransform-Classes
+Can-Set-Native-Method-Prefix
๏Requires support for loading agents in the JVM
๏Allows to add code to the JVM after-the-fact
8. The Use Case: add code live
๏Provide statically accessible entry point into your app
๏From here extend the app with the code loaded by the agent
๏Used by the JDK, when attaching with jconsole through PID
8
9. com.sun.tools.attach
๏com.sun.tools.attach.VirtualMachine
•Represents a JVM process
•static methods providing entry points for:
‣attaching to a JVM by process id
‣listing all running JVM processes (like jps)
๏Example (from the docs, simplified from jconsole source code):
// attach to target VM
VirtualMachine vm = VirtualMachine.attach( "1337" );
// get system properties in target VM
Properties props = vm.getSystemProperties();
// construct path to management agent
String agent = props.getProperty( "java.home" )
+ File.separator + "lib"
+ File.separator + "management-agent.jar";
// load agent into target VM, spcifying parameters for the agent
vm.loadAgent( agent, "com.sun.management.jmxremote.port=5000" );
// done - detach
vm.detach(); 9
10. Tricks: Registry-less RMI
๏RMI Registry just provides serialized objects specifying:
•Implemented Remote interfaces
•How to reach the actual object (host+port+id)
๏You can serialize the object yourself and pass it as the string
parameter to an agent
๏Now your agent has a talkback channel to the process that
spawned it
10
12. Java Debugging Interface
12
Building an interactive
debugger is HARD, but
that isn’t the only thing
you can do with the JDI.
A Scriptable debugger is
much easier to build.
13. SubprocessTestRunner
13
๏Runs a JUnit test case in a sub process
๏Host process connects to the sub process with JDI
๏Define breakpoints for the code under test
๏Useful for triggering certain ordering between threads
•Triggering race conditions
๏Used at Neo Technology for Concurrency Regression Tests
•Prefer refactoring to allow testing concurrency,
but that isn’t always the appropriate short term solution
14. Simple example
@RunWith(SubprocessTestRunner.class)
public class SampleTest {
@Debugger.Using(BreakPoints.class)
@Test public void shouldHandleRaceCondition() {
new Sample().entryPoint();
}
static class BreakPoints extends Debugger {
List<Integer> loopVariables = new ArrayList<Integer>();
{ enable( "handle_someMethod" ); }
@Handler(on=ENTRY,type=Sample.class,method="someMethod")
void handle_someMethod() {
enable( "handle_loopBody" );
}
@Handler(on=ENTRY,type=Sample.class,method="loopBody")
void handle_loopBody(){
loopVariables.add( frame( 1 ).getInt( "i" ) );
}
@Override protected void finish() {
assertEquals( asList( 1, 2, 3, 4 ), loopVariables );
}
}
} 14
15. Simple example
@RunWith(SubprocessTestRunner.class)
public class SampleTest {
@Debugger.Using(BreakPoints.class)
@Test public void shouldHandleRaceCondition() {
new Sample().entryPoint();
}
static class BreakPoints extends Debugger {
List<Integer> loopVariables = new ArrayList<Integer>();
{ enable( "handle_someMethod" ); }
@Handler(on=ENTRY,type=Sample.class,method="someMethod")
void handle_someMethod() {
enable( "handle_loopBody" );
}
@Handler(on=ENTRY,type=Sample.class,method="loopBody")
void handle_loopBody(){
loopVariables.add( frame( 1 ).getInt( "i" ) );
}
@Override protected void finish() {
assertEquals( asList( 1, 2, 3, 4 ), loopVariables );
}
}
} 14
public class Sample {
public void entryPoint() {
for ( int i = 0; i < 5; i++ ) {
loopBody();
someMethod();
}
}
private void someMethod() { /* do nothing */ }
private void loopBody() { /* do nothing */ }
}
23. Frame introspection
๏Native interface (JVMTI)
๏Abilities:
•Get method and instruction offset for each element on stack
•Force early return from method
•Pop frame and re-run method
•Get local variable from call stack
•Get notification when frame is popped (method is exited)
(Forcing a frame to be popped does not trigger the event)
17
24. Dynamic access to local variables
public @Test void sampleOfAccessingLiveCallFrame() {
int anInt = 4; // random number - by dice
String aString = "some string value";
18
25. Dynamic access to local variables
public @Test void sampleOfAccessingLiveCallFrame() {
int anInt = 4; // random number - by dice
String aString = "some string value";
// get the tool
ToolingInterface tools =
ToolingInterface.getToolingInterface();
18
26. Dynamic access to local variables
public @Test void sampleOfAccessingLiveCallFrame() {
int anInt = 4; // random number - by dice
String aString = "some string value";
// get the tool
ToolingInterface tools =
ToolingInterface.getToolingInterface();
// get the frame
CallFrame myFrame = tools.getCallFrame( 0 );
18
27. Dynamic access to local variables
public @Test void sampleOfAccessingLiveCallFrame() {
int anInt = 4; // random number - by dice
String aString = "some string value";
// get the tool
ToolingInterface tools =
ToolingInterface.getToolingInterface();
// get the frame
CallFrame myFrame = tools.getCallFrame( 0 );
// get local
assertEquals( anInt, frame.getLocal( "anInt" ) );
18
28. Dynamic access to local variables
public @Test void sampleOfAccessingLiveCallFrame() {
int anInt = 4; // random number - by dice
String aString = "some string value";
// get the tool
ToolingInterface tools =
ToolingInterface.getToolingInterface();
// get the frame
CallFrame myFrame = tools.getCallFrame( 0 );
// get local
assertEquals( anInt, frame.getLocal( "anInt" ) );
// update local
anInt = 17; // most random number - proven!
assertEquals( anInt, frame.getLocal( "anInt" ) );
18
29. Dynamic access to local variables
public @Test void sampleOfAccessingLiveCallFrame() {
int anInt = 4; // random number - by dice
String aString = "some string value";
// get the tool
ToolingInterface tools =
ToolingInterface.getToolingInterface();
// get the frame
CallFrame myFrame = tools.getCallFrame( 0 );
// get local
assertEquals( anInt, frame.getLocal( "anInt" ) );
// update local
anInt = 17; // most random number - proven!
assertEquals( anInt, frame.getLocal( "anInt" ) );
// fancy get
assertSame( aString
((CallFrame)myFrame.getLocal( "myFrame" ))
.getLocal( "aString" ) );
18
30. Dynamic access to local variables
public @Test void sampleOfAccessingLiveCallFrame() {
int anInt = 4; // random number - by dice
String aString = "some string value";
// get the tool
ToolingInterface tools =
ToolingInterface.getToolingInterface();
// get the frame
CallFrame myFrame = tools.getCallFrame( 0 );
// get local
assertEquals( anInt, frame.getLocal( "anInt" ) );
// update local
anInt = 17; // most random number - proven!
assertEquals( anInt, frame.getLocal( "anInt" ) );
// fancy get
assertSame( aString
((CallFrame)myFrame.getLocal( "myFrame" ))
.getLocal( "aString" ) );
// convenient this
assertSame( this, frame.getThis() );
}
18
33. Heap introspection
๏Native interface (JVMTI)
๏Abilities:
•Following references
•Tagging objects and classes
•Getting tagged objects
•Transitive reachability traversal
•Iterating through all reachable objects
•Iterating through all objects (reachable and not)
•Iterating through all instances of a class
•Getting object size
•Getting object monitor usage 21
38. Web resources
26
๏Java Debug Interface (JDI):
http://docs.oracle.com/javase/7/docs/jdk/api/jpda/jdi/
๏JVM Tooling Interface:
http://docs.oracle.com/javase/7/docs/platform/jvmti/jvmti.html
๏JNI - JVMTI is an “extension” of JNI:
http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/jniTOC.html
๏Overview of JDK tools:
http://docs.oracle.com/javase/7/docs/technotes/tools/index.html
๏JVM Attach API:
http://docs.oracle.com/javase/7/docs/jdk/api/attach/spec/
39. Code samples
๏http://github.com/thobe/java-tooling, contains:
•Library for building tools in java
‣Soon: cross compiled native binaries for Mac OS X,Windows, Linux
•Code examples showing how to use these tools
๏https://github.com/thobe/subprocess-testing, contains:
•JDI-based JUnit TestRunner
๏http://github.com/thobe/java-agent, contains:
•Java agent code injection
๏http://github.com/thobe/introscript, contains:
•javax.script.ScriptEngine that attaches to other process
and introspects it with above tools
27