Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… ·...
Transcript of Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… ·...
![Page 1: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/1.jpg)
Optimising large dynamic code bases.
![Page 2: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/2.jpg)
2 28/07/2014
Who am I?
Duncan MacGregor
Lead Software Engineer on the Magik on Java project at General Electric in Cambridge
Aardvark179 on twitter
![Page 3: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/3.jpg)
3 28/07/2014
What is Magik?
• Dynamic, weakly typed message passing based language
• Does everything "wrong" i.e. numerical type promotion, closures over mutable values, etc.
• Not that special in terms of the language.
![Page 4: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/4.jpg)
4 28/07/2014
So what does make it special?
• It s tightly integrated with a long transaction version managed data store.
• There are large applications built using it.
• No, larger than that, I mean really large
![Page 5: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/5.jpg)
5 28/07/2014
So what is large?
• A typical application with an open database has 200,000 methods defined
• About 10% of those are record field accessors and other code generated by the ORM
![Page 6: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/6.jpg)
6 28/07/2014
It gets worse
• There are bigger data models out there, some with over 4000 tables
• Many customers will use third party add ons and their own customisations which may be almost as large as the base apps
![Page 7: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/7.jpg)
7 28/07/2014
What are our main concerns?
• Performance must be good enough
• Need to startup and open the database as fast as possible
• Must not use ridiculous amounts of memory as the application is used
• Warmup time needs to be as short as possible
![Page 8: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/8.jpg)
8 28/07/2014
What I’m going to talk about today
• Memory usage
• Startup time
• Smoothing the path of moving from an old VM to a new one
![Page 9: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/9.jpg)
Memory usage
![Page 10: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/10.jpg)
Where we started on Java 8
![Page 11: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/11.jpg)
11 28/07/2014
First steps running on Java 8
• Measure startup speed relative to Java 7
• Examine memory relative to Java 7
• Take heap dumps as the application is used
• Project memory usage of fully exercised application
![Page 12: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/12.jpg)
12 28/07/2014
What's using the memory?
1. LambdaForms
2. LambdaForms
3. LambdaForms
4. Concurrent Collections (!)
5. Atomics
6. Everything else
![Page 13: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/13.jpg)
13 28/07/2014
LambdaForms!
• Binding followed by adapting generated many many LFs
• Likewise drop arguments
• These combined to make SwitchPoint GWT surprising inefficient
![Page 14: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/14.jpg)
14 28/07/2014
Concurrent collections?
• We want a run time as lock free as possible—a bad application shouldn't lock up core language infrastructure
• Concurrent collections are great in small numbers
• If every method has a little one to hold type adapted versions then the memory adds up
![Page 15: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/15.jpg)
15 28/07/2014
Atomics
• Again, we want things lock free if possible
• Methods have
• SwitchPoints to handle invalidation
• Flags
• Other meta-data
• All held in atomics to support update by multiple threads
![Page 16: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/16.jpg)
16 28/07/2014
What is everything else?
• Antlr’s lexer generation produces large short arrays
• Our globals are stored in a prefix tree, we need to move them to a more compact structure
• Reflection caches can be huge
• Many other small things, but they add up
![Page 17: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/17.jpg)
Reducing memory usage
![Page 18: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/18.jpg)
18 28/07/2014
Prototyping / proof of concept
• Change MH adaption order
• Cache unbound adapters for CallSites
• Reduce the PIC of each site to 1
• Write our own SwitchPoint class
![Page 19: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/19.jpg)
19 28/07/2014
Old CallSite fallback adaption
Fallback
Bind to CallSite
Type adaption
Exact Invoker
Fold
![Page 20: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/20.jpg)
20 28/07/2014
Old CallSite fallback adaption
Fallback
Bind to CallSite
Type adaption
Exact Invoker
Fold
![Page 21: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/21.jpg)
21 28/07/2014
New CallSite fallback adaption
Fallback
Type adaption
Exact Invoker
Bind to CallSite Fold
Drop argument
![Page 22: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/22.jpg)
22 28/07/2014
New CallSite fallback adaption
Fallback
Type adaption
Exact Invoker
Bind to CallSite Fold
Drop argument
![Page 23: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/23.jpg)
23 28/07/2014
GuardWithTest issue
Guard With Test
Bind to Class
ClassCheck
Fallback Target
![Page 24: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/24.jpg)
24 28/07/2014
Drop arguments
GuardWithTest issue
Guard With Test
Bind to Class
ClassCheck
Fallback Target
![Page 25: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/25.jpg)
25 28/07/2014
Bind to Class
GuardWithTest solution
Guard With Test
Drop arguments
ClassCheck
Fallback Target
![Page 26: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/26.jpg)
26 28/07/2014
Bind to Class
GuardWithTest solution
Guard With Test
Drop arguments
ClassCheck
Fallback Target
![Page 27: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/27.jpg)
27 28/07/2014
Bind to Class
GuardWithTest solution
Guard With Test
Drop arguments
ClassCheck
Fallback Target
![Page 28: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/28.jpg)
28 28/07/2014
SwitchPoint dynamicInvoker
GET_TARGET
Bind to CallSite
Type adaption
Exact Invoker
Fold
![Page 29: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/29.jpg)
29 28/07/2014
SwitchPoint dynamicInvoker
GET_TARGET
Bind to CallSite
Type adaption
Exact Invoker
Fold
![Page 30: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/30.jpg)
30 28/07/2014
SwitchPoint guardWithTest
Guard With Test
Drop Arguments
Invoker
Fallback Target
![Page 31: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/31.jpg)
31 28/07/2014
SwitchPoint guardWithTest
Guard With Test
Bind to CallSite
Fold
Fallback Target
Type adaption
GET_TARGET
ExactInvoker
![Page 32: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/32.jpg)
32 28/07/2014
SwitchPoint guardWithTest
Guard With Test
Bind to CallSite
Fold
Fallback Target
Type adaption
GET_TARGET
ExactInvoker
![Page 33: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/33.jpg)
33 28/07/2014
Did it help?
• Yes! More than halved the LFs
• Applications feel faster when first started
• Memory usage significantly reduced
![Page 34: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/34.jpg)
34 28/07/2014
Putting it into production
• Started by tackling easy parts. Concurrent collections, Atomics etc.
• Then refactor call sites
• This work is still on going
![Page 35: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/35.jpg)
35 28/07/2014
CallSites: optimising for the common cases
• Method calls are complex
• Normal, super, self…
• How many results?
• All sites supported instrumentation
• Added complexity to each instance
![Page 36: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/36.jpg)
36 28/07/2014
Refactor into many classes
Normal Call Call To Self Super Call
Single Result Single PrivateSingle SuperPrivateSingle
Tuple Result Tuple PrivateTuple SuperPrivateTuple
Unknown Number of Results
Private SuperPrivate
![Page 37: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/37.jpg)
37 28/07/2014
Move towards functional composition
• Hard to build a good class hierarchy without repetition
• Some functionality based on choices at runtime (instrumentation etc.)
• Allows megamorphic costs to only be paid by the sites that need it
![Page 38: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/38.jpg)
38 28/07/2014
Unexpected advantages
0 5,000 10,000 15,000 20,000 25,000 30,000 35,000 40,000 45,000
MethodSendPrivateSingleCallSite
MethodSendSingleCallSite
MethodSendTupleCallSite
MethodSendPrivateTupleCallSite
MethodSendCallSite
MethodSendPrivateCallSite
MethodSendSuperPrivateSingleCallSite
MethodSendSuperPrivateCallSite
MethodSendSuperPrivateTupleCallSite
Number
![Page 39: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/39.jpg)
Start up and database open
![Page 40: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/40.jpg)
40 28/07/2014
Bootstrapping the system
• Bootstrapping the system involves loading a lot of code that is only run once
• Loading a class looks up MethodHandle constants repeatedly
• Loading a module causes resources to be scanned on disk
![Page 41: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/41.jpg)
41 28/07/2014
Improving this
• Improving Java’s MH constant caching improves our start up time by over 10%
• Emitting fewer larger classes may also help
• Restructure our resource system to stop using the file system
• We may look at more radical solutions depending on where the time is spent
![Page 42: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/42.jpg)
42 28/07/2014
Opening the database
• Lots of meta-programming
• Subclasses for record types
• Field access methods
• Join navigation
• …
• Old VM allowed images to be saved after all this had been initialised
![Page 43: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/43.jpg)
43 28/07/2014
Opening the database… faster
• Creating new classes requires reflection
• Cache data on classes you know you’ll need again
• Be very careful about the reflection calls you make, some are faster than others
• Be very focused about invalidating CallSites
![Page 44: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/44.jpg)
44 GE Title or job number
7/28/2014
Why?
0
10
20
30
40
50
60
MagikSF Alchemy(Java 7u25)
Alchemy(Java 8)
Unoptimised class/method creation
0
2
4
6
8
10
12
MagikSF Alchemy(Java 7u25)
Alchemy(Java 8)
After performance work
![Page 45: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/45.jpg)
45 28/07/2014
Serialisation
• Need to turn the whole data dictionary into a series of blobs
• Some things are hard to serialise
• Want to restore database connections in parallel—trial by fire for thread safety
• Additional work then needed to stitch everything back together
![Page 46: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/46.jpg)
46 28/07/2014
How much faster is it?
0
10
20
30
40
50
60
70
80
Without serialisation With serialisation
Time to open database
![Page 47: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/47.jpg)
47 28/07/2014
What’s still to do?
• Fix some concurrency bugs
• Test with more databases
![Page 48: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/48.jpg)
Easing the transition
![Page 49: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/49.jpg)
49 28/07/2014
Need to help people moving from our old VM
• Used to running tests with some form of coverage analysis
• Not used to threads being truly concurrent
![Page 50: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/50.jpg)
50 28/07/2014
Coverage of non-Java languages
• Jacoco can compile coverage stats without any problems
• We’ve run large test suites through it and nothing terrible happened
• Displaying those results is a different story
![Page 51: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/51.jpg)
51 28/07/2014
Coverage results
• Presenting coverage data for a large code base requires hierarchical display
• The packages for your classes need to be in a good hierarchy as well or the results still won’t be managable
• If the class file contains info about the source file then use that, don’t depend on Java source conventions
![Page 52: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/52.jpg)
52 28/07/2014
How much work is this?
• Prototyping changes to Jacoco took an afternoon
• Haven’t turned those into proper patches yet
• Changes to our compiler still to be done
![Page 53: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/53.jpg)
53 28/07/2014
Threading
• We can instrument thread creation and use of atomic queues and locks
• That only catches the cases where people thought about thread safety at all
![Page 54: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/54.jpg)
Summary
![Page 55: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/55.jpg)
55 28/07/2014
• MethodHandle caching and reuse is vital
• Serialisation and optimising meta-programming really help startup speeds
• No easy answers for finding concurrency issues
![Page 56: Optimising large dynamic code bases. › technetwork › java › jvmls2014macgregor-2… · version managed data store. •There are large applications built using it. •No, larger](https://reader034.fdocuments.us/reader034/viewer/2022052612/5f1056437e708231d4489c07/html5/thumbnails/56.jpg)