关闭

关闭

关闭

封号提示

内容

首页 JVM基础.pdf

JVM基础.pdf

JVM基础.pdf

上传者: jack20039 2011-10-10 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《JVM基础pdf》,可适用于IT/计算机领域,主题内容包含Java虚拟机基础温绍锦年月日星期四提纲•HotSpot•ClassFile•ClassLoader•内存模型、锁、同步•JVM内存管理和垃圾收集年符等。

Java虚拟机基础温绍锦年月日星期四提纲•HotSpot•ClassFile•ClassLoader•内存模型、锁、同步•JVM内存管理和垃圾收集年月日星期四HotSpot介绍•Java发展历程•JVM列表•OpenJDK•编译执行过程•解析执行和JIT编译年月日星期四Java发展历程JDKJDKJSEJSEJSEJSEJavaSEJavaSE‐‐泛型For‐EachAutoboxing变长参数ulconcurrentJMX‐‐正则表达式NIOExcepon ChainJAXP (XML)Java Web Start‐‐NIO Invoke DynmaicString‐SwitchTry‐With‐Resource‐‐AnnotaonSwing增强JPDA增强JM Tool Interface‐‐SE、ME、EE反射集合框架Java IDLSwingPlugin‐inJIT Compiler‐‐AWTInner ClassJavaBeansJDBC‐‐HotSpotJava SoundJNDIJPDA (Debug)阿里巴巴BB主流版本年Sun发布Java承诺:WriteOnceRunAnywhere年月日星期四Java平台年月日星期四Java是最通用的业务编程语言年月日星期四Java虚拟机列表虚拟机描述OracleHotSpot原来属于SUNSUN被Oracle收购之后属于Oracle是目前最流行的JVMOracleJRockit原来属于BEABEA被Oracle收购之后属于Oracle拥有一些优秀特性将会和HotSpot合并IBMJIBM的JDKAppleMacOSRuntimeforJavaApple公司开发的虚拟机运行在MacOSX系统上ApacheHarmonyApache组织开发的虚拟机基于ApacheLicenseDalvikGoogle实现的JVMAndroid的虚拟机。MaxineOracle的一个用Java编写的Java虚拟机用于研究目的其它有很多虚拟机的实现http:enwikipediaorgwikiListofJavavirtualmachines合并年月日星期四HotSpot•Oracle(SUN)的JVM实现•主要用C实现•解析器和编译器混合执行模式•默认解析执行对执行频率高(热点)的代码做动态编译•年开源年月日星期四OpenJDK•Sun在年月日把HotSpot及编译器通过GPL协议开源称为OpenJDK•这是自由软件社区的重要里程碑•加入OpenJDK的厂商包括:Oracle、IBM、Apple、SAP•支持的操作系统包括:Windows、Linux、Solaris、BSD、MacOS、Haiku。•支持的硬件体系架构包括:x、adm、sparc、PowerPC、mips、IA、ARM年月日星期四•一个ByteCode Interpreter•两个 JIT Compiler:•C (client编译器)•轻量级•编译时间更短 占用内存少适合GUI•C (server编译器)•重量级•执行效率更高大量编译优化适合服务器HotSpot包括:年月日星期四$javaversionjavaversion""Java(TM)SERuntimeEnvironment(buildbA)JavaHotSpot(TM)BitServerVM(buildb,mixedmode)解析和编译混合模式javaXintversionjavaversion""Java(TM)SERuntimeEnvironment(buildbA)JavaHotSpot(TM)BitServerVM(buildb,interpretedmode)javaXcompversionjavaversion""Java(TM)SERuntimeEnvironment(buildbA)JavaHotSpot(TM)BitServerVM(buildb,compiledmode)纯解析模式纯编译模式HotSpot三种执行模式从Java开始SunHotSpotVM可以根据环境自动选择启动参数在“服务器级”机器上会自动选用server模式(但在位Windows上总是默认使用client模式)。“服务器级”指CPU为核或以上(或者CPU或以上)并且内存有GB或更多的机器。年月日星期四一些关于JIT的参数OptionFeatureXintjvm选择纯解析模式缺省是混合模式Xcompjvm选择纯编译模式缺省是混合模式XX:AggressiveOpts采用激进的优化办法XX:CompileThreshold=判断是否热点进行编译的调用次数XX:CITime输出JIT编译所耗费的时间XX:PrintCompilation当一个方法被编译时打印信息。这个参数对于调优基础组件有用。XX:InlineSmallCodeXX:MaxInlineSize=XX:FreqInlineSize=代码内联的判断依据调整编译后代码的字节大小是判断条件XX:LoopUnrollLimit=编译优化时将循环展开的上限值年月日星期四Class文件格式•Java编译执行流程•ClassFile的格式介绍•ClassFile中FieldInfo和MethodInfo介绍•类型描述Descriptor介绍•ClassFile中的Attribute介绍•JVM指令介绍年月日星期四PCOperatingSystemclassFoo{**}classFoo{**}classFoo{**}classFoo{**}classFoo{**}classFoo{**}classFoo{**}iconstiloadistore内存管理ByteCodeVerifierInterpreterJITCompilerJavaAPIIntelXJVMPCOperatingSystem内存管理ByteCodeVerifierInterpreterJITCompilerJavaAPIAMDJVMJREJREclassFoo{**}classFoo{**}classFoo{**}deff(x):printxclassFoo{**}classFoo{**}classFoo{**}iconstiloadistorejavacjythonjavabytecodefile(classjar)javabytecodefile(classjar)javasourcefile(java)Pythonsourcefile(py)源码字节码执行字节码是实现跨平台的基础编译执行流程年月日星期四ClassFileFormatMagicNumberVersionConstantPoolAccessFlagsThisClassNameSuperClassNameInterfacesFieldsMethodsAttributes魔数值为xCAFEBABEJava创始人JamesGosling制定包括minorversion和majorversionminorversion:(),(),(),(),(),(),()。指令集多年不变但是版本号每次发布都变化。包括字符串常量、数值常量等个字节+个字节+n个字节个字节个字节个字节n个字节n个字节n个字节n个字节年月日星期四AccessFlagsNameIndexDescriptorIndexAttributesAccessFlagsNameIndexDescriptorIndexAttributes字段方法privatepubicprotectedstatic真正的名称存在常量池中这里保存一个Index真正的描述信息存在常量池中这里保存一个Index访问标识名称类型信息属性信息包括:泛型信息异常信息调试信息字段和方法年月日星期四DescriptorTypeBbyte带符号的byteCcharUnicode字符Ddouble双精度浮点数Ffloat单精度浮点数Iint位整数Jlong位整数Sshort位整数ZbooleantrueorfalseLClassnamereference引用类型LjavalangString表示StringLjavalangInteger表示Integerreference数组类型例如:I表示intLjavalangObject表示Object,D表示double年月日星期四Attribute类型使用范围ConstantValueFieldInfo定义字段的初始值CodeMethodInfo方法的代码StackMapTableCodeAttribute调试信息ExceptionMethodInfo异常信息InnerClassClassFile内嵌类EnclosingMethodClassFile匿名类SyntheticClassFileMethodInfoFieldInfo缺省构造函数等SignatureClassFileMethodInfoFieldInfo泛型信息SourceFileClassFile源码信息SourceDebugExtensionClassFile调试信息LineNumberTableCodeAttribute调试信息LocalVariableTableCodeAttribute调试信息LocalVariableTypeTableCodeAttribute调试信息DeprecatedClassFileMethodInfoFieldInfoRuntimeVisibleAnnotationsClassFileMethodInfoFieldInfoAnnotation信息RuntimeInvisibleAnnotationsClassFileMethodInfoFieldInfoAnnotation信息RuntimeVisibleParameterAnnotationsMethodInfoAnnotation信息RuntimeInvisibleParameterAnnotationsMethodInfoAnnotation信息AnnotationDefaultMethodInfoAnnotation信息年月日星期四publicstaticf()IICONSTISTOREICONSTISTOREILOADILOADIADDBIPUSHIMULISTOREILOADIRETURNMAXSTACK=MAXLOCALS=}publicstaticintf(){inta=intb=intc=(ab)*returnc}操作栈大小局部变量区大小操作栈局部变量注意:double和long类型会占据两个栈位装载常量保存变量装载常量保存变量装载变量装载变量加法运算装载常量乘法运算保存变量年月日星期四装载和存储指令从局部变量装载到操作栈iloadlloadfloaddloadaload将操作栈保存到局部变量istroelstorefstoredstoreastore装载常量到操作栈bipushsipushldcldcwaconst算术运算指令加iaddladdfadddadd减isublsubfsubdsub乘imullmulfmuldmul除idivldivfdivddiv求余iremlremfremdrem负数ineglnegfnegdneg位移ishlishriushrlshllshrlushr位操作iorloriandlandixorlxor自增iinc比较dcmpgdcmplfcmpgfcmpllcmp类型转换数值类型转换ibicislififldidldf对象创建和处理创建对象new创建数组newarrayanewarraymulanewarray访问字段getfieldpieldgetstaticputstatic操作栈指令poppopdupdupdupxdupxdupxdupxswap跳转指令条件跳转ifegifltifleifneifgtifgeififnonificmpegificmpneificmpltificmpgtificmpleifacmpeqifacmpne组合跳转tableswitchlookupswitch无条件跳转gotogotowjsrjsrwret方法调用invokevirtualinvokeinterfaceinvokespecialinvokestatic方法调用returnireturnlreturnfreturndreturnareturn返回同步monitorentermonitorexit年月日星期四ClassLoader•各种ClassLoader介绍•ClassLoader工作机制•ThreadgetContextClassLoader()•JarHell问题以及解决办法年月日星期四BootrapclassloaderExtensionsclassloaderSystemclassloaderCoreAPIs(eg,rtjar)javalangjavaioDefaultextensions(eg,jrelibext)etc(defaulttonone)Classpathclassesorgapachetomcatetc各种ClassLoader介绍Applicationclassloaderapplicationclassesetccomalibabaorgspring年月日星期四获得ClassLoader的途径clazzgetClassLoader()ClassLoadergetSystemClassLoader()ThreadcurrentThread()getContextClassLoader()DriverManagergetCallerClassLoader()获得当前类的ClassLoader获得当前线程上下文的ClassLoader获得系统的ClassLoader获得调用者的ClassLoader年月日星期四Jarhell问题以及解决办法ClassLoaderclassLoader=ThreadcurrentThread()getContextClassLoader()StringreosurceName="comalibabasimpleELdialecttinyTinyELEvalServiceclass"Enumeration<URL>urls=classLoadergetResources(reosurceName)while(urlshasMoreElements()){URLurl=urlsnextElement()Systemoutprintln(url)}当一个类或者一个资源文件存在多个jar中就会存在jarhell问题。可以通过以下代码来诊断问题:jar:file:Usersadminmrepositorycomalibabaplatformsharedsimpleelsimpleeljar!comalibabasimpleELdialecttinyTinyELEvalServiceclass年月日星期四内存模型、锁和同步•多核处理器模型•volatile•cas•synchronized、lock年月日星期四多核处理器多核处理器内存模型CoreCacheCoreCacheCoreCacheCoreCacheInterconnectionnetworkMemory状态描述M(Modified)这行数据有效数据被修改了和内存中不一致数据只存在于本Cache中E(Exclusive)这行数据有效数据和内存中的一致数据只存在本Cache中S(Shared)这行数据有效数据和内存中的一致数据存在多分Cache中I(Invalid)这行数据无效多核处理器缓存一致性协议MESI年月日星期四volatile•如果不声明volatile变量装载到本地变量中或者cpucache中多线程下很容易导致状态不一致。•声明了volatile每次访问的都是主存中的数据一致性能提升但是还是不可靠的。•volatile字段的访问效率很低每次访问都需要十几个nano。大约为lock的时间年月日星期四CAS(CompareAndSwap)•CAS指令由硬件提供•并发程序设计实现的基础•之后并不需要锁总线•基于MESI缓存一致性协议http:blogsoraclecomdaveentrybiasedlockinginhotspot年月日星期四lock和synchronized•保证代码块的不可重入•底层都是基于CAS实现的•通过jstackl<pid>获得jvm的线程信息和锁信息•年月日星期四JVM内存管理和垃圾收集•内存管理•垃圾收集•新生代的垃圾收集•老生代的垃圾收集•不同垃圾收集的行为•垃圾收集器选择年月日星期四内存管理EdenSTenuredVirtualVirtualPermVirtualSTotalJVMHeapYoungGenerationOldGenerationOutofMemoryYoungGCFullGCXmnXmxXX:PermSizeXX:MaxPermSizeXX:SurvivorRatio=EdenSurvivorXX:NewRatio=OldGenerationYoungGeneration年月日星期四XXXXXXXEmptyYoungGenerationFromToOldGenerationEmptyEmptyYoungGenerationFromToOldGeneration回收前回收后垃圾回收EdenSurvivorSpacesEdenSurvivorSpaces年月日星期四XXXXStart of SweepingXEnd of SweepingXXXXStart of CompaconXEnd of CompaconCMS sweeping (but not compacng) of old generaonCompacon of the old generaonOld Generaon Gargage CollectorConcurrent Mark Sweep CollectorSerial Collector年月日星期四Inial MarkRemarkConcurrent SweepConcurrent MarkStop‐the‐world pauseStop‐the‐world pauseParallel CollectorSerialCollectorConcurrentMark‐SweepCollector更大吞吐量更短的停顿各种GC行为比较年月日星期四OldGenerationCollectorYoungGenerationCollectorGarbageCollectiorSelectionOptionGarbageCollectorSelectedIntroductedFeatureXX:UseSerialGCSerialSerialOldXX:UseParNewGCParNewSerialOldXX:UseParallelGCParallelScavengeSerialOldJDK多线程XX:UseParallelOldGCParallelScavengeParallelOldJDK多线程更大吞吐量XX:UseConcMarkSweepGCParNewCMSSerialOldJDK更短停顿XX:UnLockExperimentalVMOptionXX:UseGGCGarbageFirstJDK大内存更短停顿软实时SerialParNewParallelScanvengeCMSSerialOldParallelOldCMS年月日星期四

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/35
2下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部