#127

CONTENTS INCLUDE:

n Whats New in JPA 2.0

n Getting Started with JDBC Properties n Access Mode n Mappings n JPA 2.0 Shared Cache n Additional API and more... By Mike Keith Visit refcardz.com

Get More Refcardz! Refcardz! Get More

JPA 2.0 JPA Getting Started with

DZone, Inc. | www.dzone.com #162

CONTENTS INCLUDE: n Configuration n JMX Profiling with VisualVM n Available Plugins X-Ray Vision for Dramatic Performance Gains n Java Types n JVM Settings By Mick Knutson n and More! Visit refcardz.com

Tomcat: ABOUT VISUALVM

export CATALINA_OPTS=”” VisualVM is a visual tool integrating several command-line JDK tools and lightweight profiling capabilities. Designed for both production and development time use, it further enhances the capability of monitoring and Jetty standalone: performance analysis for the Java SE platform. http://visualvm.java.net/ java “” -jar start.jar etc/jetty-jmx.xml CONFIGURATION Maven:

Get More Refcardz! Repositories Windows 7: C:\Users\[userId]\AppData\Roaming\.\[version]\ export MAVEN_OPTS=”” repository\ oS X: /Users/[userId]/Library/Application Support/visualvm/[version]/ repository/ Container specific configuration parameters Name Parameter User Directory Access file -Dcom.sun.management.jmxremote.access.file= oS X: /Users/[userId]/Library/Application Support/visualvm/[version]/ Authenticate -Dcom.sun.management.jmxremote.authenticate= Windows 7: C:\Users\[userId]\AppData\Roaming\.visualvm\[version]\var\ Debug -Djavax.net.debug= log\message.log JMX port -Dcom.sun.management.jmxremote.port= oS X: /Users/[userId]/Library/Application Support/visualvm/[version]/var/ log/message.log JMX remote -Dcom.sun.management.jmxremote enabled JMX * Keystore file -Djavax.net.ssl.keyStore= * Keystore -Djavax.net.ssl.keyStorePassword= JMX connections password Default connection: Management -Djavax.management.level= level : Password file -Dcom.sun.management.jmxremote.password file= Detailed connection: RMI server -Djava.rmi.server.hostname= hostname

service:jmx:: SSL enabled -Dcom.sun.management.jmxremote.ssl=

Detailed connection example:

service:jmx:rmi://:/jndi/rmi://:/jmxrmi

Container specific configuration Configuration for exposing JMX. Glassfish administration:

JVM options can be set via Glassfish web administration page: http://localhost:4848/common/javaConfig/serverJvmOptions. jsf?configName=server-config Glassfish configuration file:

%GLASSFISH_HOME%\\domains\[domain]\config\domain.xml configuration file:

... ... ... Java Profiling with VisualVM

DZone, Inc. | www.dzone.com 2 Java Profiling with VisualVM

Name Parameter Name Description * Truststore -Djavax.net.ssl.trustStore= JVM Probes For monitoring various virtual machine internals, such file as I/O metrics, GC metrics and HotSpot utilization. * Truststore -Djavax.net.ssl.trustStorePassword= Jvmstat Probes For visualizing the metrics exported by the monitored password JVM as jvmstat counters (including sun.gc.jvmstat, sun.perfdata.jvmstat, sun.threads.jvmstat, etc.). * Located in VisualVM options inside the security plugin. Swing Probes Provide detailed information about AWT and Swing GUI performance in terms of paints count, layout times and AVAILABLE PLUGINS events utilization. JavaFX Probes For monitoring the performance of various logical parts Stable Plugins of JavaFX applications. Name Description DTrace Probes Provides low-level system metrics, including JVM overhead, utilization of each CPU or syscalls numbers. MBean Browser MBeans Browser plugin provides in general the These probes are available only for the Solaris/ same functionality as MBeans Browser in JConsole OpenSolaris OS. JDK tool: shows MBeans of an application, displays values, operations and notifications. In VisualVM, JConsole Plugins the browser will be further improved to deliver better usability and support for the latest JMX Name Description features. JTop A plugin for monitoring per- CPU usage and state. Visual GC Plugin Visual GC attaches to an application and collects Top Threads Plugin for monitoring per-thread CPU usage and state. and graphically displays garbage collection, class http://lsd.luminis.nl/top-threads-plugin-for-jconsole/ loader, and HotSpot compiler performance data. Hibernate Monitors Hibernate via its JMX exports. The plugin Tracer Framework and GUI for detailed monitoring and displays graphs and details on queries, entities, analyzing Java applications. Using various types collections and cache efficiency. http://hibernate-jcons. of probes, the Tracer gathers metrics from an sourceforge.net/ application and displays the data in a timeline. The data are displayed both graphically and in a table and can be exported to common formats for further Plugins in development processing in external tools. Name Description Thread Inspector Enables analyzing stack trace(s) of one or more Glassfish Provides additional information for GlassFish servers, e.g., selected threads directly without requiring you to thenumber of active sessions, processed transactions etc. take and open full thread dumps. This is extremely It's also able to monitor each deployed web application useful for quick and easy analyzing of various separately. threading problems. OQL Syntax Enhanced editor for OQL Console in HeapWalker providing BTrace BTrace is a dynamic tracing tool for Java. With Support syntax coloring and basic code completion. this plugin you can create, deploy and save BTrace tracing scripts directly from the VisualVM. Third-Party Plugins VisualVM Extensions The intent of this module is to add support for additional functionality (such as new JDKs, JVMs, Name Description HotSpot versions, etc.) not supported by the VisualVM core modules at the time VisualVM was Thread Dump Analyzer The Thread Dump Analyzer (TDA) for Java is released. It's always a good idea to get this plugin (TDA) a small GUI for analyzing Thread Dumps and for a fresh VisualVM installation. Heap Information generated by the Sun Java VM. It provides statistics about thread dumps, Security The GUI for setting the keystore, truststore, gives information about locked monitors, protocols and ciphers for SSL/TLS connections in waiting threads and much more. http://java.net/ VisualVM. Using the plugin is equivalent to setting projects/tda appropriate system properties javax.net.ssl.* and javax.rmi.ssl.client.* OSGI Enables basic management of OSGi platforms via JMX. For detailed description and installation Buffer Monitor Monitors usage of direct buffers created by instructions visit the plugin page. ByteBuffer.allocateDirect and mapped buffers created by FileChannel.map. Note that the buffers GCViewer A new garbage collection monitoring plugin for monitoring requires the monitored application to VisualVM allows for investigating crucial GC run JDK 7 starting from Build 36. metrics in greater detail and higher resolution. This is recommended especially for monitoring Kill Applications Kills monitored applications that became latency-constrained Java applications. unresponsive. System Tray Minimize/restore running the VisualVM instance GCViewer only works with OpenJDK and Hotspot by exploiting into/from system tray. Not supported on Mac OS X JVMStat API to access built-in HotSpot counters. For some (does nothing). Hot reason the new parallel GC (-XX:+UseParNewGC) does not Tip expose all the counters as the parallel scavenging collector does JVM Capabilities Displays capabilities of monitored application's (-XX:+UseParallelGC), so only the former GC Pauses and Promoted JVM. vs Survived charts will work. Java ME Profiler Opens Java ME SDK profiler file in VisualVM. Snapshot Viewer JAVA MEMORY TYPES JConsole plugins Provides support for using existing JConsole container plugins inside VisualVM. When a Java application is started, the Java process pre-allocates a given Tracer probes block of memory from the underlying that is dedicated to the Java process. Addressable Java memory consists of a heap, Name Description permanent generation, and other memory spaces. The other memory Monitor Probes For monitoring CPU & GC activity, heap & permgen space includes variables for JNI, Stack space, and the running Java Virtual usage, number of loaded classes and application Machine (JVM). A Java application can store variables in either the stack threads. or heap spaces, depending upon the type and scope of the variable being stored.

DZone, Inc. | www.dzone.com 3 Java Profiling with VisualVM

Java stack • Performance tuning options are knobs that can be used to tune VM The Java stack space consists of local variables, method calls, arguments, performance. reference variables, intermediate computations, and return values, if any, corresponding to the method invoked. Primitive data type variables such as • Debugging options generally enable tracing, printing, or output of int, long, float and double are also stored in the stack space. VM information.

Every thread, including the main thread and daemon threads, gets its own Java heap options stack space but will share the same heap space. Option & default value Description The memory-for-stack space does not need to be contiguous and follows a -Xms set initial Java heap size Last In, First out (LIFO) algorithm. -Xmx set maximum Java heap size Java permanent generation -Xss set java thread stack size The Java permanent generation space, or permGen, consists of reflective data of the virtual machine such as Class and Method objects. When new Behavioral Options Class or Method types are created at runtime, new space is allocated in the permGen space for these types. Option & default value Description [The (original) copying collector When this collector kicks in, all Java heap (Enabled by default)] application threads are stopped, and The Java heap spaces consist of instances of Objects, instance variables, the copying collection precedes using and instance-level references to Objects. one thread (which means only one CPU, even if on a multi-CPU machine). This There are three types of heaps: is known as a stop-the-world collection because,basically, the JVM pauses • Eden Space (young generation): pool from which memory is initially everything else until the collection is completed. allocated for most objects. -XX:-AllowUserSignalHandlers Do not complain if the application • Survivor Spaces (young generation): two pools containing objects installs signal handlers. (Relevant to that have survived GC of Eden space. Solaris and Linux only.) • Tenured Generation (old generation): pool containing objects that -XX:AltStackSize= Alternate signal stack size (in Kbytes). have existed for some time in the survivor spaces. (Relevant to Solaris only, removed from [default = 16384] 5.0.) JVM SETTINGS -XX:-DisableExplicitGC Disable calls to System.gc(), JVM still performs garbage collection when necessary. Java JVM settings and details for tuning, tracing and debugging a Java Virtual Machine (JVM) -XX:+FailOverToOldVerifier Fail over to old verifier when the new type checker fails. (Introduced in 6.) Categories of Java HotSpot VM Options -XX:+HandlePromotionFailure The youngest generation collection Standard options recognized by the Java HotSpot VM are described on the does not require a guarantee of full Java Application Launcher reference pages for Windows, Solaris and Linux. promotion of all live objects. (Introduced in 1.4.2 update 11) [5.0 and earlier: false.] • Options that begin with -X are non-standard (not guaranteed to be supported on all VM implementations), and are subject to change -XX:+MaxFDLimit Bump the number of file descriptors to without notice in subsequent releases of the JDK. max. (Relevant to Solaris only.) -XX:PreBlockSpin= Spin count variable for use with • Options that are specified with -XX are unstable and are subject to -XX:+UseSpinning. Controls the change without notice. [default = 10] maximum spin iterations allowed before entering operating system thread Useful –XX Options synchronization code. (Introduced in Some options may vary per architecture/OS/JVM version. Platforms with a 1.4.2.) differing default value are listed in the description. -XX:-RelaxAccessControlCheck Relax the access control checks in the verifier. (Introduced in 6.) • Boolean options are turned on with -XX:+

The options below are loosely grouped into categories. -XX:+UseGCOverheadLimit Use a policy that limits the proportion of the VM's time that is spent in GC • Java heap options are used to specify initial and max heap size and before an OutOfMemory error is thrown. (Introduced in 6.) thread stack size while running Java programs. -XX:+UseLWPSynchronization Use LWP-based instead of thread based • Behavioral options change the basic behavior of the VM. synchronization. (Introduced in 1.4.0. Relevant to Solaris only.) • Garbage First (G1) Garbage Collection Options -XX:-UseParallelGC Use parallel garbage collection for scavenges. (Introduced in 1.4.1)

DZone, Inc. | www.dzone.com 4 Java Profiling with VisualVM

Option & default value Description Option & default value Description -XX:-UseParallelOldGC Use parallel garbage collection for the -XX:G1HeapRegionSize= With G1 the Java heap is subdivided full collections. Enabling this option into uniformly sized regions. This automatically sets -XX:+UseParallelGC. [min = 1mb, max = 32mb] sets the size of the individual sub- (Introduced in 5.0 update 6.) [The default value of this parameter divisions. -XX:-UseSerialGC Use serial garbage collection. is determined ergonomically based (Introduced in 5.0.) upon heap size.] -XX:-UseSpinning Enable naive spinning on Java monitor -XX:+AggressiveHeap Aggressively tune the parameters of before entering operating system thread its tuning algorithm based on using synchronization code. (Relevant to 1.4.2 all the resources of the operating and 5.0 only.) [1.4.2, multi-processor system on which the JVM is running. Windows platforms: true] -XX:+UseTLAB Use thread-local object allocation Performance Options (Introduced in 1.4.0, known as UseTLE Option & default value Description prior to that.) [1.4.2 and earlier, x86 or with -client: false] -XX:+AggressiveOpts Turn on point performance compiler optimizations that are expected to -XX:+UseSplitVerifier Use the new type checker with be default in upcoming releases. StackMapTable attributes. (Introduced (Introduced in 5.0 update 6.) in 5.0.)[5.0: false] -XX:CompileThreshold= Number of method invocations/ -XX:+UseThreadPriorities Use native thread priorities. branches before compiling. -XX:+UseVMInterruptibleIO Thread interrupt before or with EINTR [default = 10000] for I/O operations results in OS_INTRPT. [-client: 1,500] (Introduced in 6. Relevant to Solaris -XX:LargePageSizeInBytes= the Java heap. (Introduced in 1.4.0 -XX:-UseParNewGC The parallel copying collector, like the update 1.) original copying collector, this is a stop- [default = 4m] the-world collector. [amd64: 2m.] -Xincgc The incremental collector uses a "train" -XX:MaxHeapFreeRatio= Maximum percentage of heap free algorithm to collect small portions of after GC to avoid shrinking. the old generation at a time. [default = 70] -XX:MaxNewSize= Maximum size of new generation Garbage First (G1) Garbage Collection Options (in bytes). Since 1.4, MaxNewSize is [1.3.1 Sparc: 32m; 1.3.1 x86: 2.5m.] computed as a function of NewRatio. Option & default value Description -XX:PermSize= Size of the Permanent Generation. -XX:+UseG1GC Use the Garbage First (G1) Collector [default = 64mb] -XX:MaxGCPauseMillis= Sets a target for the maximum GC pause time. This is a soft goal, and -XX:MaxPermSize= Size of the Permanent Generation. the JVM will make its best effort to achieve it. [default = 64m] [5.0 and newer: 64 bit VMs are -XX:InitiatingHeapOccupancyPerc Percentage of the (entire) heap scaled 30% larger; 1.4 amd64: 96m; ent= occupancy to start a concurrent GC 1.3.1 -client: 32m.] [default = 45] cycle. It is used by GCs that trigger a concurrent GC cycle based on the -XX:MinHeapFreeRatio= Minimum percentage of heap free [A value of 0 denotes 'do constant occupancy of the entire heap, not [default = 40] after GC to avoid expansion. GC cycles'.] just one of the generations (e.g., G1). -XX:NewRatio= Ratio of new/old generation sizes. -XX:NewRatio= Ratio of new/old generation sizes. [default = 2] [default = 2] [Sparc -client: 8; x86 -server: 8; x86 -client: 12.]-client: 4 (1.3) 8 (1.3.1+), -XX:SurvivorRatio= Ratio of eden/survivor space size. x86: 12]

[default = 8] -XX:NewSize= Default size of new generation (in bytes) -XX:MaxTenuringThreshold= Maximum value for tenuring [default = 2.125m] threshold. [5.0 and newer: 64 bit VMs are [default = 15] scaled 30% larger; x86: 1m; x86, 5.0 -XX:ParallelGCThreads= Sets the number of threads used and older: 640k] during parallel phases of the garbage -XX:ReservedCodeCacheSize= - maximum code cache size. platform on which the JVM is running.] [default = 32m] -XX:ConcGCThreads= Number of threads concurrent [Solaris 64-bit, amd64, and -server garbage collectors will use. The x86: 48m; in 1.5.0_06 and earlier, default value varies with the platform Solaris 64-bit and and64: 1024m.] on which the JVM is running. -XX:SurvivorRatio= Ratio of eden / survivor space size -XX:G1ReservePercent= Sets the amount of heap that is reserved as a false ceiling to reduce [default = 8] [default = 10] the possibility of promotion failure. [Solaris amd64: 6; Sparc in 1.3.1: 25; other Solaris platforms in 5.0 and earlier: 32] -XX:TargetSurvivorRatio= Desired percentage of survivor space used after scavenge. [default = 50]

DZone, Inc. | www.dzone.com 5 Java Profiling with VisualVM

Option & default value Description Option & default value Description -XX:ThreadStackSize= Thread Stack Size (in Kbytes). (0 -XX:OnOutOfMemoryError="; when an OutOfMemoryError is first [default = 512] " thrown. (Introduced in 1.4.2 update [Sparc: 512; Solaris x86: 320 (was 12, 6) 256 prior in 5.0 and earlier); Sparc 64 bit: 1024; Linux amd64: 1024 -XX:-PrintClassHistogram Print a histogram of class instances (was 0 in 5.0 and earlier); all others on Ctrl-Break. Manageable. 0.] (Introduced in 1.4.2.) The jmap -histo command provides equivalent -XX:+UseBiasedLocking Enable biased locking. For more functionality. details, see this tuning example. [5.0: false] (Introduced in 5.0 update 6.) -XX:-PrintConcurrentLocks Print java.util.concurrent locks in Ctrl-Break thread dump. -XX:+UseFastAccessorMethods Use optimized versions of Manageable. (Introduced in 6.) GetField. The jstack -l command provides equivalent functionality. -XX:-UseISM Use Intimate Shared Memory. -XX:-PrintCommandLineFlags Print flags that appeared on the [Not accepted for non-Solaris command line. (Introduced in 5.0.) platforms.] -XX:-PrintCompilation Print message when a method is -XX:+UseLargePages Use large page memory. (Introduced compiled. in 5.0 update 5.) -XX:-PrintGC Print messages at garbage -XX:+UseMPSS Use Multiple Page Size Support collection. Manageable. w/4mb pages for the heap. Do not [1.4.1 and earlier: false] use with ISM as this replaces the -XX:-PrintGCDetails Print more details at garbage need for ISM. (Introduced in 1.4.0 collection. Manageable. (Introduced update 1, Relevant to Solaris 9 and in 1.4.0.) newer.) -XX:-PrintGCTimeStamps Print timestamps at garbage -XX:+UseStringCache Enables caching of commonly collection. Manageable (Introduced allocated strings. in 1.4.0.). -XX:AllocatePrefetchLines= Number of cache lines to load after -XX:-PrintTenuringDistribution Print tenuring age information. the last object allocation using -XX:-TraceClassLoading Trace loading of classes. [Default values are 1 if the last prefetch instructions generated in allocated object was an instance JIT compiled code. -XX:-TraceClassLoadingPreorder Trace all classes loaded in the order and 3 if it was an array.] referenced (not loaded). (Introduced in 1.4.2.) -XX:AllocatePrefetchStyle=<[0|1|2]> Generated code style for prefetch instructions. -XX:-TraceClassResolution Trace constant pool resolutions. [0 - no prefetch instructions are (Introduced in 1.4.2.) generate*d*, -XX:-TraceClassUnloading Trace unloading of classes. 1 - execute prefetch instructions after each allocation, -XX:-TraceLoaderConstraints Trace recording of loader 2 - use TLAB allocation watermark constraints. (Introduced in 6.) pointer to gate when prefetch instructions are executed.] -XX:+PerfSaveDataToFile Saves jvmstat binary data on exit. -XX:+UseCompressedStrings Use a byte[] for Strings that can -XX:ParallelGCThreads= Sets the number of garbage be represented as pure ASCII. collection threads in the young and (Introduced in Java 6 Update 21 [The default value varies with the old parallel garbage collectors. Performance Release) platform on which the JVM is running.] -XX:+OptimizeStringConcat Optimize String concatenation operations where possible. -XX:+UseCompressedOops Enables the use of compressed (Introduced in Java 6 Update 20) pointers (object references represented as 32-bit offsets instead of 64-bit pointers) for Debugging Options optimized 64-bit performance with Java heap sizes less than 32gb. Option & default value Description -XX:+AlwaysPreTouch Pre-touch the Java heap during -XX:-CITime Prints time spent in JIT Compiler. JVM initialization. Every page of (Introduced in 1.4.0.) the heap is thus demand-zeroed -XX:ErrorFile=./hs_err_pid.log If an error occurs, save the error during initialization rather than data to this file. (Introduced in 6.) incrementally during application execution. -XX:-ExtendedDTraceProbes Enable performance-impacting probes. (Introduced in 6. -XX:AllocatePrefetchDistance= Sets the prefetch distance for Relevant to Solaris only.) object allocation. Memory about [The default value varies with the to be written with the value of new -XX:HeapDumpPath=./java_ Path to directory or filename platform on which the JVM is objects is prefetched into cache pid.hprof for heap dump. Manageable. running.] at this distance (in bytes) beyond (Introduced in 1.4.2 update 12, 5.0 the address of the last allocated update 7.) object. Each Java thread has its own allocation point. -XX:- Dump heap to file when java.lang. HeapDumpOnOutOfMemoryError OutOfMemoryError is thrown. -XX:InlineSmallCode= Inline a previously compiled method Manageable. (Introduced in 1.4.2 only if its generated native code size update 12, 5.0 update 7.) [The default value varies with the is less than this. platform on which the JVM is -XX:OnError=";" fatal error. (Introduced in 1.4.2 update 9.)

DZone, Inc. | www.dzone.com 6 Java Profiling with VisualVM

Option & default value Description Option & default value Description -XX:MaxInlineSize= Maximum bytecode size of a -XX:+PrintGCApplicationConcurre Time the applications run between method to be inlined. ntTime collection pauses. [default = 35] -XX:+PrintGCApplicationStopped Length of the collection pauses. -XX:FreqInlineSize= Maximum bytecode size of a Time frequently executed method to be [The default value varies with the inlined. -Xdebug -Xnoagent Enables debugging support in the platform on which the JVM is VM. running.] -Xrunjdwp:transport=dt_socket,serv Loads in-process debugging -XX:LoopUnrollLimit= Unroll loop bodies with er=y,suspend=n,address= libraries and specifies what kind of server compiler intermediate connection will be made. [The default value varies with the representation node count less than -XX:HeapDumpPath=./java_pid. Path to directory or file name for platform on which the JVM is this value. The limit used by the hprof heap dump. running.] server compiler is a function of this value, not the actual value. -XX:-PrintCommandLineFlags Print flags that appeared on the command line. -XX:InitialTenuringThreshold= Sets the initial tenuring threshold for use in adaptive GC sizing in -XX:-PrintConcurrentLocks Print java.util.concurrent locks in [default = 7] the parallel young collector. The Ctrl-Break thread dump. tenuring threshold is the number of times an object survives a young PrintGC Details Output collection before being promoted to the old, or tenured, generation. The collection output for the PrintGC*. -XX:MaxTenuringThreshold= Sets the maximum tenuring Syntax threshold for use in adaptive GC Hot [GC [: -> , [The default value is 15 for the sizing. Tip secs] -> , secs] The current largest value is 15.] -verbose:gc Logs garbage collector runs and how long they're taking. I Additional Resources generally use this as my first tool to http://java.dzone.com/articles/visualvm-refcard-additional investigate if GC is a bottleneck for a given application.

ABOUT THE AUTHORS RECOMMENDED BOOK

Mick Knutson, Mick Knutson has been a Enterprise Java EE6 Cookbook for securing, tuning, and extending technology consultant, Java Architect, project enterprise applications: This book covers exciting recipes leader, Engineer, Designer and Developer, and has on securing, tuning and extending enterprise applications gained experience in disciplines including Java EE, using a Java EE 6 implementation. http://packtpub. Web Services, Mobile Computing, and Enterprise com/java-ee6-securing-tuning-extending-enterprise- Integration Solutions. He has led training courses applications-cookbook/book and book publishing engagements, authored technical white papers, and presented at seminars worldwide. As an active blogger and Tweeter, Mr. Knutson has also been inducted into the prestigious DZone.com “Most Valuable Blogger” (MVB) group, and can be followed at http://baselogic. com, http://dzone.com/users/mickknutson and @mickknutson. Mr. Knutson is the President of BASE Logic, Inc.

Browse our collection of over 150 Free Cheat Sheets Upcoming Refcardz Scala Collections MongoDB Modularity Patterns Free PDF PHP 5.4

DZone, Inc. 150 Preston Executive Dr. Suite 201 Cary, NC 27513 DZone communities deliver over 6 million pages each month to 888.678.0399 more than 3.3 million software developers, architects and decision 919.678.0300 makers. DZone offers something for everyone, including news, Refcardz Feedback Welcome tutorials, cheat sheets, blogs, feature articles, source code and more. [email protected]

“"DZone is a developer's dream",” says PC Magazine. $7.95

Copyright © 2012 DZone, Inc. All rights reserved. No part of this publication may be reproduced, stored in a retrieval Sponsorship Opportunities system, or transmitted, in any form or by means electronic, mechanical, photocopying, or otherwise, without prior Version 1.0 written permission of the publisher. [email protected]