12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000 |
- \input texinfo @c -*-texinfo-*-
- @c %**start of header
- @setfilename cp-vmintegration.info
- @settitle GNU Classpath VM Integration Guide
- @c %**end of header
- @setchapternewpage off
- @ifinfo
- This file contains important information you will need to know if you
- are going to write an interface between GNU Classpath and a Virtual
- Machine.
- Copyright (C) 1998-2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
- @ifnotplaintext
- @dircategory GNU Libraries
- @direntry
- * VM Integration: (cp-vmintegration). GNU Classpath VM Integration Guide
- @end direntry
- @end ifnotplaintext
- @end ifinfo
- @titlepage
- @title GNU Classpath VM Integration Guide
- @author John Keiser
- @author C. Brian Jones
- @author Mark Wielaard
- @page
- @vskip 0pt plus 1filll
- Copyright @copyright{} 1998-2002 Free Software Foundation, Inc.
- @sp 2
- Permission is granted to make and distribute verbatim copies of
- this document provided the copyright notice and this permission notice
- are preserved on all copies.
- Permission is granted to copy and distribute modified versions of this
- document under the conditions for verbatim copying, provided that the
- entire resulting derived work is distributed under the terms of a
- permission notice identical to this one.
- Permission is granted to copy and distribute translations of this manual
- into another language, under the above conditions for modified versions,
- except that this permission notice may be stated in a translation
- approved by the Free Software Foundation.
- @end titlepage
- @ifinfo
- @node Top, Introduction, (dir), (dir)
- @top GNU Classpath Hacker's Guide
- This file contains important information you will need to know if you
- are going to write an interface between GNU Classpath and a Virtual
- Machine.
- This document is incomplete, as we are still in alpha with the interface.
- @end ifinfo
- @menu
- * Introduction:: An introduction to the Classpath project
- * Initialization:: Initializing the classes
- * Classpath Hooks:: Hooks from Classpath to the VM
- * VM Hooks:: Hooks from the underlying VM to Classpath
- * JNI Implementation:: Hooking the VM to jni.h
- * JVMTI Implementation:: Hooking the VM to jvmti.h
- * Miscellaneous VM Requirements::
- @end menu
- @node Introduction, Initialization, Top, Top
- @comment node-name, next, previous, up
- @chapter Introduction
- The Classpath Project's ambition to be a 100% clean room implementation
- of the standard Java class libraries cannot be fulfilled without some
- level of integration with the Virtual Machine, the underlying machinery
- that actually runs Java.
- There are several VMs out there, here is a small list.
- @itemize @bullet
- @item @uref{http://www.hungry.com/old-hungry/products/japhar/,Japhar}
- Japhar was the first VM to use GNU Classpath. Today you can see that
- sort of relationship in the source tree which denotes several Japhar
- specific files as a reference implementation of those pieces. This VM
- has been primarily tested against Linux and lacks garbage collections, a
- JIT, and suffers recently from slow development.
- @item @uref{http://www.intel.com/research/mrl/orp/,Intel's Open Runtime Platform}
- Intel surprised us not long ago with the release of this rather advanced
- VM that uses GNU Classpath for a set of class libraries and works on
- Linux and Windows 2000. As of June, 2004, it does not appear that ORP
- is under active development.
- @item @uref{http://www.sablevm.org/,SableVM}
- SableVM is a robust, extremely portable, efficient, and
- specifications-compliant Java Virtual Machine that aims to be easy to
- maintain and to extend. It features a state-of-the-art, efficient
- interpreter engine. Its source code is very accessible and easy to
- understand, and has many robustness features that have been the object
- of careful design.
- @item @uref{http://www.kaffe.org,Kaffe}
- Kaffe is an advanced VM and together with its own class libraries
- provides a Java 1.1 compatible environment.
- @item @uref{http://www.mozilla.org/projects/ef,Electrical Fire}
- The Electrical File VM continues to be listed as a Mozilla project
- though development has been somewhat quiet. A number of concepts from
- EF were expected at one point to be rolled into Japhar, but that
- development has not occurred as of yet.
- @item @uref{http://latte.snu.ac.kr/,LaTTe}
- This VM project so far supports only Sun UltraSparc processors using the
- proprietary Solaris 2.5.1 or higher operating system. LaTTe was derived
- from Kaffe but claims a number of improvements.
- @item @uref{http://gcc.gnu.org/java/,GNU Compiler for Java (GCJ)}
- This is a portable, optimizing, ahead-of-time compiler for the Java
- Programming Language. It can compile Java source code directly to native
- machine code, Java source code to Java bytecode (class files), and Java
- bytecode to native machine code. Compiled applications are linked with the
- GCJ runtime, libgcj which is based on the GNU Classpath code, which provides
- the core class libraries, a garbage collector, and a bytecode interpreter.
- libgcj can dynamically load and interpret class files, resulting in mixed
- compiled/interpreted applications.
- GCJ is part of the GNU Compiler Collection (@uref{http://gcc.gnu.org/,GCC}).
- On March 6 2000 the libgcj and GNU Classpath projects were officially merged
- and there is active work on merging all the classes between the projects.
- Licensed under GPL+exception, just as GNU Classpath is.
- @item @uref{http://kissme.sourceforge.net/,Kissme}
- This is a free Java Virtual Machine that is being developed on GNU/Linux
- and can run console Java applications. Kissme also provides support for
- orthogonally persistent Java.
- @c I don't know what ``orthogonally persistent Java'' is, and I bet
- @c there are other people don't know either. -- Steve Augart, 4 June 2004
- @item @uref{http://jamvm.sourceforge.net/,JamVM}
- A simple, small bytecode interpreter that works out-of-the-box with
- pure GNU Classpath; it is emerging as the preferred platform for
- quickly testing a new build of GNU Classpath. Licensed under the GPL.
- @item @uref{http://jikesrvm.sourceforge.net/,Jikes RVM}
- A free runtime environment for Java, written in Java. Works
- out-of-the-box with pure GNU Classpath. Features an optimizing JIT.
- Runs on the x86 and PowerPC architectures, on the AIX, Linux, and Mac
- OS/X operating systems. Licensed under the CPL (Common Public
- License). Extensively documented. Actively developed as of June,
- 2004.
- @end itemize
- In the past integration efforts were focused mainly on Japhar with an eye
- towards getting Electrical Fire to work. Most information contained in
- this document is gleaned from these efforts. Recently more work has been
- done on getting gcj, orp and kissme to work out of the box with GNU Classpath
- but there is much to do before that becomes a reality.
- @node Initialization, Classpath Hooks, Introduction, Top
- @comment node-name, next, previous, up
- @chapter Initialization
- The order of initialization, as far as I can tell, doesn't matter just
- yet. However, when we move to 1.2 support, it probably will matter, so
- we'll have a note in here at that time.
- The initialization order is currently documented in the
- @file{Runtime.java} source file.
- @node Classpath Hooks, VM Hooks, Initialization, Top
- @comment node-name, next, previous, up
- @chapter Classpath Hooks
- The primary method of interaction between Classpath and the VM is via
- the helper classes, which are named after the relevant core library
- class, but include an additional `VM' prefix. The library classes from
- Classpath call out to these to get certain VM-specific dirty work done.
- A reference copy of each VM class exists. The majority consist of a
- series of static methods, some of which are simply declared
- @code{native}, and some which provide a default implementation. VMs may
- either use these as is, or create their own local variations. When
- using the default implementations, the VM is responsible for
- implementing any of the code marked as @code{native} which corresponds
- to functionality they wish their VM to provide. When using their own
- versions of the classes, VM implementors may choose to change the mix of
- native and non-native methods from that below, so as to best suit their
- implementation.
- @menu
- * java.lang::
- * gnu.classpath::
- * java.util::
- * java.io::
- * java.security::
- * java.net::
- * java.nio::
- * java.nio.channels::
- * gnu.java.nio::
- * java.lang.reflect::
- * gnu.java.lang::
- * gnu.java.lang.management::
- * java.lang.management::
- * Classpath Callbacks::
- @end menu
- @node java.lang, gnu.classpath, Classpath Hooks, Classpath Hooks
- @comment node-name, next, previous, up
- @section @code{java.lang}
- @code{java.lang} is the core Java package, being imported automatically by all
- classes. It includes basic classes as @code{Object} and @code{String}.
- A VM must implement at least some parts of this package in order to
- become operable.
- @menu
- * java.lang.VMClass::
- * java.lang.VMObject::
- * java.lang.VMClassLoader::
- * java.lang.VMSystem::
- * java.lang.VMThrowable::
- * java.lang.VMCompiler::
- * java.lang.VMDouble::
- * java.lang.VMFloat::
- * java.lang.VMProcess::
- * java.lang.VMRuntime::
- * java.lang.VMString::
- * java.lang.VMThread::
- * java.lang.VMMath::
- @end menu
- @node java.lang.VMClass, java.lang.VMObject ,java.lang,java.lang
- @subsection @code{java.lang.VMClass}
- The core class, @code{java.lang.Class}, and the corresponding VM class,
- @code{java.lang.VMClass}, provide two main functions within GNU Classpath.
- @enumerate
- @item For basic VM operation, @code{java.lang.Class} provides the link between
- the Java-based representation of a class it embodies and the VM's own
- internal structure for a class. @xref{VM Hooks}.
- @item As far as the user is concerned, the main function of
- @code{java.lang.Class} is as an entry point to the reflection
- facilities, and so it also provides this functionality, backed by the
- VM class.
- @end enumerate
- This VM class lists the following methods, organized by the version of the
- Java specification in which they occur. All are @code{native}, unless
- otherwise specified, and pertain to reflection. As a result, the VM only
- needs to implement these methods in order to provide reflection support,
- and then only to the degree required.
- @itemize @bullet
- @item 1.0
- @itemize @bullet
- @item @code{isInterface(Class)} -- This is simply a property test, and matches
- the presence of an appropriate flag within the class file.
- @item @code{getName(Class)} -- Returns the fully-qualified name of the class.
- @item @code{getSuperclass(Class)} -- Returns a @code{Class} instance which
- represents the superclass. Again, the class file contains an element directly
- relating to this. @code{null} is returned for primitives, interfaces and
- @code{Object}.
- @item @code{getInterfaces(Class)} -- Same as the above, but the implemented
- or extended interfaces rather than the superclass. An empty array should
- be returned, rather than @code{null}.
- @item @code{getDeclaredClasses(Class,boolean)} -- Returns the internal classes
- this instance declares directly. The flag determines whether or not the
- VM should filter out non-public classes.
- @item @code{getDeclaredFields(Class,boolean)} -- The same for fields.
- @item @code{getDeclaredMethods(Class,boolean)} -- And for methods.
- @item @code{getDeclaredConstructors(Class,boolean)} -- And constructors.
- @item @code{getClassLoader(Class)} -- Returns the @code{ClassLoader} instance
- which is responsible for the specified class.
- @item @code{forName(String, boolean, ClassLoader)} -- The VM should create a
- @code{Class} instance corresponding to the named class. As noted in
- @ref{VM Hooks}, the internal content of the instance is the
- responsibility of the VM@. The supplied class loader is recorded as that
- which loaded the class, and the boolean specifies whether or not to
- run the class initializer.
- @item @code{isArray(Class)} -- Another property test, corresponding to a
- class file flag.
- @item @code{initialize(Class)} -- The VM should initialize the class fully,
- if it has not already done so.
- @item @code{loadArrayClass(String,ClassLoader)} -- This is called if
- @code{forName} returns @code{null} and the string specifies an array class.
- The specified array class should be loaded with the supplied class loader.
- @item @code{throwException(Throwable)} -- The VM should throw the supplied
- checked exception, without declaring it.
- @end itemize
- @item 1.1
- @itemize @bullet
- @item @code{isInstance(Class,Object)} -- This is a reflection-based equivalent
- of the @code{instanceof} operator.
- @item @code{isAssignableFrom(Class,Class)} -- Mainly a shorthand for the above,
- removing the need to create an instance to test assignability.
- @item @code{isPrimitive(Class)} -- Returns true if this class is simply
- a representation of one of the primitive types: @code{boolean}, @code{byte},
- @code{char}, @code{short}, @code{int}, @code{long}, @code{float},
- @code{double} and @code{void}.
- @item @code{getComponentType(Class)} -- Produces a @code{Class} instance which
- represents the type of the members of the array the class instance represents.
- Classes which don't represent an array type return @code{null}.
- @item @code{getModifiers(Class,boolean)} -- Returns an integer which encodes
- the class' modifiers, such as @code{public}. Again, this relates to
- information stored in the class file.
- @item @code{getDeclaringClass(Class)} -- Returns the class that declared
- an inner or member class, or @code{null} if the instance refers to a top-level
- class.
- @end itemize
- @item 1.5
- @itemize @bullet
- @item @code{isSynthetic(Class)} -- Returns true if the flags for this class
- mark it as synthetic.
- @item @code{isAnnotation(Class)} -- Returns true if the flags for this class
- mark it as an annotation.
- @item @code{isEnum(Class)} -- Returns true if the flags for this class
- mark it as an enumeration.
- @item @code{getSimpleName(Class)} -- Returns the simple name of the class.
- A default implementation is provided, but a more efficient version may instead
- be provided by the VM.
- @item @code{getCanonicalName(Class)} -- Returns the canonical name of the
- class. A default implementation is provided, but a more efficient
- version may instead be provided by the VM.
- @item @code{getEnclosingClass(Class)} -- Returns the immediately enclosing
- class (null for a top-level class).
- @item @code{getEnclosingConstructor(Class)} -- Returns the constructor
- which immediately encloses the supplied class.
- @item @code{getEnclosingMethod(Class)} -- Returns the method
- which immediately encloses the supplied class.
- @item @code{getClassSignature(Class)} -- Returns the generic signature of
- the class or null if there isn't one.
- @item @code{isAnonymousClass(Class)} -- Returns true if the class is an
- anonymous class.
- @item @code{isLocalClass(Class)} -- Returns true if the class is an
- local class.
- @item @code{isMemberClass(Class)} -- Returns true if the class is an
- member class.
- @end itemize
- @end itemize
- @node java.lang.VMObject, java.lang.VMClassLoader, java.lang.VMClass, java.lang
- @subsection @code{java.lang.VMObject}
- @code{VMObject} is the bridge between the low level @code{Object}
- facilities such as making a clone, getting the class of the object and
- the wait/notify semantics. This is accomplished using the following
- @code{native} methods.
- @itemize @bullet
- @item @code{getClass(Object)} -- Returns the @code{Class} instance for the
- object. @code{Class} objects are produced by the VM, as described in
- @ref{VM Hooks}.
- @item @code{clone(Cloneable)} -- The VM should produce a low-level clone of the
- specified object, creating a field-by-field shallow copy of the original.
- The only difference between the two is that the new object should still be
- @code{finalizable}, even if the original is not.
- @item @code{notify(Object)} -- The VM should choose one of the threads waiting
- for a lock on the specified object arbitrarily, and wake it. If the current
- thread does not currently hold the lock on the object, then an
- @code{IllegalMonitorStateException} should be thrown.
- @item @code{notifyAll(Object)} -- Same as the above, but all threads are
- awakened.
- @item @code{wait(Object,long,int)} -- The VM should set the current thread
- into a waiting state, which persists until it receives a notify signal or the
- specified time (in milliseconds and nanoseconds) is exceeded. The nanoseconds
- restriction may be ignored if such granularity is not available, and a
- @code{IllegalMonitorStateException} should be thrown if the current thread
- doesn't own the object.
- @end itemize
- @node java.lang.VMClassLoader, java.lang.VMSystem, java.lang.VMObject, java.lang
- @subsection @code{java.lang.VMClassLoader}
- @code{VMClassLoader} provides methods for defining and resolving core and
- primitive classes, as well as handling resources, packages and assertions.
- The class is a mixture of @code{native} methods and Java-based
- implementations, with some of the latter being @emph{stubs}.
- @itemize @bullet
- @item Native Methods
- @itemize @bullet
- @item @code{defineClass(ClassLoader,String,byte[],int,int,ProtectionDomain)}
- -- The VM should create a @code{Class} instance from the supplied byte array.
- @item @code{resolveClass(Class)} -- Resolve references to other classes in the
- supplied class.
- @item @code{loadClass(name,boolean)} -- Load a class using the bootstrap
- loader.
- @item @code{getPrimitiveClass(char)} -- The VM should provide a @code{Class}
- implementation for one of the primitive classes. The supplied character
- matches the JNI code for the primitive class e.g.@: `B' for byte and
- `Z' for boolean.
- @end itemize
- @item Java Methods
- @itemize @bullet
- @item @code{getResource(String)} -- The default implementation calls
- @code{getResources} and returns the first element in the returned enumeration,
- or @code{null} if there are no elements.
- @item @code{getResources(String)} -- By default, this compiles a list of
- URLs via the boot class path. Any matching files within a zip file are added,
- and directories on the boot class path are automatically converted to file
- URLs that refer to join the directory with the resource name (whether or not
- it actually exists).
- @item @code{getPackage(String)} -- Always returns null, which may be suitable
- if the VM does not wish to return a @code{Package} implementation. Otherwise,
- it may be necessary to make this a @code{native} method.
- @item @code{getPackages()} -- As with the last, a default stub implementation
- exists (returning an empty array) which may be replaced if support is
- required.
- @item @code{defaultAssertionStatus()} -- A stub which can be implemented
- by VMs providing assertion support. At present, it always returns @code{true}.
- @item @code{packageAssertionStatus()} -- Much the same status as the above.
- The method should return a map converting package names to boolean status
- values. The stub implementation provides an empty map.
- @item @code{classAssertionStatus()} -- Same as the last, but for classes.
- @item @code{getSystemClassLoader()} -- The default calls @code{ClassLoader}
- to create a new auxiliary class loader with a system and extension class
- loader. The VM may wish to replace it if it wishes to supply its own custom
- system class loader.
- @end itemize
- @end itemize
- @node java.lang.VMSystem, java.lang.VMThrowable, java.lang.VMClassLoader, java.lang
- @subsection @code{java.lang.VMSystem}
- @code{VMSystem} handles the default I/O streams, provides access to the
- system clock and environment variables and provides methods for
- @code{System.arraycopy} and the @code{identityHashCode} of an
- @code{Object}. It consists of @code{native} methods, but the default
- implementation also provides some helper methods to simplify stream
- creation.
- @itemize @bullet
- @item Native Methods
- @itemize @bullet
- @item @code{arraycopy(Object,int,Object,int,int)} -- The VM should copy
- a specified number of array objects from one array to another, with
- appropriate checks for compatible typing, available elements and space.
- The VM should be able to perform this more efficiently using native code
- and direct memory manipulation than would have been achieved by using Java.
- @item @code{identityHashCode(Object)} -- This is the hashcode for
- @code{Object}, which relates to the actual location of the object in memory.
- @item @code{setIn(InputStream)} -- Set the system input stream.
- @item @code{setOut(PrintStream)} -- Set the system output stream.
- @item @code{setErr(PrintStream)} -- Set the system error stream.
- @item @code{currentTimeMillis()} -- Gets the system time in milliseconds.
- @item @code{getenv(String)} -- Returns the value of the specified environment
- variable.
- @item @code{getenv()} -- Returns a list of `name=value' pairs which correspond
- to the environment variables.
- @end itemize
- @item Java Methods
- @itemize @bullet
- @item @code{makeStandardInputStream()} -- Helps provide the functionality of
- @code{System.in} by wrapping the appropriate file descriptor in a
- buffered file input stream. VMs may choose to create the stream from
- the descriptor differently rather than using this method.
- @item @code{makeStandardOutputStream()} -- Helps provide the functionality of
- @code{System.out} by wrapping the appropriate file descriptor in a buffered
- file output stream. VMs may choose to create the stream from the descriptor
- differently rather than using this method.
- @item @code{makeStandardErrorStream()} -- Helps provide the functionality of
- @code{System.err} by wrapping the appropriate file descriptor in a buffered
- file output stream. VMs may choose to create the stream from the descriptor
- differently rather than using this method.
- @end itemize
- @end itemize
- Classpath also provides native implementations of
- @itemize @bullet
- @item @code{setIn(InputStream)}
- @item @code{setOut(PrintStream)}
- @item @code{setErr(PrintStream)}
- @item @code{currentTimeMillis()}
- @item @code{getenv(String)}
- @end itemize
- making a VM implementation optional.
- @node java.lang.VMThrowable, java.lang.VMCompiler, java.lang.VMSystem, java.lang
- @subsection @code{java.lang.VMThrowable}
- @code{VMThrowable} is used to hold the VM state of a throwable, created either
- when a @code{Throwable} is created or the @code{fillInStackTrace()} method is
- called (i.e., when the actual stack trace is needed, as a lot of exceptions are
- never actually used). The actual class has two @code{native} methods,
- one (@code{fillInStackTrace()}) being a method of the class used to obtain
- instances, and the other an instance method, @code{getStackTrace()}.
- @itemize @bullet
- @item @code{fillInStackTrace(Throwable)} -- The VM should return the current
- execution state of the @code{Throwable} in the form of a @code{VMThrowable}
- instance. The VM may also return @code{null} if it does not support this
- functionality.
- @item @code{getStackTrace()} -- This is used to create a real
- @code{StackTraceElement} array for the exception, using the state data
- stored during creation of the instance.
- @end itemize
- @node java.lang.VMCompiler, java.lang.VMDouble, java.lang.VMThrowable, java.lang
- @subsection @code{java.lang.VMCompiler}
- @code{VMCompiler} provides an interface for VMs which wish to provide
- JIT compilation support. The default implementation is simply a series
- of stubs. The property, @code{java.compiler}, should point to a library
- containing the function @code{java_lang_Compiler_start()} if such support
- is to be provided.
- @itemize @bullet
- @item @code{compileClass(Class)} -- Invoke the compiler to compile the specific
- class, returning @code{true} if successful.
- @item @code{compileClasses(String)} -- The compiler should compile the classes
- matching the specified string, again returning @code{true} on success.
- @item @code{command(Object)} -- The object represents a command given to the
- compiler, and is specific to the compiler implementation.
- @item @code{enable} -- Enable the operation of the compiler.
- @item @code{disable} -- Disable compiler operation.
- @end itemize
- @node java.lang.VMDouble, java.lang.VMFloat, java.lang.VMCompiler, java.lang
- @subsection @code{java.lang.VMDouble}
- @code{VMDouble} provides native support for the conversion and parsing
- of doubles.
- @itemize @bullet
- @item @code{doubleToRawLongBits(double)} -- Converts the double to the IEEE 754
- bit layout, preserving NaNs.
- @item @code{longBitsToDouble(long)} -- This is the inverse of the last method,
- preserving NaNs so that the output of one can be fed into the other without
- data loss.
- @item @code{toString(double,boolean)} -- Converts the double to a string,
- giving a shorter value if the flag @code{isFloat} is @code{true}, indicating
- that the conversion was requested by @code{java.lang.Float} rather than
- @code{java.lang.Double}.
- @item @code{initIDs} -- Used by JNI-based solutions to initialize the cache
- of the static field IDs. The default @code{VMDouble} implementation has a
- static initializer which loads the JNI library and calls this method.
- @item @code{parseDouble} -- Turn the string into a usable double value.
- @end itemize
- Classpath provides native implementations of all these, making VM
- implementation optional.
- @node java.lang.VMFloat, java.lang.VMProcess, java.lang.VMDouble, java.lang
- @subsection @code{java.lang.VMFloat}
- @code{VMFloat} provides native support for the conversion of floats.
- @itemize @bullet
- @item @code{floatToRawIntBits(float)} -- Converts the float to the IEEE 754
- bit layout, preserving NaNs.
- @item @code{intBitsToFloat(int)} -- This is the inverse of the last method,
- preserving NaNs so that the output of one can be fed into the other without
- data loss.
- @end itemize
- Classpath provides native implementations of all these, making VM
- implementation optional.
- @node java.lang.VMProcess, java.lang.VMRuntime, java.lang.VMFloat, java.lang
- @subsection @code{java.lang.VMProcess}
- @code{VMProcess} handles the execution of external processes. In the
- default implementation, threads are spawned and reaped by @code{ProcessThread}.
- A constructor creates a new @code{VMProcess}, which extends rather than
- complements @code{Process}, using an array of arguments, an array of
- environment variables and a working directory. The instance maintains
- system input, output and error streams linked to the external process.
- Three @code{native} methods are used, and implementations are provided
- for all three by Classpath, making VM implementation optional. These use
- the POSIX functions, @code{fork()}, @code{waitpid()} and @code{kill()}.
- @itemize @bullet
- @item @code{nativeSpawn(String[],String[],File,boolean)} -- The VM should
- create a new process which uses the specified command-line arguments,
- environment variables and working directory. Unlike the other two
- methods, this method is linked to an instance, and must call
- @code{setProcessInfo()} with the results before returning. The
- boolean argument maps to the @code{redirectErrorStream} property of
- @code{java.lang.ProcessBuilder}. When true, the output and error streams
- are merged.
- @item @code{nativeReap()} -- This is called to perform a reap of any
- zombie processes, and should not block, instead returning a boolean as to
- whether reaping actually took place.
- @item @code{nativeKill(long)} -- The VM should terminate the specified PID.
- @end itemize
- @node java.lang.VMRuntime, java.lang.VMString, java.lang.VMProcess, java.lang
- @subsection @code{java.lang.VMRuntime}
- The @code{VMRuntime} class provides a series of native methods
- which divulge information about the runtime or invoke certain
- operations. This includes retrieving the amount of available memory,
- and scheduling the garbage collector. There are two exceptions: the
- @code{enableShutdownHooks} method, which allows the VM to put in its own
- shutdown hooks when @code{Runtime.addShutdownHook()} is first invoked,
- and @code{exec(String[],String[],File)} which spawns an external process.
- These are Java-based static methods instead. The first is simply a stub by
- default, while the second simply links to the functionality of
- @code{VMProcess} (and should be changed if a different @code{Process}
- implementation is used).
- @itemize @bullet
- @item @code{availableProcessors()} -- Returns the number of processors
- available to the VM.
- @item @code{freeMemory()} -- Returns the amount of memory the VM has available
- on the heap for allocating.
- @item @code{totalMemory()} -- Returns the size of the heap.
- @item @code{maxMemory()} -- Returns the maximum memory block the VM will
- attempt to allocate. May be simply @code{Long.MAX_VALUE} (8 exabytes!)
- @item @code{gc()} -- Allows users to explicitly invoke the garbage collector.
- This is a suggestion to the VM, rather than a command, and the garbage
- collector should run anyway @emph{without} it being invoked.
- @item @code{runFinalization()} -- Like the above, but related to the
- finalilzation of objects rather than the garbage collector.
- @item @code{runFinalizationForExit()} -- Called immediately prior to VM
- shutdown in order to finalize all objects (including `live' ones)
- @item @code{traceInstructions(boolean)} -- This turns on and off the optional
- VM functionality of printing a trace of executed bytecode instructions.
- @item @code{traceMethodCalls(boolean)} -- This turns on and off the optional
- VM functionality of printing a trace of methods called.
- @item @code{runFinalizersOnExit(boolean)} -- A toggleable setting for
- running the finalization process at exit.
- @item @code{exit(int)} -- The VM should shutdown with the specified exit code.
- @item @code{nativeLoad(String,ClassLoader)} -- Attempts to load a file,
- returning an integer which is non-zero for success. Nothing happens if the
- file has already been loaded.
- @item @code{mapLibraryName(String)} -- The VM should map the system-independent
- library name supplied to the platform-dependent equivalent (e.g.@: a @code{.so}
- or @code{.dll} file)
- @end itemize
- @node java.lang.VMString, java.lang.VMThread, java.lang.VMRuntime, java.lang
- @subsection @code{java.lang.VMString}
- @code{VMString} is responsible for handling interned strings. If two strings
- are equal (using the @code{equals()} method), then the results of calling
- the @code{intern()} method on each of them makes them equal
- (using @code{==}). Thus, the same string object is always returned by
- @code{intern} if the two strings are equal. The default implementation
- is Java-based and implements @code{intern(String)} by maintaining a
- @code{WeakHashMap} which links the strings to their @code{WeakReference}.
- A new mapping is created for each new string being @code{intern}ed.
- A VM may implement this differently by implementing this method,
- which is @code{static} and the only one in @code{VMString}.
- @node java.lang.VMThread, java.lang.VMMath, java.lang.VMString, java.lang
- @subsection @code{java.lang.VMThread}
- @code{VMThread} provides the link between Java's threads and the platform
- threading support. A @code{VMThread} is created via a private constructor
- and linked to a @code{Thread} instance. This occurs when the @code{Thread}
- instance is started by the static @code{create(Thread,long)} method (the second
- argument requests a certain stack size, usually zero). The thread itself is
- executed via the @code{run()} method, which handles any problems with the
- running of the thread and its eventual death.
- @code{VMThread} provides the following accessors and mutators for accessing
- the thread state via @code{VMThread},
- @itemize @bullet
- @item @code{getName()}
- @item @code{setName(String)}
- @item @code{getPriority()}
- @item @code{setPriotity(int)}
- @item @code{isDaemon()}
- @end itemize
- all of which refer to the @code{Thread} instance. @code{setPriority(int)} also
- calls the appropriate native method. @code{stop(Throwable)} similarly wraps
- a native method, merely adding in a check for the state of the thread.
- The default implementation also provides Java-based implementations of
- @code{join(long,int)}, @code{sleep(long,int)} and
- @code{holdsLock(Object)}. @code{join} and @code{sleep} simply wait for
- the appropriate amount of time, with @code{join} additionally waiting
- for the thread instance to become @code{null}. @code{holdsLock} simply
- checks if an object is locked by the current thread by trying to invoke
- the @code{notify} method, and catching the failing exception if this is
- not the case.
- The remainder of the class is a series of @code{native} methods, some of
- which are mandatory for VM implementation and others which provide optional
- or deprecated functionality.
- @itemize @bullet
- @item Mandatory Instance Methods
- @itemize @bullet
- @item @code{start(long)} -- The VM should create the native thread and start
- it running using the @code{run} method of the @code{VMThread} instance on
- which this method is called.
- @item @code{interrupt()} -- The VM should interrupt the running thread and
- throw an appropriate exception.
- @item @code{isInterrupted()} -- Checks the interrupted state of the thread.
- @item @code{suspend()} -- The thread should be suspended until resumed.
- @item @code{resume()} -- The thread should be resumed from its suspended state.
- This pair of methods are deprecated, due to the possibility of a deadlock
- occurring when a thread with locks is suspended.
- @item @code{nativeSetPriority(int)} -- Called by @code{setPriority}
- to allow the setting to flow down to the native thread.
- @item @code{nativeStop(Throwable)} -- The VM should stop the thread abnormally
- and throw the specified exception. This is clearly deprecated, due to the
- ambiguous state an abruptly-stopped thread may leave.
- @item @code{getState()} -- Returns the VM's impression of the current state
- of the thread. The applicable states are supplied by the @code{State}
- enumeration in @code{java.lang.Thread}.
- @end itemize
- @item Mandatory Class Methods
- @itemize @bullet
- @item @code{currentThread()} -- Return a reference to the thread currently
- being executed.
- @item @code{yield()} -- The VM should allow some other thread to run.
- The current thread maintains its locks even though it stops executing for
- the time being.
- @item @code{interrupted()} -- A shortcut to obtaining the interrupted state
- of the current thread.
- @end itemize
- @item Other Methods
- @itemize @bullet
- @item @code{countStackFrames()} -- Returns a count of the number of stack
- frames in the thread. This depends on the deprecated method @code{suspend()}
- having returned true, and is thus deprecated as a result.
- @end itemize
- @end itemize
- @node java.lang.VMMath,, java.lang.VMThread, java.lang
- @subsection @code{java.lang.VMMath}
- The @code{VMMath} class provides a series of native methods
- for some of the mathematical functions present in @code{java.lang.Math}.
- Classpath provides a default implementation of these which maps the
- functions to those provided by @code{fdlibm}. VM implementors are welcome
- to replace this with more efficient implementations, as long as the accuracy
- contract of these methods, specified in @code{java.lang.Math}, is maintained.
- @itemize @bullet
- @item 1.0
- @itemize @bullet
- @item @code{sin(double)} -- Returns the sine value for the given angle.
- @item @code{cos(double)} -- Returns the cosine value for the given angle.
- @item @code{tan(double)} -- Returns the tangent value for the given angle.
- @item @code{asin(double)} -- Returns the arc sine value for the given angle.
- @item @code{acos(double)} -- Returns the arc cosine value for the given angle.
- @item @code{atan(double)} -- Returns the arc tangent value for the given angle.
- @item @code{atan2(double,double)} -- Returns the arc tangent of the ratio of
- the two arguments.
- @item @code{exp(double)} -- Returns the exponent raised to the given power.
- @item @code{log(double)} -- Returns the natural logarithm for the given value.
- @item @code{sqrt(double)} -- Returns the square root of the value.
- @item @code{pow(double,double)} -- Returns x to the power of y.
- @item @code{IEEEremainder(double,double)} -- Returns the IEEE 754 remainder
- for the two values.
- @item @code{ceil(double)} -- Returns the nearest integer >= the value.
- @item @code{floor(double)} -- Returns the nearest integer <= the value.
- @item @code{rint(double)} -- Returns the nearest integer or the even one
- if the distance between the two is equal.
- @end itemize
- @item 1.5
- @itemize @bullet
- @item @code{cbrt(double)} -- Returns the cube root of the value.
- @item @code{cosh(double)} -- Returns the hyperbolic cosine value for the given
- angle.
- @item @code{expm1(double)} -- Returns the exponent of the value minus one.
- @item @code{hypot(double,double)} -- Returns the hypotenuse corresponding to
- x and y.
- @item @code{log10(double)} -- Returns the base 10 logarithm of the given value.
- @item @code{log1p(double)} -- Returns the natural logarithm of the value plus
- one.
- @item @code{sinh(double)} -- Returns the hyperbolic sine value for the given
- angle.
- @item @code{tanh(double)} -- Returns the hyperbolic tangent value for the given angle.
- @end itemize
- @end itemize
- @node gnu.classpath, java.util, java.lang, Classpath Hooks
- @section @code{gnu.classpath}
- The @code{gnu.classpath} package provides Classpath-specific functionality,
- primarily relating to the features in @code{java.lang}. At present, this
- includes the context of a class (the stack) and the system properties.
- @menu
- * gnu.classpath.VMStackWalker::
- * gnu.classpath.VMSystemProperties::
- * gnu.classpath.Unsafe::
- @end menu
- @node gnu.classpath.VMStackWalker,gnu.classpath.VMSystemProperties,gnu.classpath,gnu.classpath
- @subsection @code{gnu.classpath.VMStackWalker}
- @code{VMStackWalker} provides access to the class context or stack. The
- default implementation consists of a @code{native} @code{static} method,
- @code{getClassContext()}, which obtains the class context, and two helper
- methods which obtain the calling class (the 3rd element in the context array)
- and its class loader, respectively.
- @itemize @bullet
- @item @code{getClassContext()} -- The VM should return an array of
- @code{Class} objects, each of which relates to the method currently being
- executed at that point on the stack. Thus, the first item (index 0) is the
- class that contains this method.
- @item @code{getCallingClass()} -- A Java-based helper method which returns
- the @code{Class} object which contains the method that called the method
- accessing @code{getCallingClass()}.
- @item @code{getCallingClassLoader()} -- Like the last, but returning the class
- loader of the class.
- @end itemize
- @node gnu.classpath.VMSystemProperties,gnu.classpath.Unsafe,gnu.classpath.VMStackWalker,gnu.classpath
- @subsection @code{gnu.classpath.VMSystemProperties}
- @code{VMSystemProperties} allows the VM to hook into the property creation
- process, both before and after the system properties are added by GNU
- Classpath. The default implementation assumes that the VM will add its
- properties first, by making the pre-initialisation method @code{native},
- and that the Classpath properties may then be altered by a Java-based
- post-initialisation method.
- As these methods are called as part of the bootstrap process, caution should
- be used as to what classes are used, and properties should only be set
- using @code{Properties.setProperty()}. Specifically, I/O classes should be
- avoided at this early stage.
- @itemize @bullet
- @item @code{preInit(Properties)} -- Allows the VM to add properties
- @emph{before} the Classpath properties are added. The default implementation
- includes a full list of properties that @emph{must} be added by the VM, but
- additional VM-specific ones may also be added.
- @item @code{postInit(Properties)} -- Same as the last, but called after the
- Classpath properties have been added. The main purpose of this is to allow
- the VM to alter the properties added by GNU Classpath to suit it.
- @end itemize
- @node gnu.classpath.Unsafe,,gnu.classpath.VMSystemProperties,gnu.classpath
- @subsection @code{gnu.classpath.Unsafe}
- The @code{Unsafe} class provides access to some low-level unsafe operations
- as required by the addition of the java.util.concurrent classes. These
- focus on direct memory access to the fields within the VM and providing
- atomic update methods.
- @itemize @bullet
- @item @code{objectFieldOffset(Field)} -- Provides the caller with the memory
- offset of a particular field.
- @item @code{compareAndSwap*(Object,long,*,*)} -- One of these methods is
- provided for each of int, long and Object (hence the *s). The value of
- a field pointed to by the given Object and offset is compared with the
- first value and replaced with the second if they are the same. The reason
- for this method is to make this change operation atomic.
- @item @code{put/get*(Object,long,*)} -- These are like the last set of
- methods, handling integers, longs and Objects, but the field is always
- changed on a put. Different methods are provided for different semantics.
- Ordered variants perform a lazy put, in that the change does not
- immediately propogate to other threads, while the others provide
- volatile or 'normal' semantics.
- @item @code{arrayBaseOffset(Class)} and @code{arrayIndexScale(Class)} --
- These two methods allow an array class to be traversed by pointer
- arithmetic, by gaining the address of the first element and then
- scaling appropriately for the later ones.
- @item @code{park(boolean,long)} and @code{unpark(Thread)} -- These methods
- block and unblock threads respectively, with an optional timeout being
- provided for the blocking. @code{unpark} is unsafe as the thread may have
- been destroyed by native code.
- @end itemize
- @node java.util, java.io, gnu.classpath, Classpath Hooks
- @section java.util
- The @code{java.util} VM hooks provide links between the mix of functionality
- present in that package, which includes collections, date and time handling
- and parsing. At present, there is only one hook, which connects GNU Classpath
- to the timezone information provided by the underlying platform.
- @menu
- * java.util.VMTimeZone::
- @end menu
- @node java.util.VMTimeZone,,java.util,java.util
- @subsection @code{java.util.VMTimeZone}
- @code{VMTimeZone} joins @code{TimeZone} to the platform timezone information
- via the static method, @code{getDefaultTimeZoneId()}. The VM hook is
- expected to return a @code{TimeZone} instance that represents the current
- timezone in use by the platform. The default implementation provides
- this functionality for POSIX or GNU-like systems, and VMs that want this
- functionality can keep this implementation and implement the native
- method, @code{getSystemTimeZoneId()}. This method is only called when
- obtaining the timezone name from the @code{TZ} environment variable,
- @code{/etc/timezone} and @code{/etc/localtime} all fail. This fallback
- mechanism also means that a system which doesn't provide the above three
- methods, but does provide a timezone in string form, can still use this
- implementation.
- @node java.io, java.security, java.util, Classpath Hooks
- @section java.io
- The @code{java.io} package is heavily reliant on access to the I/O facilities
- of the underlying platform. As far as its VM hooks go, they provide two
- areas of functionality to GNU Classpath, these being
- @itemize @bullet
- @item File and directory queries and manipulation
- @item Serialization of objects
- @end itemize
- The first corresponds directly to most of the @code{File} class, while
- the latter underlies the functionality provided by the
- @code{ObjectInputStream} and @code{ObjectOutputStream}. More low-level I/O
- is provided by @ref{java.nio}.
- @menu
- * java.io.VMFile::
- * java.io.VMObjectInputStream::
- * java.io.VMObjectStreamClass::
- @end menu
- @node java.io.VMFile,java.io.VMObjectInputStream,java.io,java.io
- @subsection @code{java.io.VMFile}
- @code{VMFile} allows GNU Classpath's @code{File} representations to
- probe and modify the file system using the native functions of the
- platform. The default implementation (which consists of both a
- @code{VMFile} class and the native methods) is primarily UNIX-centric,
- working with POSIX functions and assuming case-sensitive filenames,
- without the restriction of the 8.3 format. It consists mainly of
- @code{static} @code{native} methods, with a few Java helper methods.
- The native methods represent the file as a string containing its path,
- rather than using the object itself.
- @itemize @bullet
- @item Native Methods
- @itemize @bullet
- @item @code{lastModified(String)} -- The native method should return a
- @code{long} value that represents the last modified date of the file.
- @item @code{setReadOnly(String)} -- Sets the file's permissions to read only,
- in whichever way this is realised by the platform.
- @item @code{create(String)} -- Create the named file.
- @item @code{list(String)} -- The native method opens the named directory,
- reads the contents and returns them as a Java @code{String} array.
- @item @code{renameTo(String,String)} -- Renames the first file to the second.
- @item @code{length(String)} -- Returns a @code{long} value representing
- the file size.
- @item @code{exists(String)} -- Tests for the existence of the named file
- or directory.
- @item @code{delete(String)} -- Deletes the file or directory.
- @item @code{setLastModified(String,long)} -- Change the last modified time.
- @item @code{mkdir(String)} -- Creates the named directory.
- @item @code{isFile(String)} -- Tests that the named path references a file.
- @item @code{canWrite(String)} -- Tests that the file can be written to.
- This method is @code{synchronized}, so the object is locked during the check.
- @item @code{canRead(String)} -- Complement of the last method.
- @item @code{isDirectory(String)} -- Tests that the named path references
- a directory.
- @end itemize
- @item Java Helper Methods
- @itemize @bullet
- @item @code{canWriteDirectory(File)} -- Checks that the directory can be
- written to, by trying to create a temporary file in it.
- @item @code{listRoots()} -- Returns the root of a GNU filesystem, i.e.@: `/'
- in an array.
- @item @code{isHidden(String)} -- Checks whether the file starts with `.',
- which is how files are hidden on UNIX-style systems.
- @item @code{getName(String)} -- Pulls the actual filename from the end of
- the path, by breaking off the characters after the last occurrence of the
- platform's file separator.
- @item @code{getCanonicalForm(String)} -- This converts a UNIX path to
- its canonical form by removing the `.' and `..' sections that occur within.
- @end itemize
- @end itemize
- @node java.io.VMObjectInputStream,java.io.VMObjectStreamClass,java.io.VMFile,java.io
- @subsection @code{java.io.VMObjectInputStream}
- This class consists of two methods which provide functionality used in
- deserializing an object. @code{currentClassLoader()} provides the first
- user-defined class loader from the class context
- (@xref{gnu.classpath.VMStackWalker},) via a @code{PrivilegedAction}.
- @code{allocateObject(Class,Class,Constructor)} is a @code{native} method
- (a reference implementation is provided) which creates an object but
- calls the constructor of another class, which is a superclass of the
- object's class.
- @node java.io.VMObjectStreamClass,,java.io.VMObjectInputStream,java.io
- @subsection @code{java.io.VMObjectStreamClass}
- @code{VMObjectStreamClass} is a series of @code{static} @code{native}
- methods that provide some of the groundwork for @code{ObjectStreamClass}
- and @code{ObjectStreamField}. @code{hasClassInitializer(Class)} works
- with the former, and checks for the presence of a static initializer.
- The remaining methods are of the form @code{setXXXNative(Field,Object,XXX)}
- and support @code{ObjectStreamField}. One exists for each of the main types
- (boolean, float, double, long, int, short, char, byte and object) and is used
- to set the specified field in the supplied instance to the given value.
- A default implementation is provided for all of them, so a VM implementation
- is optional.
- @node java.security, java.net, java.io, Classpath Hooks
- @section java.security
- The @code{java.security} package provides support for Java's security
- architecture.
- @menu
- * java.security.VMAccessController::
- * java.security.VMSecureRandom::
- @end menu
- @node java.security.VMAccessController,java.security.VMSecureRandom,java.security,java.security
- @subsection @code{java.security.VMAccessController}
- The @code{AccessController} is used to perform privileged actions. Its
- hook class, @code{VMAccessController}, maintains the
- @code{AccessControlContext} and the default implementation is purely
- Java-based. The VM may choose to replace this with their own.
- The methods in the reference version are as follows:
- @itemize @bullet
- @item @code{pushContext(AccessControlContext)} -- Adds a new context to the
- stack for the current thread. This is called before a privileged action
- takes place.
- @item @code{popContext()} -- Removes the top context from the stack. This
- is performed after the privileged action takes place.
- @item @code{getContext()} -- Either derives a context based on the
- @code{ProtectionDomain}s of the call stack (see the next method) or returns
- the top of the context stack.
- @item @code{getStack()} -- Provides access to the call stack as a pair of
- arrays of classes and method names. The actual implementation returns
- an empty array, indicating that there are no permissions.
- @end itemize
- @node java.security.VMSecureRandom,,java.security.VMAccessController,java.security
- @subsection @code{java.security.VMSecureRandom}
- The @code{VMSecureRandom} class is used to provide access to
- cryptographically secure random numbers. The default implementation
- of the class runs eight threads that increment counters in a tight
- loop, and XORs each counter to produce one byte of seed data. This is
- not very efficient, and is not guaranteed to be random (the thread
- scheduler is probably deterministic, after all). VM implementors
- should provide a version of this class, which implements the method
- @code{generateSeed(byte[],int,int)}, so that it fills the buffer using
- a random seed from a system facility, such as a system entropy
- gathering device or hardware random number generator. The parameters
- are the usual set of buffer, offset and length and the method returns
- the number of bytes actually generated, which may be less than that
- requested.
- @node java.net, java.nio, java.security, Classpath Hooks
- @section java.net
- The @code{java.net} package is heavily reliant on access to the networking
- facilities of the underlying platform. The VM hooks provide information
- about the available network interfaces, and access to lookup facilities
- for network addresses.
- @menu
- * java.net.VMInetAddress::
- * java.net.VMNetworkInterface::
- @end menu
- @node java.net.VMInetAddress,java.net.VMNetworkInterface,java.net,java.net
- @subsection @code{java.net.VMInetAddress}
- @code{VMInetAddress} is a series of @code{static} @code{native} methods
- which provide access to the platform's lookup facilities. All the methods
- are implemented by GNU Classpath, making VM implementation optional, and
- are as follows:
- @itemize @bullet
- @item @code{getLocalHostname()} -- Wraps the @code{gethostname} function, and
- falls back on `localhost'.
- @item @code{lookupInaddrAny()} -- Returns the value of @code{INADDR_ANY}.
- @item @code{getHostByAddr(byte[])} -- Looks up the hostname based on an IP
- address.
- @item @code{getHostByName(String)} -- The reverse of the last method, it
- returns the IP addresses which the given host name resolves to.
- @end itemize
- @node java.net.VMNetworkInterface,,java.net.VMInetAddress,java.net
- @subsection @code{java.net.VMNetworkInterface}
- @code{VMNetworkInterface} currently consists of a single @code{static}
- @code{native} method, @code{getInterfaces()}, which retrieves the
- network interfaces available on the underlying platform as a @code{Vector}.
- The current GNU Classpath implementation is a native stub.
- @node java.nio, java.nio.channels, java.net, Classpath Hooks
- @section java.nio
- The @code{java.nio} package is part of the New I/O framework added in
- Java 1.4. This splits I/O into the concepts of @emph{buffers},
- @emph{charsets}, @emph{channels} and @emph{selectors}, and
- @code{java.nio} defines the buffer classes. As far as native and VM
- code is concerned, the new package needs support for low-level efficient
- buffer operations.
- @menu
- * java.nio.VMDirectByteBuffer::
- @end menu
- @node java.nio.VMDirectByteBuffer,,java.nio,java.nio
- @subsection @code{java.nio.VMDirectByteBuffer}
- A @code{ByteBuffer} maintains a buffer of bytes, and allows it to be
- manipulated using primitive operations such as @code{get}, @code{put},
- @code{allocate} and @code{free}. A direct buffer avoids intermediate
- copying, and uses native data which shouldn't be manipulated by a
- garbage collector. The VM class consists of @code{static} @code{native}
- methods, all of which are given default implementations by GNU
- Classpath.
- @itemize @bullet
- @item @code{init()} -- Creates an instance of an appropriate
- @code{gnu.classpath.RawData} class. This class is not garbage
- collected, is created natively and is used in the other methods to reference
- the buffered data.
- @item @code{allocate(int)} -- Allocates the memory for the buffer using
- @code{malloc} and returns a reference to the @code{RawData} class.
- @item @code{free(RawData)} -- Frees the memory used by the buffer.
- @item @code{get(RawData,int)} -- Returns the data at the specified index.
- @item @code{get(RawData,int,byte[],int,int)} -- Copies a section of the
- data into a byte array using @code{memcpy}.
- @item @code{put(RawData,int,byte)} -- Puts the given data in the buffer
- at the specified index.
- @item @code{adjustAddress(RawData,int)} -- Adjusts the pointer into the buffer.
- @item @code{shiftDown(RawData,int,int,int)} -- Moves the content of the buffer
- at an offset down to a new offset using @code{memmove}.
- @end itemize
-
- @node java.nio.channels, gnu.java.nio, java.nio, Classpath Hooks
- @section java.nio.channels
- Channels provide the data for the buffers with the New I/O packages.
- For example, a channel may wrap a file or a socket. The VM hooks,
- at the moment, simply allow the channels to be accessed by @code{java.io}
- streams.
- @menu
- * java.nio.channels.VMChannels::
- @end menu
- @node java.nio.channels.VMChannels,,java.nio.channels,java.nio.channels
- @subsection @code{java.nio.channels.VMChannels}
- @code{VMChannels} provides the methods that create the channels or
- streams. The default implementation is in pure Java and simply wraps
- the channels in standard I/O classes from @code{java.io}.
- @itemize @bullet
- @item @code{createStream(Class,Channel)} -- Creates a @code{FileChannel}
- which wraps an instance of the specified stream class, created by reflection.
- This method is private, and is used by the other two.
- @item @code{newInputStream(ReadableByteChannel)} -- Wraps the channel
- in a @code{FileInputStream}.
- @item @code{newOutputStream(WritableByteChannel)} -- Wraps the channel
- in a @code{FileOutputStream}.
- @end itemize
- @node gnu.java.nio, java.lang.reflect, java.nio.channels, Classpath Hooks
- @section gnu.java.nio
- The @code{gnu.java.nio} class provides Classpath implementations of the
- interfaces provided by @code{java.nio}. The VM classes provide the native
- support necessary to implement @emph{pipes} and @emph{selectors}.
- @menu
- * gnu.java.nio.VMPipe::
- * gnu.java.nio.VMSelector::
- @end menu
- @node gnu.java.nio.VMPipe,gnu.java.nio.VMSelector,gnu.java.nio,gnu.java.nio
- @subsection @code{gnu.java.nio.VMPipe}
- @code{VMPipe} provides the native functionality for a uni-directional pipe
- between a source and a destination (sink) channel. It consists of one
- @code{static} @code{native} method, @code{init(PipeImpl,SelectorProvider)},
- the reference implementation of which is currently a native stub. Ideally,
- this should initialise the pipe at the native level.
- @node gnu.java.nio.VMSelector,,gnu.java.nio.VMPipe,gnu.java.nio
- @subsection @code{gnu.java.nio.VMSelector}
- A @code{Selector} selects between multiple @code{SelectableChannel}s based
- on their readiness and a key set. The VM hook for the Classpath implementation
- of this is @code{VMSelector}, and this allows the actual @code{select()}
- operation to be performed. This is represented by the @code{static}
- @code{native} method, @code{select(int[],int[],int[],long)}, and a default
- implementation of this is provided.
- @node java.lang.reflect, gnu.java.lang, gnu.java.nio, Classpath Hooks
- @section @code{java.lang.reflect}
- @code{java.lang.reflect} provides the interface to Java's reflection
- facilities. Via reflection, programmers can obtain type information about
- a particular instance at runtime or dynamically create new instances.
- @menu
- * java.lang.reflect.VMArray::
- @end menu
- @node java.lang.reflect.VMArray,,,java.lang.reflect
- @subsection @code{java.lang.reflect.VMArray}
- The @code{VMArray} class provides a hook, @code{createObjectArray},
- which the VM uses to generate a new non-primitive array of a
- particular class and size. The default implementation simply passes
- the job down to the standard JNI function, @code{NewObjectArray}.
- @node gnu.java.lang, gnu.java.lang.management, java.lang.reflect, Classpath Hooks
- @section @code{gnu.java.lang}
- @code{gnu.java.lang} provides VM interfaces for the GNU
- implementations of features in java.lang. Currently, this includes the
- implementation of instrumentation.
- @menu
- * gnu.java.lang.VMInstrumentationImpl::
- @end menu
- @node gnu.java.lang.VMInstrumentationImpl,,,gnu.java.lang
- @subsection @code{gnu.java.lang.VMInstrumentationImpl}
- The @code{gnu.java.lang.VMInstrumentationImpl} and
- @code{gnu.java.lang.InstrumentationImpl} classes provide an implementation of the
- @code{java.lang.instrument.Instrument} interface.
- A @code{InstrumentationImpl} object should be created by the VM when agents
- are given in the command line (see the @code{java.lang.instrument} package
- documentation). The VM has to set the static field
- @code{VMClassLoader.instrumenter} to this object. The VM should implement the
- static native methods of the @code{VMInstrumentationImpl} class.
- @itemize @bullet
- @item @code{isRedefineClassesSupported()} -- Returns true if the JVM supports
- class redefinition.
- @item @code{redefineClasses()} -- Gives a set of classes with new bytecodes.
- The VM must redefine the classes by reading the new bytecodes.
- @item @code{getAllLoadedClass()} -- Returns an array of all loaded classes.
- @item @code{getInitiatedClass()} -- Returns an array of all classes loaded
- by a specific class loader.
- @item @code{getObjectSize()} -- Gives the size of an object.
- @end itemize
- Instrumentation allows to modify the bytecode of a class before it gets read
- by the VM@. In GNU Classpath, the @code{ClassLoader.defineClass} method calls
- the @code{VMClassLoader.defineClassWithTransformers} method which first checks
- if @code{VMClassLoader.instrumenter} is @code{null}. If it's the case, it
- directly calls @code{VMClassLoader.defineClass}. If it's not the case, the
- method calls at first the @code{InstrumentationImpl.callTransformers} method,
- which calls each transformer registered to the @code{InstrumentationImpl}
- object and returns a new bytecode array. Then, it calls the
- @code{VMClassLoader.defineClass} method with this new bytecode array.
- The second use of instrumentation is to redefine a class after it has been
- loaded by the VM@. This is done in the Java application by calling the
- @code{Instrumentation.redefineClasses} method of the standard interface on
- a @code{Instrumentation} object. The @code{InstrumentationImpl.redefineClasses}
- method calls the @code{VMInstrumentationImpl.redefineClasses} native method
- which must be implemented by the VM@. The implementation should call the
- @code{InstrumentationImpl.callTransformers} method.
- @node gnu.java.lang.management, java.lang.management, gnu.java.lang, Classpath Hooks
- @section @code{gnu.java.lang.management}
- @code{gnu.java.lang.management} provides the VM interfaces for the GNU
- implementations of the management beans.
- @menu
- * gnu.java.lang.management.VMRuntimeMXBeanImpl::
- * gnu.java.lang.management.VMClassLoadingMXBeanImpl::
- * gnu.java.lang.management.VMThreadMXBeanImpl::
- * gnu.java.lang.management.VMMemoryMXBeanImpl::
- * gnu.java.lang.management.VMCompilationMXBeanImpl::
- * gnu.java.lang.management.VMMemoryPoolMXBeanImpl::
- * gnu.java.lang.management.VMMemoryManagerMXBeanImpl::
- * gnu.java.lang.management.VMGarbageCollectorMXBeanImpl::
- @end menu
- @node gnu.java.lang.management.VMRuntimeMXBeanImpl,gnu.java.lang.management.VMClassLoadingMXBeanImpl,,gnu.java.lang.management
- @subsection @code{gnu.java.lang.management.VMRuntimeMXBeanImpl}
- The @code{gnu.java.lang.management.RuntimeMXBeanImpl} provides an
- implementation of the @code{java.lang.management.RuntimeMXBean} interface,
- and is supported by VM functionality in the form of
- @code{gnu.java.lang.management.VMRuntimeMXBeanImpl}. This provides a
- series of methods, which should be implemented by the virtual machine
- in order to provide the required information for the bean. The VM
- methods are generally representative of information that is only
- available from the virtual machine, such as the command-line arguments
- it was given at startup.
- The methods are as follows:
- @itemize @bullet
- @item @code{(getInputArguments())} -- The VM should supply
- a @code{String} array containing each of the command-line
- arguments, excluding those that are directed at the
- @code{main()} method. The reference implementation expects
- this to be a native method.
- @item @code{(getName())} -- The VM developer should choose
- an appropriate name for the virtual machine. This name can
- be instance-specific e.g.@: it can include things like the
- process identifier or host name of the machine, which only
- apply to the current running instance. Thus, the intention is
- that this name refers to the entity that the other information
- refers to, rather than the VM in general. The reference
- implementation supplies a default concatenation of the VM
- name and version.
- @item @code{(getStartTime())} -- This should return the number
- of milliseconds at which the virtual machine was started.
- The uptime property of the bean is provided relative to this
- value. Again, the reference implementation also expects
- this method to be native.
- @end itemize
- The virtual machine also needs to provide either the
- @code{sun.boot.class.path} or @code{java.boot.class.path}
- property in order to support the optional boot class path
- retrieval functionality.
- @node gnu.java.lang.management.VMClassLoadingMXBeanImpl,gnu.java.lang.management.VMThreadMXBeanImpl,gnu.java.lang.management.VMRuntimeMXBeanImpl,gnu.java.lang.management
- @subsection @code{gnu.java.lang.management.VMClassLoadingMXBeanImpl}
- The @code{gnu.java.lang.management.ClassLoadingMXBeanImpl} provides an
- implementation of the @code{java.lang.management.ClassLoadingMXBean} interface,
- and is supported by VM functionality in the form of
- @code{gnu.java.lang.management.VMClassLoadingMXBeanImpl}. This provides a
- series of methods, which should be implemented by the virtual machine
- in order to provide the required information for the bean. Implementing
- this bean requires the VM to monitor when classes are loaded and unloaded,
- and provide the option of verbose class loading output.
- The methods are as follows:
- @itemize @bullet
- @item @code{(getLoadedClassCount())} -- This should return
- the number of classes that are currently loaded by the VM.
- @item @code{(getUnloadedClassCount())} -- This should return
- the number of classes that have been loaded by the VM, but
- have since been unloaded.
- @item @code{(isVerbose())} -- This should return @code{true}
- or @code{false}, depending on whether verbose class loading
- output is turned or not, respectively.
- @item @code{(setVerbose(boolean))} -- This should allow the
- verbose class loading output to be turned on and off.
- @end itemize
- @node gnu.java.lang.management.VMThreadMXBeanImpl,gnu.java.lang.management.VMMemoryMXBeanImpl,gnu.java.lang.management.VMClassLoadingMXBeanImpl,gnu.java.lang.management
- @subsection @code{gnu.java.lang.management.VMThreadMXBeanImpl}
- The @code{gnu.java.lang.management.ThreadMXBeanImpl} provides an
- implementation of the @code{java.lang.management.ThreadMXBean} interface,
- and is supported by VM functionality in the form of
- @code{gnu.java.lang.management.VMThreadMXBeanImpl}. This provides a
- series of methods, which should be implemented by the virtual machine
- in order to provide the required information for the bean. Implementing
- this bean requires the VM to monitor thread-related statistics such as
- how often the blocked and waiting states have been entered, as well as
- additional optional support for time and contention monitoring.
- Optional support is determined by the following properties:
- @itemize @bullet
- @item @code{gnu.java.lang.management.CurrentThreadTimeSupport} --
- This property should be present if the VM supports monitoring the
- time used by the current thread. If time monitoring for all threads
- is supported, this need not be provided.
- @item @code{gnu.java.lang.management.ThreadTimeSupport} --
- This property should be present if the VM supports monitoring the
- time used by all threads.
- @item @code{gnu.java.lang.management.ThreadContentionSupport} --
- This property should be present if the VM supports thread contention
- monitoring.
- @item @code{gnu.java.lang.management.MonitorUsageMonitoringSupport} --
- This property should be present if the VM supports the monitoring
- of object monitor usage.
- @item @code{gnu.java.lang.management.OwnableSynchronizerUsageMonitoringSupport} --
- This property should be present if the VM supports the monitoring
- of ownable synchronizer usage.
- @end itemize
- In addition, the property
- @code{gnu.java.lang.management.ThreadTimeInitallyEnabled} may be
- set to the @code{String} value, @code{"true"}, if time monitoring
- is enabled at startup.
- The methods are as follows:
- @itemize @bullet
- @item @code{(findDeadlockedThreads())} -- This should return
- an array of thread identifiers which match threads involved in
- deadlock cycles (where each thread is waiting to obtain a lock
- held by one of the others) on object monitors or ownable
- synchronizers. This is specified as a native method in the
- reference implementation, and is optional. It is only called
- when the VM supports ownable synchronizer monitoring.
- @item @code{(findMonitorDeadlockedThreads())} -- This should return
- an array of thread identifiers which match threads involved in
- deadlock cycles (where each thread is waiting to obtain a lock
- held by one of the others) on object monitors. This is specified
- as a native method in the reference implementation.
- @item @code{(getAllThreads())} -- This should return an array of
- all live threads and set the @code{filled} variable to the number
- found. A default implementation is provided.
- @item @code{(getAllThreadIds())} -- This should return an array of
- all live thread identifiers. An implementation is provided against
- @code{getAllThreads()} by default.
- @item @code{(getCurrentThreadCpuTime())} -- This should return the
- approximate number of nanoseconds of CPU time the current thread
- has used. This is an optional native method, which is used by VMs
- supporting time monitoring.
- @item @code{(getCurrentThreadUserTime())} -- This should return the
- approximate number of nanoseconds of user time the current thread
- has used. This is an optional native method, which is used by VMs
- supporting time monitoring.
- @item @code{(getDaemonThreadCount())} -- This should return the number
- of live daemon threads. A default implementation is provided, based
- on @code{getAllThreads()}.
- @item @code{(getLockInfo(ThreadInfo))} -- This is an optional native
- method called when the VM supports ownable synchronizer usage monitoring
- and the user has requested information for a particular thread. The
- supplied @code{ThreadInfo} object should be filled out with an
- array of @code{LockInfo} objects, providing details on each lock.
- @item @code{(getMonitorInfo(ThreadInfo))} -- This is an optional native
- method called when the VM supports object monitor usage monitoring
- and the user has requested information for a particular thread. The
- supplied @code{ThreadInfo} object should be filled out with an
- array of @code{MonitorInfo} objects, providing details on each lock.
- @item @code{(getPeakThreadCount())} -- The VM should maintain a record
- of the peak number of live threads, and return it when this method is
- called. This is specified as a native method in the reference
- implementation.
- @item @code{(resetPeakThreadCount())} -- This should reset the record
- of the peak number of live threads to the current number of live
- threads. This is specified as a native method in the reference
- implementation.
- @item @code{(getThreadCount())} -- This should return the number of
- live threads. A default implementation is provided, based on
- @code{getAllThreads()}.
- @item @code{(getThreadCpuTime(long))} -- This should return the
- approximate number of nanoseconds of CPU time the specified thread
- has used. This is an optional native method, which is used by VMs
- supporting time monitoring.
- @item @code{(getThreadUserTime(long))} -- This should return the
- approximate number of nanoseconds of CPU time the specified thread
- has used. This is an optional native method, which is used by VMs
- supporting time monitoring.
- @item @code{(getThreadInfoForId(long, int))} -- This return an instance
- of @code{java.lang.management.ThreadInfo} for the specified thread.
- The class includes a private constructor which VMs should use to initialise
- it with the appropriate values for the thread. The second argument
- given here specifies the depth of the stack trace supplied on construction
- of the instance. Special values are 0 (return an empty array) and
- @code{Integer.MAX_VALUE} (return the maximum depth possible). This
- is specified as a native method in the reference implementation.
- @item @code{(getTotalStartedThreadCount())} -- This should return the
- total number of threads that have been started by the VM, including ones
- that have died. This is specified as a native method in the reference
- implementation.
- @end itemize
- @node gnu.java.lang.management.VMMemoryMXBeanImpl,gnu.java.lang.management.VMCompilationMXBeanImpl,gnu.java.lang.management.VMThreadMXBeanImpl,gnu.java.lang.management
- @subsection @code{gnu.java.lang.management.VMMemoryMXBeanImpl}
- The @code{gnu.java.lang.management.MemoryMXBeanImpl} provides an
- implementation of the @code{java.lang.management.MemoryMXBean} interface,
- and is supported by VM functionality in the form of
- @code{gnu.java.lang.management.VMMemoryMXBeanImpl}. This provides a
- series of methods, which should be implemented by the virtual machine
- in order to provide the required information for the bean. Implementing
- this bean requires the VM to monitor the levels of heap and non-heap
- memory, and provide the number of objects which are eligible for garbage
- collection.
- The methods are as follows:
- @itemize @bullet
- @item @code{(getHeapMemoryUsage())} -- This should return
- an instance of @code{java.lang.management.MemoryUsage} with
- values pertaining to the heap. A default implementation is
- provided, based on @code{java.lang.Runtime}'s methods.
- @item @code{(getNonHeapMemoryUsage())} -- This should return
- an instance of @code{java.lang.management.MemoryUsage} with
- values pertaining to non-heap memory.
- @item @code{(getObjectPendingFinalizationCount())} -- Returns
- the number of objects which are no longer referenced, and which
- will thus be garbage collected on the next run of the garbage
- collector.
- @item @code{(isVerbose())} -- This should return @code{true}
- or @code{false}, depending on whether verbose memory management
- output is turned or not, respectively.
- @item @code{(setVerbose(boolean))} -- This should allow the
- verbose memory management output to be turned on and off.
- @end itemize
- @node gnu.java.lang.management.VMCompilationMXBeanImpl,gnu.java.lang.management.VMMemoryPoolMXBeanImpl,gnu.java.lang.management.VMMemoryMXBeanImpl,gnu.java.lang.management
- @subsection @code{gnu.java.lang.management.VMCompilationMXBeanImpl}
- The @code{gnu.java.lang.management.CompilationMXBeanImpl} provides an
- implementation of the optional @code{java.lang.management.CompilationMXBean}
- interface, and is supported by VM functionality in the form of
- @code{gnu.java.lang.management.VMCompilationMXBeanImpl}. This provides a
- single method for returning the number of milliseconds the virtual
- machine's Just-In-Time (JIT) compiler has spent compiling. Even if
- a JIT compiler is available and an instance of the bean supplied, this
- method is still optional.
- Optional support is determined by the following properties:
- @itemize @bullet
- @item @code{gnu.java.lang.compiler.name} -- This property should
- specify the name of the JIT compiler. Classpath also uses this,
- within @code{java.lang.management.ManagementFactory}, to determine
- whether a bean should be created. If this property is set to a
- non-null value, a bean will be created and its @code{getName()}
- method will return this value.
- @item @code{gnu.java.lang.management.CompilationTimeSupport} --
- This property should be present if the VM supports monitoring the
- time spent compiling.
- @end itemize
- Time support is implemented by the following method:
- @itemize @bullet
- @item @code{(getTotalCompilationTime())} -- This should return the
- number of milliseconds the JIT compiler has spent compiling.
- @end itemize
- @node gnu.java.lang.management.VMMemoryPoolMXBeanImpl,gnu.java.lang.management.VMMemoryManagerMXBeanImpl,gnu.java.lang.management.VMCompilationMXBeanImpl,gnu.java.lang.management
- @subsection @code{gnu.java.lang.management.VMMemoryPoolMXBeanImpl}
- The @code{gnu.java.lang.management.MemoryPoolMXBeanImpl} provides an
- implementation of the optional @code{java.lang.management.MemoryPoolMXBean}
- interface, and is supported by VM functionality in the form of
- @code{gnu.java.lang.management.VMMemoryPoolMXBeanImpl}. Providing
- this interface requires implementing a number of methods for each supported
- pool. These return statistics on memory usage, and, optionally, allows
- monitoring of when memory usage exceeds a preset threshold.
- Optional support is determined by the following properties:
- @itemize @bullet
- @item @code{gnu.java.lang.management.CollectionUsageThresholdSupport} --
- This property should be present if the VM supports setting a collection
- usage threshold and monitoring when it is matched or exceeded. Collection
- usage thresholds are related to the remaining memory usage following a
- garbage collection cycle.
- @item @code{gnu.java.lang.management.UsageThresholdSupport} --
- This property should be present if the VM supports setting a
- usage threshold and monitoring when it is matched or exceeded.
- @end itemize
- The methods are as follows (all take a pool name as their
- first parameter):
- @itemize @bullet
- @item @code{(getCollectionUsage(String))} -- Returns a
- @code{java.lang.management.MemoryUsage} object, containing the
- memory usage statistics following a garbage collection cycle
- for the specified pool. This may also return @code{null} if
- the pool isn't an appropriate pool for this particular task.
- @item @code{(getCollectionUsageThreshold(String))} -- Returns
- the pool's collection usage threshold, if supported.
- @item @code{(getCollectionUsageThresholdCount(String))} -- Returns
- the number of times the specified pool has matched or exceeded
- its collection usage threshold, if supported.
- @item @code{(getMemoryManagerNames(String))} -- Returns a list
- of names of memory managers which manage the specified pool.
- @item @code{(getPeakUsage(String))} -- Returns a
- @code{java.lang.management.MemoryUsage} object for the peak
- usage level of the specified pool.
- @item @code{(getType(String))} -- Returns a string containing
- either @code{"HEAP"} or @code{"NON_HEAP"} which indicates the type of
- memory used by the specified pool.
- @item @code{(getUsage(String))} -- Returns a
- @code{java.lang.management.MemoryUsage} object for the current
- usage level of the specified pool.
- @item @code{(getUsageThreshold(String))} -- Returns
- the pool's usage threshold, if supported.
- @item @code{(getUsageThresholdCount(String))} -- Returns
- the number of times the specified pool has matched or exceeded
- its usage threshold, if supported.
- @item @code{(isValid(String))} -- Returns true if the pool
- is still in use by the virtual machine.
- @item @code{(resetPeakUsage(String))} -- Resets the peak usage
- levels to the current usage levels for the specified pool.
- @item @code{(setCollectionUsageThreshold(String, long))} -- Sets
- the pool's collection usage threshold, if supported.
- @item @code{(setUsageThreshold(String, long))} -- Sets
- the pool's usage threshold, if supported.
- @end itemize
- @node gnu.java.lang.management.VMMemoryManagerMXBeanImpl,gnu.java.lang.management.VMGarbageCollectorMXBeanImpl,gnu.java.lang.management.VMMemoryPoolMXBeanImpl,gnu.java.lang.management
- @subsection @code{gnu.java.lang.management.VMMemoryManagerMXBeanImpl}
- The @code{gnu.java.lang.management.MemoryManagerMXBeanImpl} provides an
- implementation of the optional @code{java.lang.management.MemoryManagerMXBean}
- interface, and is supported by VM functionality in the form of
- @code{gnu.java.lang.management.VMMemoryManagerMXBeanImpl}. Providing
- this interface requires implementing two methods (each takes the name
- of the manager as the first argument):
- @itemize @bullet
- @item @code{(getMemoryPoolNames(String))} -- Returns a list of the
- memory pools that the manager maintains. A default implementation
- which scans the results of @code{getMemoryManagerNames()} for each
- pool is provided.
- @item @code{(isValid(String))} -- Returns true if the specified
- manager is still valid, i.e., it is still in use by the virtual machine.
- @end itemize
- @node gnu.java.lang.management.VMGarbageCollectorMXBeanImpl,,gnu.java.lang.management.VMMemoryManagerMXBeanImpl,gnu.java.lang.management
- @subsection @code{gnu.java.lang.management.VMGarbageCollectorMXBeanImpl}
- The @code{gnu.java.lang.management.GarbageCollectorMXBeanImpl} provides an
- implementation of the optional @code{java.lang.management.GarbageCollectorMXBean}
- interface, and is supported by VM functionality in the form of
- @code{gnu.java.lang.management.VMGarbageCollectorMXBeanImpl}. Providing
- this interface requires implementing two methods (each takes the name
- of the garbage collector as the first argument):
- @itemize @bullet
- @item @code{(getCollectionCount(String))} -- Returns the number of
- times the specified garbage collector has run.
- @item @code{(getCollectionTime(String))} -- Returns the accumulated
- number of milliseconds for which the garbage collector has run.
- @end itemize
- Note that each garbage collector is also a memory manager, and so an
- implementation of the @code{gnu.java.lang.management.VMMemoryManagerMXBeanImpl}
- methods for its name should also be provided.
- @node java.lang.management, Classpath Callbacks, gnu.java.lang.management, Classpath Hooks
- @section @code{java.lang.management}
- @code{gnu.java.lang.management} provides the VM interfaces for the GNU
- implementations of the management beans.
- @menu
- * java.lang.management.VMManagementFactory::
- @end menu
- @node java.lang.management.VMManagementFactory,,,java.lang.management
- @subsection @code{java.lang.management.VMManagementFactory}
- This VM interface provides the names of the memory pools, memory managers
- and garbage collectors for use by the @code{java.lang.management.ManagementFactory}
- in creating lists of appropriate beans for these types of managed object.
- The methods are as follows:
- @itemize @bullet
- @item @code{(getMemoryPoolNames())} -- Returns a list of the names
- of the current memory pools in use by the virtual machine.
- @item @code{(getMemoryManagerNames())} -- Returns a list of the names
- of the current memory managers in use by the virtual machine. This
- should not include those that are also garbage collectors.
- @item @code{(getGarbageCollectorNames())} -- Returns a list of the names
- of the current garbage collectors in use by the virtual machine.
- @end itemize
- @node Classpath Callbacks, , java.lang.management, Classpath Hooks
- Some of the classes you implement for the VM will need to call back to
- package-private methods in Classpath:
- @itemize @bullet
- @item @code{java.lang.ThreadGroup.addThread(Thread)}
- Call this method from @code{Thread} when a new @code{Thread} is created, to add it to
- the group.
- @item @code{java.lang.ThreadGroup.removeThread(Thread)}
- Call this method from @code{Thread} when a @code{Thread} is stopped or destroyed.
- @item @code{gnu.java.lang.management.MemoryMXBeanImpl.fireThresholdExceededNotification(String, long, long, long, long)}
- If the monitoring of memory usage thresholds is supported, this method
- should be called when the normal usage of a memory pool crosses the
- threshold, in order to emit a notification. Another notification
- should not be emitted until there is an intermittent period where the
- usage is again below the threshold. The parameters are the memory
- pool name, the usage levels (init, used, committed and max) and the
- number of times the threshold has been crossed.
- @item @code{gnu.java.lang.management.MemoryMXBeanImpl.fireCollectionThresholdExceededNotification(String, long, long, long, long)}
- If the monitoring of memory usage thresholds is supported, this method
- should be called when the usage of a memory pool after a garbage
- collection cycle crosses the threshold, in order to emit a
- notification. Another notification should not be emitted until there
- is an intermittent period where the usage is again below the
- threshold. The parameters are the memory pool name, the usage levels
- (init, used, committed and max) and the number of times the threshold
- has been crossed.
- @end itemize
- @node VM Hooks, JNI Implementation, Classpath Hooks, Top
- @comment node-name, next, previous, up
- @chapter VM Hooks
- VMs need to do some dirty work; there are some things in the VM that
- unfortunately are dependent on the internal structure of various
- classes. This is a guide to all of the things the VM itself needs to
- know about classes.
- Some of the core classes, while being implemented by GNU Classpath,
- provide space for state (in the form of a @code{vmdata} object) to be
- stored by the VM, and can not be constructed normally.
- @itemize @bullet
- @item java.lang.Class
- @item java.lang.ClassLoader
- @end itemize
- The default implementations of some VM classes also follow this methodology,
- when it is intended that most VMs will keep the default.
- @itemize @bullet
- @item java.lang.VMThread
- @item java.lang.VMThrowable
- @end itemize
- Several core classes must be completely implemented by the VM for Classpath to
- work, although reference implementations are provided. These classes are:
- @itemize @bullet
- @item java.lang.reflect.Constructor
- @item java.lang.reflect.Method
- @item java.lang.reflect.Field
- @end itemize
- The following issues are of note;
- @itemize @bullet
- @item @code{java.lang.Class} @*
- The GNU Classpath implementation of @code{java.lang.Class} provides an
- object for storing the internal state of the class maintained by the VM.
- This is the only known place where this matters. The class is
- constructed with this data by the VM@. Some VMs do not create the
- @code{Class} object at the point where the class is defined; instead,
- they wait until a @code{Class} object is actually used.
- @item Array Classes @*
- When you are creating an array class, you should set the
- @code{ClassLoader} of the array class to the @code{ClassLoader} of its
- component type. Whenever you add a class to a @code{ClassLoader}, you
- need to notify the @code{ClassLoader} and add the new @code{Class} to
- its internal cache of classes. To do this, call
- @code{ClassLoader.addVMCreatedClass(Class)}. @emph{Note: this is
- written in anticipation of 1.2 support and does not apply just yet.}
- @item Primordial Class Loader @*
- When the primordial class loader loads a class, it needs to tell
- Classpath what it has done in order for security stuff to work right.
- To do this, call the static method
- @code{ClassLoader.newPrimordialClass(Class)}.
- Even the first few core classes need to do this; in order to do it,
- simply call this method @emph{after} the initial class loading has been
- done. No harm will come, as long as you follow the guidelines in the
- @pxref{Initialization} section.
- @emph{Note: this is written in anticipation of 1.2 support and does not
- apply just yet.}
- @item Top-level Exception Handler @*
- Exceptions take care of themselves in Classpath; all you need to do in
- the top-level exception handler is call @code{Throwable.printStackTrace()}.
- @item Security and Traces @*
- There will eventually be a feature in the 1.2 security that keeps the
- @code{AccessController} from having to evaluate @emph{all} of the
- @code{ProtectionDomain}s every time a security check is made. I think a common
- case is a single method doing a lot of things that require security
- checks. However, I don't want to bog down the method stack too much, so
- this feature of the VM will have the @code{AccessController} for a thread
- calling out to the VM to tell it how high it was on the stack when it
- made the last security request. Every time the stack goes lower than
- that number, the VM will decrement the number. The @code{AccessController}
- will remember what the accumulated protection status was at every stack
- level (an @code{AccessControlContext}) and use that aggregated information to
- do the check. I am not sure, however, whether the savings are
- substantial enough to outweigh the integer check and set after every
- method call. I will investigate.
- @item Threading @*
- I figured I'd put this here because a VM guy might be wondering about it.
- We implement @code{ThreadGroup}, but that class is almost entirely
- VM-independent. The root @code{ThreadGroup}, a static field called
- @code{ThreadGroup.root}, should be initialized by Classpath, but if you wish to
- reinitialize it yourself, there should be no harm.
- @end itemize
- @node JNI Implementation, JVMTI Implementation, VM Hooks, Top
- @comment node-name, next, previous, up
- @chapter JNI Implementation
- Classpath comes with its own implementation of @file{jni.h}. This
- file can be customized by the VM in a few ways, by defining macros
- that affect the interpretation of the file. These macros are all
- intended for use by a VM which uses GNU Classpath and which wants to
- use a single copy of @file{jni.h} for both internal and external use.
- @itemize @bullet
- @item _CLASSPATH_VM_JNI_TYPES_DEFINED
- Some VMs like to define JNI ``object'' types in a special way. If
- this macro is defined, the Classpath @file{jni.h} will avoid defining
- these types. By default, these types are defined in @file{jni.h}.
- The full list of types and macros treated this way is: @samp{jobject},
- @samp{jclass}, @samp{jstring}, @samp{jthrowable}, @samp{jweak},
- @samp{jarray}, @samp{jobjectArray}, @samp{jbyteArray},
- @samp{jshortArray}, @samp{jintArray}, @samp{jlongArray},
- @samp{jbooleanArray}, @samp{jcharArray}, @samp{jfloatArray},
- @samp{jdoubleArray}, @samp{JNIEnv}, @samp{JavaVM}, @samp{JNI_TRUE}
- (macro), @samp{JNI_FALSE} (macro).
- @item _CLASSPATH_VM_INTERNAL_TYPES_DEFINED
- If the VM has its own definitions for @samp{jfieldID} and
- @samp{jmethodID}, then it should define this macro. Otherwise,
- @file{jni.h} will provide definitions for these types.
- @item _CLASSPATH_JNIIMPEXP
- Three functions -- @samp{JNI_GetDefaultJavaVMInitArgs},
- @samp{JNI_CreateJavaVM}, and @samp{JNI_GetCreatedJavaVMs} -- must be
- marked as @samp{JNIIMPORT} when seen by user code, but most likely
- should be marked as @samp{JNIEXPORT} when defined in the VM
- implementation. This macro can be defined to one or the other by the
- VM as appropriate. If this macro is not defined, it defaults to
- @samp{JNIIMPORT}.
- @item _CLASSPATH_JNIENV_CONTENTS
- A VM can add fields to the @samp{JNIEnv} structure by defining this to
- be a sequence of field declarations.
- @end itemize
- @node JVMTI Implementation, Miscellaneous VM Requirements, JNI Implementation, Top
- @comment node-name, next, previous, up
- @chapter JVMTI Implementation
- Classpath comes with its own implementation of @file{jvmti.h}. This
- file can be customized by the VM in a few ways by defining macros that
- affect the interpretation of the file. These macros are all intended
- for use for use by a VM which uses GNU Classpath and which wants to
- use a single copy of @file{jvmti.h} for both internal and external use.
- @itemize @bullet
- @item _CLASSPATH_VM_JVMTI_TYPES_DEFINED
- Some VMs like to define JVMTI ``object'' types in a special way. If
- this macro is defined, the Classpath @file{jvmti.h} will avoid defining
- these types. By default these types are defined in @file{jvmti.h}.
- The full list of types and macros treated this way is: @samp{jthread},
- @samp{jthreadGroup}, @samp{jlocation}, and @samp{jrawMonitorID}. By
- default @samp{jrawMonitorID} is defined as an opaque pointer which
- must be defined by the VM.
- @item _CLASSPATH_JVMTIENV_CONTENTS
- A VM can add fields to the @samp{jvmtiEnv} structure by defining this
- to be a sequence of field declarations.
- @end itemize
- @node Miscellaneous VM Requirements, , JVMTI Implementation, Top
- @comment node-name, next, previous, up
- @chapter Miscellaneous VM Requirements
- Classpath places a few requirements on the VM that uses it.
- @menu
- * JNI Version::
- * VM Threading Model::
- * Boot Library Path Property::
- @end menu
- @node JNI Version, VM Threading Model, Miscellaneous VM Requirements, Miscellaneous VM Requirements
- @comment node-name, next, previous, up
- @section JNI Version
- Classpath currently uses only JNI 1.1, except for one JNI 1.2 function
- in the JNI Invocation API: GetEnv(). And GetEnv() is only used in the
- now deprecated ``portable native sync'' code.
- A future direction will probably be to require that all VMs provide
- JNI 1.2. If this poses problems, please raise them on the classpath
- mailing list.
- @node VM Threading Model, Boot Library Path Property, JNI Version, Miscellaneous VM Requirements
- @comment node-name, next, previous, up
- @section VM Threading Model
- VM authors can implement a number of different threading models. When
- native code is also threaded there is the potential for one threading
- model to deadlock the other. The
- @uref{http://java.sun.com/docs/books/jni/html/other.html#29406,Java
- Native Interface Programmer's Guide and Specification} suggests
- consulting VM documentation in such situations. Classpath uses
- existing libraries, for example the AWT peers can use the GTK+
- graphics library. As these libraries assume a different threading
- model, there is the potential for the native code to deadlock a VM.
- The different threading models available to a VM author are:
- @enumerate
- @item
- @i{Native threads}: Map a Java thread to an underlying operating system
- thread (normally a POSIX compatible pthread). This approach reduces
- the potential for deadlock as there is only one thread scheduling
- mechanism.
- @item
- @i{Green threads 1}: Green threads are threads scheduled by the VM,
- typically by switching swapping registers. In early VMs green threads
- were seen as advantageous as they didn't require the operating system
- to reschedule, save and swap all of a threads registers. The green
- thread 1 model switches thread on an externally created event, such as
- a timer interrupt. An example of a VM using this approach is Kaffe
- configured with its jthreads model.
- @item
- @i{Green threads 2}: The essential difference with this model is to
- not switch threads on an event, but at fixed points in the code being
- executed by the VM@. Points chosen could be backward branches (loops)
- or method calls. This approach can be advantageous to nonconservative
- garbage collectors, as non-running threads would be at known points
- and can have fixed register maps. It can also reduce the number of
- registers it is necessary to swap when switching threads.
- @item
- @i{M:N threading}: a flaw to green threading is that it is unable to
- use multiple processors. @i{M}:@i{N} threading fixes this problem by
- running groups of green threads on multiple underlying native
- threads. An example of a VM using this approach is the Jikes RVM,
- which uses @i{M}:@i{N} threading combined with the green thread 2
- model.
- @end enumerate
- An example of the problem of mixing threading models is:
- @itemize @bullet
- @item
- A Java thread calls a native method. The native method acquires a lock.
- @item
- The native method calls back into the VM.
- @item
- An event triggers the VM to reschedule the currently running thread.
- @item
- A new VM thread, executing on the same underlying native thread, calls
- a native method.
- @item
- The native method tries to acquire the lock already acquired earlier. As
- the lock is busy the thread waits and allows the operating system to
- reschedule native threads.
- @item
- The operating system reschedules the VM thread again, but the lock is
- still busy and in some threading models will remain busy forever
- (the VM is deadlocked).
- @end itemize
- VMs that don't use the underlying operating system thread scheduling
- mechanism need to avoid deadlock. One now deprecated approach was to
- build Classpath and VMs on top of a wrapper thread library (aka
- portable native sync). The wrapper thread library used was GLIB's
- @dfn{gthreads}. This approach has been deprecated because:
- @enumerate
- @item
- The wrapper library is only in use by some native libraries. For
- example, GTK+ uses the gthread library but QT does not.
- @item
- The wrapper library can't be in use prior to the VM starting as the VM
- must replace the wrapper libraries functions with its own. This
- prevents the VM from running as a plugin in an application that
- already uses the wrapper library.
- @end enumerate
- An alternative approach is for the VM to detect deadlocked native code
- and swap Java threads off of that native thread. The VM can't,
- however, swap two blocked native threads that are potentially
- deadlocking each other on a lock. The lock will be associated with the
- native thread. To prevent this from happening the VM must hijack
- functions that operate on locks. This is done by redefining the lock
- functions inside the VM and configuring the linker so that it uses the
- VMs symbol in preference to that of the external thread support
- library. The VM's lock function can then reschedule Java threads if it
- must wait for the lock.
- @node Boot Library Path Property, , VM Threading Model, Miscellaneous VM Requirements
- @comment node-name, next, previous, up
- @section Boot Library Path Property
- As of GNU Classpath 0.15 a system property named @code{gnu.classpath.boot.library.path}
- can be set by the VM to specify the directories which contain GNU Classpath's native
- libraries. Usually this value is given at configuration time and is then hardcoded
- in the VM@. However for development purposes it is handy to switch to another installation
- by overriding the properties' value on the command line.
- A VM that does not support this feature can simply ignore the property.
- For compatibility reasons we suggest to set the default value of @code{java.library.path}
- to the value of the @code{LD_LIBRARY_PATH} environment if it exists on your platform.
- @bye
|