为什么要写一个jvm的工具入门呢,一是自己也不会,二是因为不会所以想学一下,还有就是这个确实很重要,对学习jvm有很多的用处,对定位问题有很大的便利,以前毕业那会我记得有个笔试,知道JAVA_HOME/bin目录的工具吗,例举下3个以上,并说说有什么用,可以怎么使用,,,,我只能说呵呵了,写代码哪里要注意这么多哈
一、基础了解
我们一般安装java,首先都会来一个java命令(现阶段java8和11用的人比较多,我这里还是8)
D:\Data\lugh1>java 用法: java [-options] class [args...] (执行类) 或 java [-options] -jar jarfile [args...] (执行 jar 文件) 其中选项包括: -d32 使用 32 位数据模型 (如果可用) -d64 使用 64 位数据模型 (如果可用) -server 选择 "server" VM 默认 VM 是 server. -cp <目录和 zip/jar 文件的类搜索路径> -classpath <目录和 zip/jar 文件的类搜索路径> 用 ; 分隔的目录,JAR 档案 和 ZIP 档案列表,用于搜索类文件。 -D<名称>=<值> 设置系统属性 -verbose:[class|gc|jni] 启用详细输出 -version 输出产品版本并退出 -version:<值> 警告: 此功能已过时,将在 未来发行版中删除。 需要指定的版本才能运行 -showversion 输出产品版本并继续 -jre-restrict-search | -no-jre-restrict-search 警告: 此功能已过时,将在 未来发行版中删除。 在版本搜索中包括/排除用户专用 JRE -? -help 输出此帮助消息 -X 输出非标准选项的帮助 -ea[:<packagename>...|:<classname>] -enableassertions[:<packagename>...|:<classname>] 按指定的粒度启用断言 -da[:<packagename>...|:<classname>] -disableassertions[:<packagename>...|:<classname>] 禁用具有指定粒度的断言 -esa | -enablesystemassertions 启用系统断言 -dsa | -disablesystemassertions 禁用系统断言 -agentlib:<libname>[=<选项>] 加载本机代理库 <libname>,例如 -agentlib:hprof 另请参阅 -agentlib:jdwp=help 和 -agentlib:hprof=help -agentpath:<pathname>[=<选项>] 按完整路径名加载本机代理库 -javaagent:<jarpath>[=<选项>] 加载 Java 编程语言代理,请参阅 java.lang.instrument -splash:<imagepath> 使用指定的图像显示启动屏幕
参数分为三类,分别是:
标准参数(很稳定的)
-help
-version
-X参数 (非标准参数,不能保证被所有的JVM实现都支持)
-Xint
-Xcomp
-XX参数(使用率较高)
-XX:newSize
-XX:+UseSerialGC
反正以前我是不知道-X,-XX,+UseSerialGC中的+号是什么,或许现在知道,好像也比较容易忘记,因为也没经常使用呀
来试一下java -X
D:\Data\lugh1>java -X -Xmixed 混合模式执行 (默认) -Xint 仅解释模式执行 -Xbootclasspath:<用 ; 分隔的目录和 zip/jar 文件> 设置搜索路径以引导类和资源 -Xbootclasspath/a:<用 ; 分隔的目录和 附加在引导类路径末尾 -Xbootclasspath/p:<用 ; 分隔的目录和 置于引导类路径之前 -Xdiag 显示附加诊断消息 -Xnoclassgc 禁用类垃圾收集 -Xincgc 启用增量垃圾收集 -Xloggc:<file> 将 GC 状态记录在文件中 (带时间戳) -Xbatch 禁用后台编译 -Xms<size> 设置初始 Java 堆大小 -Xmx<size> 设置最大 Java 堆大小 -Xss<size> 设置 Java 线程堆栈大小 -Xprof 输出 cpu 配置文件数据 -Xfuture 启用最严格的检查,预期将来的默认值 -Xrs 减少 Java/VM 对操作系统信号的使用 (请参阅文档) -Xcheck:jni 对 JNI 函数执行其他检查 -Xshare:off 不尝试使用共享类数据 -Xshare:auto 在可能的情况下使用共享类数据 (默认) -Xshare:on 要求使用共享类数据,否则将失败。 -XshowSettings 显示所有设置并继续 -XshowSettings:all 显示所有设置并继续 -XshowSettings:vm 显示所有与 vm 相关的设置并继续 -XshowSettings:properties 显示所有属性设置并继续 -XshowSettings:locale 显示所有与区域设置相关的设置并继续
-Xms<size> 设置初始 Java 堆大小
-Xmx<size> 设置最大 Java 堆大小
-Xss<size> 设置 Java 线程堆栈大小
是不是觉得上面几个参数很熟悉,就是日常调整堆和栈大小的参数呀,很好记吧,比如java ‐Xms2048m ‐Xmx2048m class_name
在解释模式(interpreted mode)下,-Xint标记会强制JVM执行所有的字节码,当然这会降低运行速度,通常低10倍或更多
-Xcomp参数与它(-Xint)正好相反,JVM在第一次使用时会把所有的字节码编译成本地代码,从而带来最大程度的优化。然而,很多应用在使用-Xcomp也会有一些性能损失,当然这比使用-Xint损失的少,原因是-xcomp没有让JVM启用JIT编译器的全部功能。JIT编译器可以对是否需要编译做判断,如果所有代码都进行编译的话,对于一些只执行一次的代码就没有意义了
-Xmixed是混合模式,将解释模式与编译模式进行混合使用,由jvm自己决定,这是jvm默认的模式,也是推荐使用的模式
接下来了解下-XX参数:
-XX参数的使用有2种方式,一种是boolean类型,一种是非boolean类型(好像有点废话)
- boolean类型
非boolean类型
格式:-XX: 如:-XX:NewRatio=1 表示新生代和老年代的比值
那么多参数怎么记得呢,可以使用java -XX:+PrintFlagsFinal查看所有参数呀
D:\MyData\lugh1>java -XX:+PrintFlagsFinal [Global flags] intx ActiveProcessorCount = -1 {product} uintx AdaptiveSizeDecrementScaleFactor = 4 {product} uintx AdaptiveSizeMajorGCDecayTimeScale = 10 {product} uintx AdaptiveSizePausePolicy = 0 {product} uintx AdaptiveSizePolicyCollectionCostMargin = 50 {product} uintx AdaptiveSizePolicyInitializingSteps = 20 {product} uintx AdaptiveSizePolicyOutputInterval = {product} uintx AdaptiveSizePolicyWeight = {product} uintx AdaptiveSizeThroughPutPolicy = {product} uintx AdaptiveTimeWeight = 25 {product} bool AdjustConcurrency = false {product} bool AggressiveHeap = bool AggressiveOpts = {product} intx AliasLevel = 3 {C2 product} bool AlignVector = {C2 product} intx AllocateInstancePrefetchLines = {product} intx AllocatePrefetchDistance = 192 {product} intx AllocatePrefetchInstr = {product} intx AllocatePrefetchLines = {product} intx AllocatePrefetchStepSize = {product} intx AllocatePrefetchStyle = {product} bool AllowJNIEnvProxy = bool AllowNonVirtualCalls = bool AllowParallelDefineClass = bool AllowUserSignalHandlers = bool AlwaysActAsServerClassMachine = bool AlwaysCompileLoopMethods = bool AlwaysLockClassLoader = bool AlwaysPreTouch = bool AlwaysRestoreFPU = bool AlwaysTenure = bool AssertOnSuspendWaitFailure = bool AssumeMP = {product} intx AutoBoxCacheMax = 128 {C2 product} uintx AutoGCSelectPauseMillis = 5000 {product} intx BCEATraceLevel = {product} intx BackEdgeThreshold = 100000 {pd product} bool BackgroundCompilation = true {pd product} uintx BaseFootPrintEstimate = 268435456 {product} intx BiasedLockingBulkRebiasThreshold = {product} intx BiasedLockingBulkRevokeThreshold = 40 {product} intx BiasedLockingDecayTime = 25000 {product} intx BiasedLockingStartupDelay = 4000 {product} bool BindGCTaskThreadsTocpus = bool BlockLayoutByFrequency = {C2 product} intx BlockLayoutMinDiamondPercentage = {C2 product} bool BlockLayoutRotateLoops = {C2 product} bool BranchOnRegister = {C2 product} bool BytecodeVerificationLocal = bool BytecodeVerificationRemote = bool C1OptimizeVirtualCallProfiling = {C1 product} bool C1ProfileBranches = bool C1ProfileCalls = bool C1ProfileCheckcasts = bool C1ProfileInlinedCalls = bool C1ProfileVirtualCalls = bool C1UpdateMethodData = {C1 product} intx CICompilerCount := bool CICompilerCountPercpu = bool CITime = bool CMSAbortSemantics = {product} uintx CMSAbortablePrecleanMinWorkPerIteration = 100 {product} intx CMSAbortablePrecleanWaitMillis = {manageable} uintx CMSBitMapYieldQuantum = 10485760 {product} uintx CMSBootstrapOccupancy = bool CMSClassUnloadingEnabled = {product} uintx CMSClassUnloadingMaxInterval = bool CMSCleanOnEnter = bool CMSCompactWhenClearAllSoftRefs = {product} uintx CMSConcMarkMultiple = bool CMSConcurrentMTEnabled = {product} uintx CMSCoordinatorYieldSleepCount = bool CMSDumpAtPromotionFailure = bool CMSEdenChunksRecordAlways = {product} uintx CMSExpAvgFactor = bool CMSExtrapolateSweep = {product} uintx CMSFullGCsBeforeCompaction = {product} uintx CMSIncrementalDutyCycle = {product} uintx CMSIncrementalDutyCycleMin = bool CMSIncrementalMode = {product} uintx CMSIncrementalOffset = bool CMSIncrementalPacing = {product} uintx CMSIncrementalSafetyFactor = {product} uintx CMSIndexedFreeListReplenish = {product} intx CMSInitiatingOccupancyFraction = - {product} uintx CMSIsTooFullPercentage = 98 {product} double CMSLargeCoalSurplusPercent = 0.950000 {product} double CMSLargeSplitSurplusPercent = 1.000000 {product} bool CMSLoopWarn = {product} uintx CMSMaxAbortablePrecleanLoops = {product} intx CMSMaxAbortablePrecleanTime = {product} uintx CMSOldPLABMax = 1024 {product} uintx CMSOldPLABMin = 16 {product} uintx CMSOldPLABNumRefills = {product} uintx CMSOldPLABReactivityFactor = 2bool CMSOldPLABResizeQuicker = {product} uintx CMSOldPLABToleranceFactor = bool CMSPLABRecordAlways = {product} uintx CMSParPromoteBlocksToClaim = bool CMSParallelInitialMarkEnabled = bool CMSParallelRemarkEnabled = bool CMSParallelSurvivorRemarkEnabled = {product} uintx CMSPrecleanDenominator = {product} uintx CMSPrecleanIter = {product} uintx CMSPrecleanNumerator = bool CMSPrecleanRefLists1 = bool CMSPrecleanRefLists2 = bool CMSPrecleanSurvivors1 = bool CMSPrecleanSurvivors2 = {product} uintx CMSPrecleanThreshold = 1000bool CMSPrecleaningEnabled = bool CMSPrintChunksInDump = bool CMSPrintEdenSurvivorChunks = bool CMSPrintObjectsInDump = {product} uintx CMSRemarkVerifyVariant = bool CMSReplenishIntermediate = {product} uintx CMSRescanMultiple = {product} uintx CMSSamplingGrain = 16384bool CMSScavengeBeforeRemark = {product} uintx CMSScheduleRemarkEdenPenetration = {product} uintx CMSScheduleRemarkEdenSizeThreshold = 2097152 {product} uintx CMSScheduleRemarkSamplingRatio = 5 {product} double CMSSmallCoalSurplusPercent = 1.050000double CMSSmallSplitSurplusPercent = 1.100000bool CMSSplitIndexedFreeListBlocks = {product} intx CMSTriggerInterval = - {manageable} uintx CMSTriggerRatio = 80 {product} intx CMSWaitDuration = 2000 {manageable} uintx CMSWorkQueueDrainThreshold = bool CMSYield = {product} uintx CMSYieldSleepCount = {product} uintx CMSYoungGenPerWorker = 67108864 {pd product} uintx CMS_FLSPadding = {product} uintx CMS_FLSWeight = 75 {product} uintx CMS_SweepPadding = {product} uintx CMS_SweepTimerThresholdMillis = {product} uintx CMS_SweepWeight = bool CheckEndorsedAndExtDirs = bool CheckJNICalls = bool ClassUnloading = bool ClassUnloadingWithConcurrentMark = {product} intx ClearFPUAtPark = bool ClipInlining = {product} uintx CodeCacheExpansionSize = 65536 {pd product} uintx CodeCacheMinimumFreeSpace = 512000 {product} bool CollectGen0First = bool CompactFields = {product} intx CompilationPolicyChoice = {product} ccstrlist CompileCommand = {product} ccstr CompileCommandFile = {product} ccstrlist CompileOnly = {product} intx CompileThreshold = 10000 {pd product} bool CompilerThreadHintNoPreempt = {product} intx CompilerThreadPriority = - {product} intx CompilerThreadStackSize = {pd product} uintx CompressedClassSpaceSize = 1073741824 {product} uintx ConcGCThreads = {product} intx ConditionalMoveLimit = {C2 pd product} intx ContendedPaddingWidth = {product} bool ConvertSleepToYield = {pd product} bool ConvertYieldToSleep = bool CrashOnOutOfMemoryError = bool CreateMinidumpOnCrash = bool CriticalJNINatives = bool DTraceAllocProbes = bool DTraceMethodProbes = bool DTraceMonitorProbes = bool Debugging = {product} uintx DefaultMaxRAMFraction = {product} intx DefaultThreadPriority = - {product} intx DeferPollingPageLoopCount = - {product} intx DeferThrSuspendLoopCount = bool DeoptimizeRandom = bool DisableAttachMechanism = bool DisableExplicitGC = bool DisplayVMOutputToStderr = bool DisplayVMOutputToStdout = bool DoEscapeAnalysis = bool DontCompileHugeMethods = bool DontYieldALot = {pd product} ccstr DumpLoadedClassList = {product} bool DumpReplayDataOnError = bool DumpSharedSpaces = bool EagerXrunInit = {product} intx EliminateAllocationArraySizeLimit = bool EliminateAllocations = bool EliminateAutoBox = bool EliminateLocks = bool EliminateNestedLocks = {C2 product} intx EmitSync = bool EnableContended = bool EnableResourceManagementTLABCache = bool EnableSharedLookupCache = bool EnableTracing = {product} uintx ErgoHeapSizeLimit = {product} ccstr ErrorFile = {product} ccstr ErrorReportServer = {product} double EscapeAnalysisTimeout = 20.000000 {C2 product} bool EstimateArgEscape = bool ExitOnOutOfMemoryError = bool ExplicitGCInvokesConcurrent = bool ExplicitGCInvokesConcurrentAndUnloadsClasses = bool ExtendedDTraceProbes = {product} ccstr ExtraSharedClassListFile =bool FLSAlwaysCoalesceLarge = {product} uintx FLSCoalescePolicy = double FLSLargestBlockCoalesceProximity = 0.990000bool FailOverToOldVerifier = bool FastTLABRefill = {product} intx FenceInstruction = {ARCH product} intx FieldsAllocationStyle = bool FilterSpurIoUsWakeups = {product} ccstr FlightRecorderOptions =bool ForceNUMA = bool ForceTimeHighResolution = {product} intx FreqInlineSize = 325 {pd product} double G1ConcMarkStepDurationMillis = 10.000000 {product} uintx G1ConcRSHotCardLimit = {product} uintx G1ConcRSLogCacheSize = {product} intx G1ConcRefinementGreenZone = {product} intx G1ConcRefinementRedZone = {product} intx G1ConcRefinementServiceIntervalMillis = 300 {product} uintx G1ConcRefinementThreads = {product} intx G1ConcRefinementThresholdStep = {product} intx G1ConcRefinementYellowZone = {product} uintx G1ConfidencePercent = {product} uintx G1HeapRegionSize = {product} uintx G1HeapWastePercent = {product} uintx G1MixedGCCountTarget = 8 {product} intx G1RSetRegionEntries = {product} uintx G1RSetScanBlockSize = {product} intx G1RSetSparseRegionEntries = {product} intx G1RSetUpdatingPauseTimePercent = {product} intx G1RefProcDrainInterval = {product} uintx G1ReservePercent = {product} uintx G1SATBBufferEnqueueingThresholdPercent = 60 {product} intx G1SATBBufferSize = {product} intx G1UpdateBufferSize = 256bool G1UseAdaptiveConcRefinement = {product} uintx GCDrainStackTargetSize = {product} uintx GCHeapFreeLimit = {product} uintx GCLockerEdenExpansionPercent = bool GCLockerInvokesConcurrent = {product} uintx GCLogFileSize = 8192 {product} uintx GCPauseIntervalMillis = {product} uintx GCTaskTimeStampEntries = 200 {product} uintx GCTimeLimit = {product} uintx GCTimeRatio = 99 {product} uintx HeapBaseMinAddress = 2147483648 {pd product} bool HeapDumpAfterFullGC = {manageable} bool HeapDumpBeforeFullGC = bool HeapDumpOnOutOfMemoryError = {manageable} ccstr HeapDumpPath = {manageable} uintx HeapFirstMaximumCompactionCount = {product} uintx HeapMaximumCompactionInterval = {product} uintx HeapSizePerGCThread = 87241520bool IgnoreEmptyClassPaths = bool IgnoreUnrecognizedVMOptions = {product} uintx IncreaseFirstTierCompileThresholdAt = bool IncrementalInline = {C2 product} uintx InitialBootClassLoaderMetaspaceSize = 4194304 {product} uintx InitialCodeCacheSize = 2555904 {pd product} uintx InitialHeapSize := 132120576 {product} uintx InitialRAMFraction = double InitialRAMPercentage = 1.562500 {product} uintx InitialSurvivorRatio = {product} uintx InitialTenuringThreshold = 7 {product} uintx InitiatingHeapOccupancyPercent = 45bool Inline = {product} ccstr InlineDataFile = {product} intx InlineSmallCode = bool InlineSynchronizedMethods = bool InsertMemBarAfterArraycopy = {C2 product} intx InteriorEntryAlignment = {C2 pd product} intx InterpreterProfilePercentage = 33bool JNIDetachReleasesMonitors = bool JavaMonitorsInStackTrace = {product} intx JavaPriority10_To_OSPriority = - {product} intx JavaPriority1_To_OSPriority = - {product} intx JavaPriority2_To_OSPriority = - {product} intx JavaPriority3_To_OSPriority = - {product} intx JavaPriority4_To_OSPriority = - {product} intx JavaPriority5_To_OSPriority = - {product} intx JavaPriority6_To_OSPriority = - {product} intx JavaPriority7_To_OSPriority = - {product} intx JavaPriority8_To_OSPriority = - {product} intx JavaPriority9_To_OSPriority = -bool LIRFillDelaySlots = {C1 pd product} uintx LargePageHeapSizeThreshold = 134217728 {product} uintx LargePageSizeInBytes = bool LazyBootClassLoader = {product} intx LiveNodeCountInliningCutoff = 40000bool LogCommercialFeatures = {product} intx LoopMaxUnroll = {C2 product} intx LoopOptsCount = 43 {C2 product} intx LoopUnrollLimit = {C2 pd product} intx LoopUnrollMin = bool LoopUnswitching = bool ManagementServer = {product} uintx MarkStackSize = {product} uintx MarkStackSizeMax = 536870912 {product} uintx MarkSweepAlwaysCompactCount = {product} uintx MarkSweepDeadRatio = {product} intx MaxBCEAEstimateLevel = {product} intx MaxBCEAEstimateSize = 150 {product} uintx MaxDirectMemorySize = bool MaxFDLimit = {product} uintx MaxGCMinorPauseMillis = 4294967295 {product} uintx MaxGCPauseMillis = {product} uintx MaxHeapFreeRatio = {manageable} uintx MaxHeapSize := 2111832064 {product} intx MaxInlineLevel = 9 {product} intx MaxInlineSize = 35 {product} intx MaxJNILocalCapacity = {product} intx MaxJavaStackTraceDepth = {product} intx MaxJumpTableSize = 65000 {C2 product} intx MaxJumpTableSparseness = {C2 product} intx MaxLabelRootDepth = 1100 {C2 product} intx MaxLoopPad = 11 {C2 product} uintx MaxMetaspaceExpansion = 5451776 {product} uintx MaxMetaspaceFreeRatio = 70 {product} uintx MaxMetaspaceSize = 4294901760 {product} uintx MaxNewSize := 703594496 {product} intx MaxNodeLimit = 75000 {C2 product} uint64_t MaxRAM = {pd product} uintx MaxRAMFraction = double MaxRAMPercentage = 25.000000 {product} intx MaxRecursiveInlineLevel = {product} uintx MaxTenuringThreshold = 15 {product} intx MaxTrivialSize = 6 {product} intx MaxVectorSize = {C2 product} uintx MetaspaceSize = 21807104 {pd product} bool MethodFlushing = {product} uintx MinHeapDeltaBytes := 524288 {product} uintx MinHeapFreeRatio = {manageable} intx MinInliningThreshold = 250 {product} intx MinJumpTableSize = {C2 pd product} uintx MinMetaspaceExpansion = 339968 {product} uintx MinMetaspaceFreeRatio = {product} uintx MinRAMFraction = double MinRAMPercentage = 50.000000 {product} uintx MinSurvivorRatio = {product} uintx MinTLABSize = 2048 {product} intx MonitorBound = bool MonitorInUseLists = {product} intx MultiArrayExpandLimit = bool MustCallLoadClassInternal = {product} uintx NUMAChunkResizeWeight = {product} uintx NUMAInterleaveGranularity = {product} uintx NUMAPageScanRate = {product} uintx NUMASpaceResizeRate = {product} bool NUMAStats = {product} ccstr NativeMemoryTracking = off {product} bool NeedsDeoptSuspend = bool NeverActAsServerClassMachine = bool NeverTenure = {product} uintx NewRatio = {product} uintx NewSize := 44040192 {product} uintx NewSizeThreadIncrease = 5320 {pd product} intx NmethodSweepActivity = {product} intx NmethodSweepCheckInterval = {product} intx NmethodSweepFraction = {product} intx NodeLimitFudgeFactor = {C2 product} uintx NumberOfGCLogFiles = {product} intx NumberOfLoopInstrToAlign = {C2 product} intx ObjectAlignmentInBytes = {lp64_product} uintx OldPLABSize = {product} uintx OldPLABWeight = {product} uintx OldSize := 88080384bool OmitStackTraceInFastThrow = {product} ccstrlist OnError = {product} ccstrlist OnOutOfMemoryError = {product} intx OnStackReplacePercentage = 140 {pd product} bool OptimizeFill = bool OptimizePtrCompare = bool OptimizeStringConcat = bool OptoBundling = {C2 pd product} intx OptoLoopAlignment = {pd product} bool OptoScheduling = {C2 pd product} uintx PLABWeight = bool PSChunkLargeArrays = {product} intx ParGCArrayScanChunk = {product} uintx ParGCDesiredObjsFromOverflowList = bool ParGCTrimOverflow = bool ParGCUseLocalOverflow = {product} uintx ParallelGCBufferWastePct = {product} uintx ParallelGCThreads = bool ParallelGCVerbose = {product} uintx ParallelOldDeadWoodLimiterMean = {product} uintx ParallelOldDeadWoodLimiterStdDev = bool ParallelRefProcBalancingEnabled = bool ParallelRefProcEnabled = bool PartialPeelAtUnsignedTests = bool PartialPeelLoop = {C2 product} intx PartialPeelNewPhiDelta = {C2 product} uintx PausePadding = {product} intx PerBytecodeRecompilationCutoff = {product} intx PerBytecodeTrapLimit = {product} intx PerMethodRecompilationCutoff = 400 {product} intx PerMethodTrapLimit = bool PerfAllowAtExitRegistration = bool PerfBypassFileSystemCheck = {product} intx PerfDataMemorySize = 32768 {product} intx PerfDataSamplingInterval = {product} ccstr PerfDataSaveFile =bool PerfDataSaveToFile = bool PerfDisableSharedMem = {product} intx PerfMaxStringConstLength = {product} intx PreInflateSpin = bool PreferInterpreterNativeStubs = {pd product} intx PrefetchCopyIntervalInBytes = 576 {product} intx PrefetchFieldsAhead = {product} intx PrefetchScanIntervalInBytes = bool PreserveAllAnnotations = bool PreserveFramePointer = {pd product} uintx PretenureSizeThreshold = bool PrintAdaptiveSizePolicy = bool PrintCMSInitiationStatistics = {product} intx PrintCMSStatistics = bool PrintClassHistogram = bool PrintClassHistogramAfterFullGC = bool PrintClassHistogramBeforeFullGC = bool PrintCodeCache = bool PrintCodeCacheOnCompilation = bool PrintCommandLineFlags = bool PrintCompilation = bool PrintConcurrentLocks = {manageable} intx PrintFLSCensus = {product} intx PrintFLSStatistics = bool PrintFlagsFinal := bool PrintFlagsInitial = bool PrintGC = bool PrintGCApplicationConcurrentTime = bool PrintGCApplicationStoppedTime = bool PrintGCCause = bool PrintGCDateStamps = bool PrintGCDetails = bool PrintGCID = bool PrintGCTaskTimeStamps = bool PrintGCTimeStamps = bool PrintHeapAtGC = {product rw} bool PrintHeapAtGCExtended = bool PrintHeapAtSIGBREAK = bool PrintJNIGCStalls = bool PrintJNIResolving = bool PrintOldPLAB = bool PrintOopAddress = bool PrintPLAB = bool PrintParallelOldGCPhaseTimes = bool PrintPromotionFailure = bool PrintReferenceGC = bool PrintSafepointStatistics = {product} intx PrintSafepointStatisticsCount = {product} intx PrintSafepointStatisticsTimeout = -bool PrintSharedArchiveAndExit = bool PrintSharedDictionary = bool PrintSharedSpaces = bool PrintStringDeduplicationStatistics = bool PrintStringTableStatistics = bool PrintTLAB = bool PrintTenuringDistribution = bool PrintTieredEvents = bool PrintVMOptions = bool PrintVMQWaitTime = bool PrintWarnings = {product} uintx ProcessDistributionStride = bool ProfileInterpreter = bool ProfileIntervals = {product} intx ProfileIntervalsTicks = {product} intx ProfileMaturityPercentage = bool ProfileVM = bool ProfilerPrintByteCodeStatistics = bool ProfilerRecordPC = {product} uintx PromotedPadding = {product} uintx QueuedAllocationWarningCount = {product} uintx RTMRetryCount = {ARCH product} bool RangeCheckElimination = {product} intx ReadPrefetchInstr = bool ReassociateInvariants = bool ReduceBulkZeroing = bool ReduceFieldZeroing = bool ReduceInitialCardMarks = bool ReduceSignalUsage = {product} intx RefDiscoveryPolicy = bool ReflectionWrapResolutionErrors = bool RegisterFinalizersAtInit = bool RelaxAccessControlCheck = {product} ccstr ReplayDataFile =bool RequireSharedSpaces = {product} uintx ReservedCodeCacheSize = 251658240 {pd product} bool ResizeOldPLAB = bool ResizePLAB = bool ResizeTLAB = bool RestoreMXCSROnJNICalls = bool RestrictContended = bool RewriteBytecodes = bool RewriteFrequentPairs = {pd product} intx SafepointPollOffset = {C1 pd product} intx SafepointSpinBeforeYield = bool SafepointTimeout = {product} intx SafepointTimeoutDelay = bool ScavengeBeforeFullGC = {product} intx SelfDestructTimer = {product} uintx SharedBaseAddress = {product} ccstr SharedClassListFile = {product} uintx SharedMiscCodeSize = 122880 {product} uintx SharedMiscDataSize = {product} uintx SharedReadOnlySize = 16777216 {product} uintx SharedReadWriteSize = bool ShowMessageBoxOnError = {product} intx SoftRefLRUPolicyMSPerMB = bool SpecialEncodeISOArray = bool SplitIfBlocks = {C2 product} intx StackRedPages = {pd product} intx StackShadowPages = {pd product} bool StackTraceInThrowable = {product} intx StackYellowPages = bool StartAttachListener = {product} intx StarvationMonitorInterval = bool StressLdcRewrite = {product} uintx StringDeduplicationAgeThreshold = {product} uintx StringTableSize = 60013bool SuppressFatalErrorMessage = {product} uintx SurvivorPadding = {product} uintx SurvivorRatio = {product} intx SuspendRetryCount = {product} intx SuspendRetryDelay = {product} intx SyncFlags = {product} ccstr SyncKnobs = {product} intx SyncVerbose = {product} uintx TLABAllocationWeight = {product} uintx TLABRefillWasteFraction = {product} uintx TLABSize = bool TLABStats = {product} uintx TLABWasteIncrement = {product} uintx TLABWasteTargetPercent = {product} uintx TargetPLABWastePct = {product} uintx TargetSurvivorRatio = {product} uintx TenuredGenerationSizeIncrement = {product} uintx TenuredGenerationSizeSupplement = {product} uintx TenuredGenerationSizeSupplementDecay = {product} intx ThreadPriorityPolicy = bool ThreadPriorityVerbose = {product} uintx ThreadSafetyMargin = 52428800 {product} intx ThreadStackSize = {pd product} uintx ThresholdTolerance = {product} intx Tier0BackedgeNotifyFreqLog = {product} intx Tier0InvokeNotifyFreqLog = {product} intx Tier0ProfilingStartPercentage = {product} intx Tier23InlineeNotifyFreqLog = {product} intx Tier2BackEdgeThreshold = {product} intx Tier2BackedgeNotifyFreqLog = 14 {product} intx Tier2CompileThreshold = {product} intx Tier2InvokeNotifyFreqLog = {product} intx Tier3BackEdgeThreshold = 60000 {product} intx Tier3BackedgeNotifyFreqLog = 13 {product} intx Tier3CompileThreshold = {product} intx Tier3DelayOff = {product} intx Tier3DelayOn = {product} intx Tier3InvocationThreshold = {product} intx Tier3InvokeNotifyFreqLog = {product} intx Tier3LoadFeedback = {product} intx Tier3MinInvocationThreshold = {product} intx Tier4BackEdgeThreshold = {product} intx Tier4CompileThreshold = 15000 {product} intx Tier4InvocationThreshold = {product} intx Tier4LoadFeedback = {product} intx Tier4MinInvocationThreshold = 600bool TieredCompilation = {pd product} intx TieredCompileTaskTimeout = {product} intx TieredRateUpdateMaxTime = {product} intx TieredRateUpdateMinTime = {product} intx TieredStopAtLevel = bool TimeLinearScan = {C1 product} bool TraceBiasedLocking = bool TraceClassLoading = bool TraceClassLoadingPreorder = bool TraceClassPaths = bool TraceClassResolution = bool TraceClassUnloading = bool TraceDynamicGCThreads = bool TraceGen0Time = bool TraceGen1Time = {product} ccstr TraceJVMTI =bool TraceLoaderConstraints = bool TraceMetadataHumongousAllocation = bool TraceMonitorInflation = bool TraceParallelOldGCTasks = {product} intx TraceRedefineClasses = bool TraceSafepointCleanupTime = bool TraceSharedLookupCache = bool TraceSuspendWaitFailures = {product} intx TrackedInitializationLimit = bool TransmitErrorReport = bool TrapBasedNullChecks = bool TrapBasedRangeChecks = {C2 pd product} intx TypeProfileArgsLimit = {product} uintx TypeProfileLevel = 111 {pd product} intx TypeProfileMajorReceiverPercent = 90 {C2 product} intx TypeProfileParmsLimit = {product} intx TypeProfileWidth = {product} intx UnguardOnExecutionViolation = bool UnlinkSymbolsALot = bool Use486InstrsOnly = {ARCH product} bool UseAES = bool UseAESIntrinsics = {product} intx UseAVX = bool UseAdaptiveGCBoundary = bool UseAdaptiveGenerationSizePolicyAtMajorCollection = bool UseAdaptiveGenerationSizePolicyAtMinorCollection = bool UseAdaptiveNUMAChunkSizing = bool UseAdaptiveSizeDecayMajorGCCost = bool UseAdaptiveSizePolicy = bool UseAdaptiveSizePolicyFootprintGoal = bool UseAdaptiveSizePolicyWithSystemGC = bool UseAddressNop = {ARCH product} bool UseAltSigs = bool UseAutoGCSelectPolicy = bool UseBMI1Instructions = bool UseBMI2Instructions = bool UseBiasedLocking = bool UseBimorphicInlining = bool UseBoundThreads = bool UseCLMUL = bool UseCMSBestFit = bool UseCMSCollectionPassing = bool UseCMSCompactAtFullCollection = bool UseCMSInitiatingOccupancyOnly = bool UseCRC32Intrinsics = bool UseCodeCacheFlushing = bool UseCompiler = bool UseCompilerSafepoints = bool UseCompressedClassPointers := {lp64_product} bool UseCompressedOops := bool UseConcMarkSweepGC = bool UseCondCardMark = bool UseCountLeadingZerosInstruction = bool UseCountTrailingZerosInstruction = bool UseCountedLoopSafepoints = bool UseCounterDecay = bool UseDivMod = bool UseDynamicNumberOfGCThreads = bool UseFPUForSpilling = bool UseFastAccessorMethods = bool UseFastEmptyMethods = bool UseFastJNIAccessors = bool UseFastStosb = bool UseG1GC = bool UseGCLogFileRotation = bool UseGCOverheadLimit = bool UseGCTaskAffinity = bool UseHeavyMonitors = bool UseInlineCaches = bool UseInterpreter = bool UseJumpTables = bool UseLWPSynchronization = bool UseLargePages = bool UseLargePagesInMetaspace = bool UseLargePagesIndividualAllocation := bool UseLockedTracing = bool UseLoopCounter = bool UseLoopInvariantCodeMotion = bool UseLoopPredicate = bool UseMathExactIntrinsics = bool UseMaximumCompactionOnSystemGC = bool UseMembar = bool UseMontgomeryMultiplyIntrinsic = bool UseMontgomerySquareIntrinsic = bool UseMulAddIntrinsic = bool UseMultiplyToLenIntrinsic = bool UseNUMA = bool UseNUMAInterleaving = bool UseNewLongLShift = bool USEOSErrorReporting = bool USEOldInlining = bool USEOnStackReplacement = bool USEOnlyInlinedBimorphic = bool USEOptoBiasInlining = bool UsePSAdaptiveSurvivorSizePolicy = bool UseParNewGC = bool UseParallelGC := bool UseParallelOldGC = bool UsePerfData = bool UsePopCountInstruction = bool UseRDPCForConstantTableBase = bool UseRTMDeopt = bool UseRTMLocking = bool UseSHA = bool UseSHA1Intrinsics = bool UseSHA256Intrinsics = bool UseSHA512Intrinsics = {product} intx UseSSE = bool UseSSE42Intrinsics = bool UseSerialGC = bool UseSharedSpaces = bool UseSignalChaining = bool UseSquareToLenIntrinsic = bool UseStoreImmI16 = bool UseStringDeduplication = bool UseSuperWord = bool UseTLAB = bool UseThreadPriorities = bool UseTypeProfile = bool UseTypeSpeculation = bool UseUTCFileTimestamp = bool UseUnalignedLoadStores = bool UseVMInterruptibleIO = bool UseXMMForArrayCopy = bool UseXmmI2D = bool UseXmmI2F = bool UseXmmLoadAndClearUpper = bool UseXmmRegToRegMoveAll = bool VMThreadHintNoPreempt = {product} intx VMThreadPriority = - {product} intx VMThreadStackSize = {pd product} intx ValueMapInitialSize = {C1 product} intx ValueMapMaxLoopSize = {C1 product} intx ValueSearchLimit = bool VerifyMergedCPBytecodes = bool VerifySharedSpaces = {product} intx WorkAroundNPTLTimedWaitHang = {product} uintx YoungGenerationSizeIncrement = {product} uintx YoungGenerationSizeSupplement = {product} uintx YoungGenerationSizeSupplementDecay = {product} uintx YoungPLABSize = 4096bool ZeroTLAB = {product} intx hashCode = {product} 用法: java [- 使用指定的图像显示启动屏幕 有关详细信息,请参阅 http://www.oracle.com/technetwork/java/javase/documentation/index.html。
上面的参数中有等号(=和:=),分别代表的是默认值,和被修改的值啦
好了,基础够基础了吧,以后这些加(+)减(-)等于(=或:=)看的懂了
二、基础工具
$JAVA_HOME/bin目录下真的有很多的工具,这里不截图啦,直接上用的比较的工具好啦
2.1、jps
这个工具真的很实用,而且很简单呢,功能linux的ps命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行主类(Main Class,main()函数所在的类)名称以及这些进程的本地虚拟机唯一ID(LVMID,Local Virtual Machine Identifier)
[root@hadoop apache-tomcat-8.5.57]# jps -help usage: jps [-help] jps [-q] [-mlvV] [<hostid>] Definitions: <hostid>: <hostname>[:<port>]
2.2、jstat
jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或者远程[插图]虚拟机进程中的类加载、内存、垃圾收集、即时编译等运行时数据。
[root@hadoop apache-tomcat-57]# jstat -help Usage: jstat -help|-options jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]] Definitions: <option> An option reported by the -options option <vmid> Virtual Machine Identifier. A vmid takes the following form: <lvmid>[@<hostname>[:<port>]] Where <lvmid> is the local vm identifier for the target Java virtual machine,typically a process id; <hostname> is the name of the host running the target Java virtual machine; and <port> is the port number the rmiregistry on the target host. See the jvmstat documentation for a more complete description of the Virtual Machine Identifier. <lines> Number of samples between header lines. <interval> Sampling interval. The following forms are allowed: <n>[ms"|s] Where <n> is an integer and the suffix specifies the units as milliseconds(") or seconds("). The default units are . <count> Number of samples to take before terminating. -J<flag> Pass <flag> directly to the runtime system.
jstat -options #查看下支持的选项,如下
[root@hadoop apache-tomcat-options -class #类加载器 -compiler #JIT -gc #GC堆状态 -gccapacity #各个区的大小 -gccause #最近一次GC的统计和原因 -gcMetacapacity #元空间大小 -gcnew #新区统计 -gcnewcapacity #新区大小 -gcold #老区统计 -gcoldcapacity #老区大小 -gcutil #GC汇总统计 -printcompilation #HotSpot编译统计
Options #选项,我们一般使用 -gcutil 查看gc情况
vmid #VM的进程号,即当前运行的java进程号,可以理解我java程序的pid
interval #间隔时间,单位为秒或者毫秒
count #打印次数,如果缺省则打印无数次
对于命令格式中的VMID与LVMID需要特别说明一下:如果是本地虚拟机进程,VMID与LVMID是一致的;如果是远程虚拟机进程,那VMID的格式应当是
[protocol:][]lvmid[@hostname][:port]/servername]
开始操作:
jstat -class 1645 #类加载的统计
jstat -gc 1645 1 3 #统计3次,每隔一秒,对gc进行统计
S0C:第一个Survivor区的大小(KB)
S1C:第二个Survivor区的大小(KB)
S0U:第一个Survivor区的使用大小(KB)
S1U:第二个Survivor区的使用大小(KB)
EC:Eden区的大小(KB)
EU:Eden区的使用大小(KB)
OC:Old区大小(KB)
OU:Old使用大小(KB)
MC:方法区大小(KB),java8方法区的实现是元数据空间,java7的方法区实现是永久代
MU:方法区使用大小(KB)
CCSC:压缩类空间大小(KB)
CCSU:压缩类空间使用大小(KB)
YGC:年轻代垃圾回收次数
YGCT:年轻代垃圾回收消耗时间
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间
jstat -compiler 1645 #对编译进行统计
2.3、jinfo
jinfo(Configuration Info for Java)的作用是实时查看和调整虚拟机各项参数
[root@hadoop ~]# jinfo -help Usage: jinfo [option] <pid> (to connect to running process) jinfo [option] <executable <core> (to connect to a core file) jinfo [option] [server_id@]<remote server IP or (to connect to remote debug server) where <option> is one of: -flag <name> to print the value of the named VM flag #打印单个jvm的参数 -flag [+|-]<name> to enable or disable the named VM flag #运行期修改一部分运行期可写的虚拟机参数值 -flag <name>=<value> to set the named VM flag to the given value #运行期修改一部分运行期可写的虚拟机参数值 -flags to print VM flags #打印该进程的相关的参数 -sysprops to print Java system properties #把虚拟机进程的System.getProperties()的内容打印出来 <no option> to print both of the above -h | -help to print this help message
jinfo -flags 1645
jinfo -flag InitialHeapSize 1645
jinfo -flag InitialHeapSize 1645
[root@hadoop ~]# jinfo -sysprops 1645 Attaching to process ID 1645,please wait... Debugger attached successfully. Server compiler detected. JVM version is 25.181-b13 java.runtime.name = Java(TM) SE Runtime Environment java.vm.version = b13 sun.boot.library.path = /home/hadoop/jdk/jre/lib/amd64 java.protocol.handler.pkgs = org.apache.catalina.webresources shared.loader = java.vendor.url = http:java.oracle.com/ java.vm.vendor = Oracle Corporation path.separator = : file.encoding.pkg = sun.io java.vm.name = Java HotSpot(TM) 64-Bit Server VM java.util.logging.config.file = /root/apache-tomcat-57/conf/logging.properties tomcat.util.buf.StringCache.byte.enabled = sun.os.patch.level = unknown sun.java.launcher = SUN_STANDARD user.country = US tomcat.util.scan.StandardJarScanFilter.jarsToScan = log4j-taglib*.jar,log4j-web*.jar,log4javascript*.jar,slf4j-taglib*.jar user.dir = /root/apache-tomcat-57 java.vm.specification.name = Java Virtual Machine Specification java.runtime.version = 1.8.0_181-b13 java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment os.arch = amd64 java.endorsed.dirs = /home/hadoop/jdk/jre/lib/endorsed line.separator = java.io.tmpdir = /root/apache-tomcat-57/temp java.vm.specification.vendor = Oracle Corporation java.util.logging.manager = org.apache.juli.ClassLoaderLogManager java.naming.factory.url.pkgs = org.apache.naming os.name = Linux org.apache.catalina.security.SecurityListener.UMASK = 0027 sun.jnu.encoding = UTF- ignore.endorsed.dirs = java.library.path = /usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib java.class.version = 52.0 java.specification.name = Java Platform API Specification sun.management.compiler = HotSpot Bit Tiered Compilers os.version = 2.6.32-754.24..el6.x86_64 java.util.concurrent.ForkJoinPool.common.threadFactory = org.apache.catalina.startup.SafeForkJoinWorkerThreadFactory user.home = /root user.timezone = Asia/Chongqing catalina.useNaming = java.awt.printerjob = sun.print.PSPrinterJob file.encoding = UTF- java.specification.version = 1.8 tomcat.util.scan.StandardJarScanFilter.jarsToSkip = annotations-api.jar,ant-junit*.jar,ant-launcher.jar,ant.jar,asm-*.jar,aspectj*.jar,bootstrap.jar,catalina-ant.jar,catalina-ha.jar,catalina-jmx-remote.jar,catalina-storeconfig.jar,catalina-tribes.jar,catalina-ws.jar,catalina.jar,cglib-*.jar,cobertura-*.jar,commons-beanutils*.jar,commons-codec*.jar,commons-collections*.jar,commons-daemon.jar,commons-dbcp*.jar,commons-digester*.jar,commons-fileupload*.jar,commons-httpclient*.jar,commons-io*.jar,commons-lang*.jar,commons-logging*.jar,commons-math*.jar,commons-pool*.jar,dom4j-*.jar,easymock-*.jar,ecj-*.jar,el-api.jar,geronimo-spec-jaxrpc*.jar,h2*.jar,hamcrest-*.jar,hibernate*.jar,httpclient*.jar,icu4j-*.jar,jasper-el.jar,jasper.jar,jaspic-api.jar,jaxb-*.jar,jaxen-*.jar,jdom-*.jar,jetty-*.jar,jmx-tools.jar,jmx.jar,jsp-api.jar,jstl.jar,jta*.jar,junit-*.jar,junit.jar,log4j*.jar,mail*.jar,objenesis-*.jar,oraclepki.jar,oro-*.jar,servlet-api-*.jar,servlet-api.jar,slf4j*.jar,taglibs-standard-spec-*.jar,tagsoup-*.jar,tomcat-api.jar,tomcat-coyote.jar,tomcat-dbcp.jar,tomcat-i18n-*.jar,tomcat-jdbc.jar,tomcat-jni.jar,tomcat-juli-adapters.jar,tomcat-juli.jar,tomcat-util-scan.jar,tomcat-util.jar,tomcat-websocket.jar,tools.jar,websocket-api.jar,wsdl4j*.jar,xercesImpl.jar,xml-apis.jar,xmlParserAPIs-*.jar,xmlParserAPIs.jar,xom-*.jar catalina.home = /root/apache-tomcat- user.name = root java.class.path = /root/apache-tomcat-57/bin/bootstrap.jar:/root/apache-tomcat-57/bin/tomcat-juli.jar java.naming.factory.initial = org.apache.naming.java.javaURLContextFactory package.definition = sun.,java.,org.apache.catalina.,org.apache.coyote.,org.apache.jasper.,org.apache.naming.,org.apache.tomcat. java.vm.specification.version = sun.arch.data.model = sun.java.command = org.apache.catalina.startup.Bootstrap start java.home = /home/hadoop/jdk/jre user.language = en java.specification.vendor = Oracle Corporation awt.toolkit = sun.awt.X11.XToolkit java.vm.info = mixed mode java.version = .0_181 java.ext.dirs = /home/hadoop/jdk/jre/lib/ext:/usr/java/packages/lib/ext sun.boot.class.path = /home/hadoop/jdk/jre/lib/resources.jar:/home/hadoop/jdk/jre/lib/rt.jar:/home/hadoop/jdk/jre/lib/sunrsasign.jar:/home/hadoop/jdk/jre/lib/jsse.jar:/home/hadoop/jdk/jre/lib/jce.jar:/home/hadoop/jdk/jre/lib/charsets.jar:/home/hadoop/jdk/jre/lib/jfr.jar:/home/hadoop/jdk/jre/classes server.loader = java.vendor = Oracle Corporation catalina.base = /root/apache-tomcat- jdk.tls.ephemeralDHKeySize = 2048 file.separator = / java.vendor.url.bug = http:bugreport.sun.com/bugreport/ common.loader = ${catalina.base}/lib",${catalina.base}/lib/*.jar${catalina.home}/lib${catalina.home}/lib/*.jar sun.io.unicode.encoding = UnicodeLittle sun.cpu.endian = little package.access =cpu.isalist =
2.4、jmap
jmap(Memory Map for Java)命令用于生成堆转储快照(一般称为heapdump或dump文件),还可以使用“暴力”方式:-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机在内存溢出异常出现之后自动生成堆转储快照文件
jmap的作用并不仅仅是为了获取堆转储快照,它还可以查询finalize执行队列、Java堆和方法区的详细信息,如空间使用率、当前用的是哪种收集器等
[root@hadoop ~]# jmap -help Usage: jmap [option] <pid> (to connect to running process) jmap [option] <executable <core>) jmap [option] [server_id@]<remote server IP or is one of: <none> to print same info as Solaris pmap -heap to print java heap summary #统计堆 -histo[:live] to print histogram of java object heap; if the live suboption is specified,only count live objects -clstats to print class loader statistics -finalizerinfo to print information on objects awaiting finalization -dump:<dump-options> to dump java heap in hprof binary format #dump出java堆的二进制文件 dump-options: live dump only live objects; if not specified,all objects the heap are dumped. format=b binary format file=<file> dump heap to < Example: jmap -dump:live,format=b,file=heap.bin <pid> -F force. Use with -dump:<dump-options> <pid> or -histo to force a heap dump or histogram when <pid> does not respond. The suboption is not supported this mode. -h | -help to print this help message -J<flag> to pass <flag> directly to the runtime system
-heap #打印jvm heap的情况,比如参数,分代,回收器等 -histo #打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。 -histo:live #同上,但是只答应存活对象的情况 -dump #生成堆转储快照,格式为-dump:[live,]format=b,1)">file=<filename>,其中自参数说明是否只dump出存活对象 -finalizerinfo #显示在F-Queue中等待的finalizer线程执行finalize方法的对象 -clstats #打印类的加载信息 -F #强制生成dump文件
jmap -heap 1645
jmap -histo 1645 | more #查看内存中的对象和数量
上图中的对象说明:
B byte C char D double F float I int J long Z boolean [ 数组,如[I表示int[] [L+类名 其他对象
jmap -dump:format=b,file=/root/dump.bin 1645 #将内存的使用情况dump到文件中
[root@hadoop bin]# jmap -dump:format=b,1)">file=/root/dump.bin Dumping heap to /root/dump.bin ... Heap dump file created
2.5、jhat
JDK提供jhat(JVM Heap Analysis Tool)命令与jmap搭配使用,来分析jmap生成的堆转储快照。jhat内置了一个微型的HTTP/Web服务器,生成堆转储快照的分析结果后,可以在浏览器中查看(实际情况使用的不多)
[root@hadoop ~]# jhat -help Usage: jhat [-stack <bool>] [-refs <bool>] [-port <port>] [-baseline <file>] [-debug <int>] [-version] [-h|-help] <file> -J<flag> Pass <flag> directly to the runtime system. For example,-J-mx512m to use a maximum heap size of 512MB -stack false: Turn off tracking object allocation call stack. -refs : Turn off tracking of references to objects -port <port>: Set the port for the HTTP server. Defaults to 7000 -exclude <file>: Specify a that lists data members that should be excluded from the reachableFrom query. -baseline <file>: Specify a baseline object dump. Objects both heap dumps with the same ID and same class will be marked as not being new. -debug <int>: Set debug level. : No debug output 1: Debug hprof parsing 2: Debug hprof parsing,no server -version Report version number -h|-help Print this help and exit <file> The to read For a dump that contains multiple heap dumps,you may specify which dump in the by appending #<number>" to the file name,i.e. foo.hprof#3. All boolean options default to true"
jhat -port 9999 dump.bin
登录自己的地址:http://192.168.88.137:9999/
如上的每一个结果都可以点进去去查看
2.6、jstack
jstack(Stack Trace for Java)命令用于生成虚拟机当前时刻的线程快照(一般称为threaddump或者javacore文件)。线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的目的通常是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间挂起等,都是导致线程长时间停顿的常见原因
[root@hadoop ~]# jstack -help Usage: jstack [-l] <pid> (to connect to running process) jstack -F [-m] [-l] <pid> (to connect to a hung process) jstack [-m] [-l] <executable> <core>) jstack [-m] [-l] [server_id@]<remote server IP or (to connect to a remote debug server) Options: -F to force a thread dump. Use when jstack <pid> does not respond (process is hung) -m to print both java and native frames (mixed mode) -l listing. Prints additional information about locks -h or -help to print this help message
jstack 1645 | more #查看该线程的快照信息
如上的状态信息可以参考:java多线程与并发(基础篇)
三、可视化工具
3.1、JConsole
JConsole(Java Monitoring and Management Console)是一款基于JMX(Java Manage-ment Extensions)的可视化监视、管理工具。它的主要功能是通过JMX的MBean(Managed Bean)对系统进行信息收集和参数动态调整
一、本地连接
可以看出来可以对内存,线程等进行监控。
二、远程监控
这里我们使用tomcat做实验,首先要修改catalina.sh文件,添加如下内容:参考https://blog.csdn.net/shamoshuizu/article/details/70598268
JAVA_OPTS=-Djava.rmi.server.hostname=192.168.88.137 -Dcom.sun.management.jmxremote.port=8099 -Dcom.sun.management.jmxremote.rmi.port=8099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
然后重启tomcat,接下来连接远程
这个工具使用起来并不难,只要自己要有jvm的基础啦,不然看不懂,展示出来了也是白干活。
3.2、VisualVM
VisualVM(All-in-One Java Troubleshooting Tool)是功能最强大的运行监视和故障处理程序之一,能够监控线程,内存情况,查看方法的cpu时间和内存中的对象,已被GC的对象,反向查看分配的堆栈,使用起来也很简单
双击jvisualvm.exe软件,打开该工具
同JConsole 一样可以本地和远程,直接打开本地进程
基本pid,jvm参数,主机等一览无余,还有监控页面包括cpu,堆,类,线程等监控,还可以执行垃圾回收,和dump线程呢
试试远程的,同JConsole 的设置方式对tomcate进行设置
其实工具是什么呢,就是为了方便获取信息嘛,能不能看懂,能不能还得看自己的水平够不够,能不能够发现问题,能不能解决问题了。
3.3、JMC
Java Mission Control:可持续在线的监控工具
JMC与虚拟机之间同样采取JMX协议进行通信,JMC一方面作为JMX控制台,显示来自虚拟机MBean提供的数据;另一方面作为JFR的分析工具,展示来自JFR的数据
用起来也很简单,双击jmc.exe打开工具,默认情况下会扫描出本地的进程,然后可以点击:文件->连接,来创建新的连接:
然后根据下图操作,遇到情况下一步,下一步就好,就有如下的图了:
该工具持续监控了很多东西:
一般信息:关于虚拟机、操作系统和记录的一般信息。
内存:关于内存管理和垃圾收集的信息。
代码:关于方法、异常错误、编译和类加载的信息。
线程:关于应用程序中线程和锁的信息。
I/O:关于文件和套接字输入、输出的信息。
系统:关于正在运行Java虚拟机的系统、进程和环境变量的信息。
事件:关于记录中的事件类型的信息,可以根据线程或堆栈跟踪,按照日志或图形的格式查看。
四、其他工具-MAT
MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象
官网:https://www.eclipse.org/mat/
下载地址:https://www.eclipse.org/mat/downloads.php
下载后,解压,双击MemoryAnalyzer.exe打开程序,然后点击文件->打开dump出的文件,就出现了如下的图
下图可以看到基本的内存可能出问题的地方:
这篇文章纯粹是一个工具的使用简单说明,没有太多的技术含量,但是我觉得工欲善其事必先利其器,所以用好一些工具对自己能力的提升,效率的提升有莫大的帮助,工具这些东西只有用到的时候才会查找,但是也要大概了解下怎么用吧,比如什么工具可以用来干嘛呢,我写这个的目的就是用来以后自己当做工具文档来查看下,技术用时方恨少,所以平时多积累些也不是一件坏事呢,好吧,好好努力撒。
原文链接:/jvm/997847.html