There are many ways to have various software components to communicate in Java EE enterprise architecture. The same is applicable for integrating rich Internet Applications written in Adobe Flex and Java EE systems. Let’s consider the following scenario:
An application A is being developed using Flex-BlazeDS-Java, and it needs to integrate with a third-party Java-based Web application B, where the users must register, otherwise they can’t continue using the application A.
Of course, to implement this scenario you can engage some of the business process management software packages that will allow you to describe and configure the workflow with minimum or no coding. But the less moving parts are used in the architecture the better. Here’s the pretty simple way to implement our scenario.
Step 1. When the user presses the button on Flex view, the code is being executed inside the virtual machine – Flash Player, which in turn is sitting inside HTML wrapper. So the first goal is to make a call from inside the Flash Player to the outside world. Using the ActionScript class ExternalInterface you can map the internal function, say registerUserAS() to the wrapper’s JavaScript function registerUserJS(). You have to write both of these functions yourself.
Step 2. The JavaScript function registerUserJS() opens the URL of the application B in a separate Web browser window, where the user registers as required by the application B.
Step 3. In the application A, develop and deploy Java servlet, say RegistrationCompleteServlet that can be called by the application B when the user successfully completed the registration. During this call, the application B will pass to the servlet a Data Transfer Object RegistrationInfoDTO, with all required registration details.
Step 4. The RegistrationCompleteServlet and BlazeDS are collocated in the same Java Servlet container(e..g. GlassFish, Tomcat, et al). The RegistrationCompleteServlet initiates a push of the RegistrationInfoDTO to the BlazeDS destination RegistrationDest with the routing to the proper client. How to push the data to the client over the AMF protocol is described in our book Enterprise Development with Flex.
Step 5. Almost forgot to mention that during the startup, our Flex application has created a Consumer subscribed to the messages from the destination RegistrationDest. As soon as the RegistrationInfoDTO is published to this destination, Flex client will receive it and let the user into the next view with a nice greeting, “Thank you, Yakov for registering. Your credit card information has been validated”.
That’s’ all there is to it. I’ve included “Part 1” in the title of this blog, because hoping that this will become a series of writeups on integrating Flex and Java EE.
A disgusted Apache Software Foundation (ASF) has resigned its seat on the Java SE/EE Executive Committee (EC) after failing to incite the rest of the committee to spit in Oracle’s eye and hold the Java SE7 spec hostage until Oracle capitulated and gave Apache’s open source Harmony project a TCK license for Java SE. Instead of a mutiny, the EC meekly rubberstamped the Oracle-submitted spec last week. Only Apache and Google, which has got a vested interest in Harmony, voted against it. As a result, Apache is pulling its people out of all JSRs and says it “will refuse any renewal of our JCP membership and, of course, our EC position.”
"While we’ve already begun executing aggressively, this financing will help us further fuel delivery and adoption of our PaaS," said CloudBees Founder & CEO Sacha Labourey as he announced recently that CloudBees had secured $4 million in Series A financing led by Matrix Partners with participation from individual investors, including JBoss founder Marc Fleury and JBoss/HP/Bluestone veteran Bob Bickel.
Earlier this year, in an interview for Oracle, I made a statement defending hacking. Yesterday, I found a thread on theserverside.com where java developers were sharing their view on the subject. In this blog I’ll take the same two quotes there ignited some arguments and will try to explain my point of view. 1. "Recently, I've been running a seminar for a small group of Java developers. Several times they've asked me, 'Is this code an example of MVC pattern?' I got the impression that implementing MVC had become an end in itself. Using Design Patterns is not a dogma. Just write the code that makes sense. Not everything that makes sense has a named design pattern."
The Wiki war started late last Friday when PayPal “permanently restricted the account used by WikiLeaks due to a violation of the PayPal acceptable use policy, which states that our payment service cannot be used for any activities that encourage, promote, facilitate or instruct others to engage in illegal activity. We’ve notified the account holder of this action.” WikiLeaks said there was €60,000 in the PayPal account, close to $80,000. PayPal subsequently said the money would be turned over to WikiLeaks. Wired claims that “most of the over $1 million in contributions WikiLeaks has drawn in the last year have come through its PayPal account.” And the Financial Times quoted WikiLeaks as saying “its operational costs have been three times higher than it expected at the beginning of the year.” It’s unclear whether that includes Assange’s mounting legal bills.
SGI is out selling a junior version of the classic shipping container that companies have taken to using for data centers. Since it’s not your ISO standard 20- or 40-foot container it won’t be as easy or cheap to haul around. They don’t stack neatly on each other or on their bigger brothers but SGI says the new ICE Cube Air box appeals to people who don’t want to commit to the giant containers like SGI’s big ISO-standard water-cooled ICE Cube. Anyway, the eight-foot ICE Cube Air, which can house four fixed or roll-in racks, each 51U high, can scale by hitching up to four of them together side-by-side. The company says it’s already got orders for the thing which starts at $99,000 before any computing gear goes into it. It can be anybody’s x86 systems and storage. SGI’s not fussy although it hopes it will be its hardware.
Microsoft has brought home a bigger deal with the federal government than Google did last week when it hung a brace of 15,000 Gmail and Google Apps seats at the General Services Administration (GSA) on the wall. Microsoft’s got a contract for 120,000 e-mail, instant messaging, web conferencing and document-sharing seats with the Department of Agriculture. It’s supposed to be the largest government adoption of cloud software yet, according to Microsoft. Google complained that it wasn’t allowed to bid. It’s already suing the Department of the Interior over an 88,000-seat messaging contract that went to Microsoft because it specified Microsoft. Half the USDA already uses Exchange, which made its decision easier. Everything else is a confusion of other systems.
Cisco and BMC have got themselves a strategic alliance to develop and market new solutions for large-scale multi-tenant cloud infrastructures. They’re supposed to align their product roadmaps and technology architectures. As part of the alliance, they’ve got a new Integrated Cloud Delivery Platform for service providers and large-scale private cloud computing environments. It’s supposed to make it easier to deploy end-to-end cloud services on cloud infrastructures that involve data center networks, computing systems, storage and applications by eliminating many of the complex, manual steps required to set up and provision a cloud computing service.
Even before WikiLeaks mastermind Julian Assange got hauled off to Wandsworth Prison in southwest London Tuesday, vigilantes acting in support of his rogue site started unleashing a torrent of punishing denial of service attacks on the financial institutions that turned the spigot off on the donations WikiLeaks needs to survive and pay Assange’s legal bills. That includes PayPal, MasterCard, Visa and the Swiss Post bank. Amazon.com, which booted WikiLeaks off its cloud last week, was threatened again Thursday but reportedly the new avenging angel lacked the “forces” given Amazon’s EC2-style elasticity. The ruffians pushed on to PayPal. Twitter is also a possible target for not allowing WikiLeaks discussions to “trend” to the top of the heap.
Apache Software Foundation left the JCP Executive Committee. This step caused turmoil in the Java community. Java developers started take sides. How do you take sides these days? You twit, you blog, you facebook. Some die hard folks sent emails.
Why won’t I take a side too? But first, I’ll make a bold assumption. Ninety five percent of Java developers don’t even know what the JCP is. Don’t believe me? Start asking the following question while interviewing job applicants, “What’s the difference between JCP, JSP, JSR, and JSF?” Then post interesting answers as comments to this blog. It’ll be fun.
Prior to the release, each version of Java SE, ME, or EE is a described in a set of specifications. For example, two weeks ago, JSR 336 has been passed – it contained the description of the Java SE 7 content. Preparing of this document (let’s name it Borsch) if took four years after the release of Java SE 6. Similarly, Java EE is defined in e specifications for various technologies such as Servlets, JavaServer Pages (JSP), Enterprise Java Beans (EJB), Java Messaging Service (JMS) et al.
Each of these specifications has been defined by an open organization called Java Community Process (JCP). If a person or a group of people decides to propose a specification for some future technology, they would create so called Java Specification Request (JSR) and form a group of experts working on this specification. JSRs are numbered. For example, the specification for Servlets 3.0 was described in JSR 315. Let me pretend that I don’t know how painful the process of accepting the final release of JSR 315 was.
If you decide to get familiar with any specific JSR, visit this Web site . Currently, Java EE includes 45 JSRs, Java SE has 44, and Java ME (Micro Edition covers small devices) consists of 85. In other words, Java EE is (was?) based on standards.
Early in the morning, ten women have gathered in the kitchen of a poor but very friendly and outgoing lady called Sunny to cook Borsch. Each one brought her own recipe. Hours passed by but they still couldn’t agree on the set of ingredients to put in the pot. Finally, the burner was turned on, but another arguments began, “What’s the right level of the lid closure?”
Interestingly enough, the ladies didn’t care that much about the Borsch any longer. They really enjoyed The Process (a.k.a. Java Community Process). When Sunny’s husband came home, he saw ten happy ladies and no dinner on the table. No biggies. There was a pack of shrimps in the freezer, and 15 minutes later everyone enjoyed the dinner.
Am I loosing track here? Oh, yeah! Apache has left the JCP. Does it mean that these people won’t answer the phone when Oracle engineers will ask their opinion about some of the upcoming features of Java? Sure they will. Engineers always talk to engineers even though it’s sad that Oracle lawyers try to seriously censor what can be said. Are they unique in that? Hell no! Last week, one of the Java community leaders sent an email to the certain mailing list announcing that this was his last post about one Java-related subject because he was hired by Google…
Does it mean that Oracle wants to hurt Java while having all their middleware written in this great language? Of course not. Oracle has talented engineers, and they will find a way to listen to the community feedback regarding the future of Java with or without JCP. Will they cook Borsch even slower than the JCP did? I doubt it.
HTML5 introduces Application Cache, a new feature that enables you to make web apps and sites available offline. The new specification also provides an easy way to prefetch some or all of your web app’s assets (HTML files, images, CSS, JavaScript, and so on) while the client is still online. During this caching process, files are stored in an application cache, where they sit ready for future offline use. Compare this to regular browser caching, in which pages that you visit are cached in the browser’s cache based on server-side rules and client-side configuration. But—even if web pages are cached normally, this does not provide a reliable way for you to access pages while you’re in offline mode (in an airplane, for example). In addition, an application cache can cache pages that have not been visited at all and are therefore typically unavailable in the regular browser cache. Prefetching files can even speed up your site’s performance, though you are of course using bandwidth to download those files initially.
GlassFish, the Reference Implementation of Java EE 6, can easily run on multiple cloud infrastructures. Learn how to create a simple Java EE 6 sample application and deploy them on GlassFish v3 running locally and then deploy it using Amazon, RightScale, Joyent, and Elastra cloud infrastructures. In his session at the 8th International Cloud Expo, Arun Gupta, Java EE and GlassFish evangelist at Oracle, will provide a brief introduction to Java EE 6 and GlassFish v3. In addition he will talk about what Java EE currently offers for the cloud and the future directions in Java EE 7 in relation to cloud.
The open source Apache Software Foundation failed to rally the Java Community Process (JCP) to its side and force Oracle to release the Java compatibility test kits (TCKs) that would let it certify Project Harmony, its breakaway open source version of Java Standard Edition for Linux, as real Java, and rescind the Field-of-Use (FOU) restrictions that make it impossible for Harmony to be distributed under an Apache License whether it’s certified or not.
Cameron McKenzie from TheServerSide.com posted a reply and summary to Yakov's and my blog post: Java on the client...again.
Java Enterprise Edition is the most dominating platform for the enterprise applications. Hence stronger presence of Java EE as PaaS will support Cloud Adoption. Some of the players are discussed in this article. Ever since the beginning of this century a comparison between the platform capabilities of Java EE (Java Enterprise Edition) and Microsoft .NET has been a common discussion when choosing an enterprise platforms. With the advent of Cloud, Microsoft has taken a lead with the Windows Azure PaaS (Platform as a Service). Many key decision makers for cloud enablement now have questions on how good an equivalent Java EE platform could be.
For years, everything has been moving to computers. But it hasn’t always been easy. Many things about computers are highly technical, densely interrelated and generally frustrating. For businesses, it takes a lot of money to dive deeply into technology. Companies spend a material percentage of their budgets on IT-related products and services. The way the process works, you have business people who know what they want to accomplish, you have analysts who translate that into something systematic, and then highly trained developers labor for hours producing it. But that’s all changing. Remember when there used to be secretaries and typists? Today, word processors and e-mail empower everyone to type their own correspondence and documents. The same thing is happening with software.
The Independent Oracle Users Group (IOUG), which has 20,000 members, has run up an Oracle-sponsored survey that found significant cloud adoption by Oracle users. It polled 267 IT technology professionals and data managers: 29% reported they’ve already deployed an internal cloud and 37% indicated some piece of their workload processing or infrastructure is now available through private cloud services. The emphasis is on private platforms-as-a-service (with database and middleware capabilities). Adoption of private cloud services for IT workload processing or infrastructure is outpacing the use of public platform service providers, and the security of public clouds and online application services is a concern.
NetSuite – which, as it happens, is majority-owned by Larry Ellison who has just returned from a courtroom battle with SAP utterly victorious – is waving around an amusing little TCO comparison of its ERP cloud software suite against SAP’s revivified Business ByDesign (BBD) widgetry that suggests that ByDesign five-year costs run over $500,000 for only 10 users. NetSuite is supposed to be 40%–70% cheaper and naturally it claims way more bells and whistles – half again as much functionality. NetSuite used SAP’s own online TCO calculator for the SAP calculations (http://bit.ly/SAPTCO), which is supposed to demonstrate BBD’s value compared to on-premise software.
Worldwide server sales were up 14.2% in Q3 and vendor revenue spiked 15.3% to $10.66 billion, according to Gartner, which credited data center and cloud buildouts. HP retained pride of place with 32.1% of the revenues, up 1.9%. All of the top five global vendors except Oracle had year-on-year revenue increases. IBM was number two (30.2%, off 1.5%), Dell third (14.6%, up 1.2%), and Fujitsu fourth (4.7%, down a half a point). Oracle lost 1.2% of revenue share, a lot when you’re only left with 6.2%. Gartner said Dell grew its shipments 22.6% and was the only top five vendor to grow above the average. It benefited in part from a weak compare and an increased focus on its enterprise business, which the researcher says “is starting to pay dividends.”
Enterprise hosting provider Logicworks is beta testing a cloud computing service targeted at sophisticated commercial and enterprise-level projects. It's called infiniCloud and the beta will run through the end of the year, with release to follow in January. It's an on-demand service priced familiarly according to RAM-hour, storage and bandwidth utilization combined with managed services purchased à la carte at fixed monthly rates. Logicworks president Kenneth Ziegler claims cloud computing has so far been used mostly as a testing and development medium or a way to offload non-critical applications or content. "When we talk about moving ‘real apps' into the cloud, we're targeting profit centers like prime time media sites, financial and healthcare applications, massive multi-player online games, and e-commerce. There is a real need in the marketplace for blending dynamic cloud computing and managed hosting for high-performance applications. We've built our managed cloud services to address this need, starting with infiniCloud."
Projects and the Application itself in Oracle's JDeveloper 11g are capable of generating different deployment files at design time, including WAR files, EAR files, JAR files and other standard Java EE archive types. In addition JDev can generate a special JAR type specific to ADF development known as an ADF library. An ADF library differs from standard JARs in that the ADF library includes additional metadata files and constructs required for ADF application development.
To create an ADF library JAR you first need to setup an associated ADF library JAR via the project properties. This is well document in the Fusion Guide.
From here there are essentially 2 ways to actually generate the ADF library JAR. The first is within the IDE via the project right-click deploy options, and applicable to programmers developing in their JDev IDE.
The other option particularly important to build environments is the ojdeploy utility. This tool can be called via the command line or an Ant script, and is necessary for generating ADF library JAR files with the required metadata files and other ADF constructs.
In specifically considering the ant script option for ojdeploy, JDev will create a basic Ant script for building your applications via the New Gallery -> Ant -> Buildfile from Project option. In the dialog that displays selecting the "Include Packaging Tasks (uses ojdeploy)" checkbox ensures the generated Ant script includes an ojdeploy target:
The resulting Ant file will look something like this:
<?xml version="1.0" encoding="UTF-8" ?>In particular notice the Ant targets: init, clean, deploy, compile and copy. Note within the deploy target a call to the ojdeploy utility.
<project name="ViewController" default="all" basedir=".">
<property file="build.properties"/>
<path>....snipped....</path>
<target name="init">
<tstamp/>
<mkdir dir="${output.dir}"/>
</target>
<target name="all" description="Build the project" depends="deploy,compile,copy"/>
<target name="clean" description="Clean the project">
<delete includeemptydirs="true" quiet="true">
<fileset dir="${output.dir}" includes="**/*"/>
</delete>
</target>
<target name="deploy" description="Deploy JDeveloper profiles" depends="init,compile">
<taskdef name="ojdeploy" classname="oracle.jdeveloper.deploy.ant.OJDeployAntTask" uri="oraclelib:OJDeployAntTask"
classpath="${oracle.jdeveloper.ant.library}"/>
<ora:ojdeploy xmlns:ora="oraclelib:OJDeployAntTask" executable="${oracle.jdeveloper.ojdeploy.path}"
ora:buildscript="${oracle.jdeveloper.deploy.dir}/ojdeploy-build.xml"
ora:statuslog="${oracle.jdeveloper.deploy.dir}/ojdeploy-statuslog.xml">
<ora:deploy>
<ora:parameter name="workspace" value="${oracle.jdeveloper.workspace.path}"/>
<ora:parameter name="project" value="${oracle.jdeveloper.project.name}"/>
<ora:parameter name="profile" value="${oracle.jdeveloper.deploy.profile.name}"/>
<ora:parameter name="nocompile" value="true"/>
<ora:parameter name="outputfile" value="${oracle.jdeveloper.deploy.outputfile}"/>
</ora:deploy>
</ora:ojdeploy>
</target>
<target name="compile" description="Compile Java source files" depends="init">
<javac destdir="${output.dir}" classpathref="classpath" debug="${javac.debug}" nowarn="${javac.nowarn}"
deprecation="${javac.deprecation}" encoding="UTF-8" source="1.6" target="1.6">
<src path="src"/>
</javac>
</target>
<target name="copy" description="Copy files to output directory" depends="init">
<patternset id="copy.patterns">
<include name="**/*.gif"/>
<include name="**/*.jpg"/>
<include name="**/*.jpeg"/>
<include name="**/*.png"/>
<include name="**/*.properties"/>
<include name="**/*.xml"/>
<include name="**/*.ejx"/>
<include name="**/*.xcfg"/>
<include name="**/*.cpx"/>
<include name="**/*.dcx"/>
<include name="**/*.sva"/>
<include name="**/*.wsdl"/>
<include name="**/*.ini"/>
<include name="**/*.tld"/>
<include name="**/*.tag"/>
<include name="**/*.xlf"/>
<include name="**/*.xsl"/>
<include name="**/*.xsd"/>
</patternset>
<copy todir="${output.dir}">
<fileset dir="src">
<patternset refid="copy.patterns"/>
</fileset>
</copy>
</target>
</project>
If you've looked very carefully, you might have noticed I removed the nocompile option for ojdeploy. Bizarrely this boolean option takes three forms: true, false, and, the one you need to use to ensure the correct ADF constructs (such as task-flow-registry.xml) are added to the end ADF library JAR, is remove the nocompile option completely.
<project name="ViewController" default="all" basedir=".">
<property file="build.properties"/>
<path>....snipped....
<target name="deploy" description="Deploy JDeveloper profiles" depends="init,compile">
<taskdef name="ojdeploy" classname="oracle.jdeveloper.deploy.ant.OJDeployAntTask" uri="oraclelib:OJDeployAntTask"
classpath="${oracle.jdeveloper.ant.library}"/>
<ora:ojdeploy xmlns:ora="oraclelib:OJDeployAntTask" executable="${oracle.jdeveloper.ojdeploy.path}"
ora:buildscript="${oracle.jdeveloper.deploy.dir}/ojdeploy-build.xml"
ora:statuslog="${oracle.jdeveloper.deploy.dir}/ojdeploy-statuslog.xml">
<ora:deploy>
<ora:parameter name="workspace" value="${oracle.jdeveloper.workspace.path}"/>
<ora:parameter name="project" value="${oracle.jdeveloper.project.name}"/>
<ora:parameter name="profile" value="${oracle.jdeveloper.deploy.profile.name}"/>
<ora:parameter name="outputfile" value="${oracle.jdeveloper.deploy.outputfile}"/>
</ora:deploy>
</ora:ojdeploy>
</target>
</project>
During the last six months I had a pet project for Wiley Publishing. I’ve been writing a new Java tutorial. It’ll teach Java programming in a little bit different style than traditional Java books. But let me tell you what’s the title of the book: "Java Programming 24-Hour Trainer". I can almost hear the voices, "Yeah, yeah, yeah…Yet another promise to teach me Java in no time. How about teaching me Java in 24 minutes?"
This is not to state that you can learn the software covered in this book within 24 hours of studying. This is about having a trainer that’s with you 24 hours a day. This book is a set of short chapters with minimum amount of theory but with an instructional DVD, with screencasts recorded by yours truly. There is a screencast for each lesson except the last one.
This relatively small 500-page book consists of 38 lessons and covers both Core Java and Java EE 6. Each lesson is from 10 to 15 pages long so you won’t even have time to fall asleep. Each screencast is from 10 to 15 minute long so you won’t have time to get bored. At the end of this lesson is an assignment to complete. In this book I use Eclipse IDE and GlassFish v3 is the application server that I like.
Just look at these thirty eight lesson titles and give me a good reason why you shouldn’t be pre-ordering this book. Know Java already? Doesn’t really matter. I thought I knew it too before I started writing this book. Now I know it better. It’ll help the newbie’s to learn and seasoned Java programmers to refresh their knowledge, especially when it’s time to make a career move. These are the lesson titles:
1 Introducing Java
2 Eclipse IDE
3 Object-Oriented Programming
4 Class Methods
5 Back to Java Basics
6 Packages, Interfaces and Encapsulation
7 Programming with Abstract Classes and Interfaces
8 Introducing the Graphic User Interface
9 Event Handling in UI
10 Introduction to Java Applets
11 Developing a Tic-Tac-Toe Applet
12 Developing a Ping-Pong Game
13 Error Handling
14 Introduction to Collections
15 Introduction to Generics
16 Working with Streams
17 Java Serialization
18 Network Programming
19 Sending E-mails with Java
20 Introduction to Multithreading
21 Digging Deeper into Concurrent Execution
22 Working with Databases Using JDBC
23 Swing with JTable
24 Annotations and Reflection
25 Remove Method Invocation
26 Java EE 6 Overview
27 Programming with Servlets
28 JavaServer Pages
29 Developing Web Applications with JSF
30 Introducing JMS and MOM
31 Introducing JNDI
32 Introduction to Enterprise JavaBeans
33 Introduction to Java Persistence API
34 Working with RESTful Web Services
35 Introduction to Spring MVC Framework
36 Introduction to Hibernate Framework
37 Bringing JavaFX to the mix
38 Java Technical Interviews
This book will hit the bookstores in February and you can pre-order it on Amazon at this address. I hope you’ll enjoy reading this book as much as I enjoyed writing it.
One of the characteristic features of the 20th and 21st century is broadband internet. High technologies, managed networks, internet connection and the like surround, merge and are part of the everyday life of a human being. What are the advantages of it? There used to be very highly developed civilizations on the Earth. However one must also notice that our modern society has brought to the table and is still bringing in many new achievements. One of the characteristic features of the 20th and 21st century is broadband internet. High technologies, managed networks, internet connection and the like surround, merge and are part of the everyday life of a human being. In almost all spheres of our lives we are affected by technological progress. Why is this so? It is demanded and works effectively because it is permanently developing. It never ceases in its development. That is why it brings a lot of advantages.
OpenXava is a framework for Rapid Development of business applications using Java. The OpenXava 4.0 has been released recently, with many User Interface improvements (RIA), and more possibilities for developers (Groovy, JPA 2.0, DI). OpenXava is a framework for rapid development of business applications using Java. It is easy to learn and one can have an application up in no time. At the same time, OpenXava is extensible, customizable and the application code is structured in a very pure object oriented way, allowing you to develop arbitrarily complex applications. The OpenXava approach for rapid development differs from those that use visual environments (like Visual Basic or Delphi) or scripting (like PHP). Instead, OpenXava uses a model-driven development approach, where the core of your application are Java classes that model your problem. This means you can stay productive while still maintaining a high level of encapsulation.
Terracotta’s BigMemory for Enterprise Ehcache snap-in solution to Java’s garbage collection (GC) nightmare has emerged from six weeks in beta with 250–300 registered users and has gone GA. Testing of the pure Java Ehcache add-on reportedly indicated application performance was steady, predictable and completely linear up to 350 gigs of cache without custom tuning. The company is now trying to get its hands on a Dell box with 500 gigs of memory for further validation. Such boxes are becoming increasingly the norm but are next to impossible for Java to use to improve performance because of erratic garbage collection pauses.