Tomcat修改TOMCAT_HOME/bin/catalina.bat,在[echo Using CATALINA_BASE: "%CATALINA_BASE%"] 上面加入,比如:
set JAVA_OPTS= -server -Xms1536m -Xmx1536m或者JAVA_OPTS="-server -Xms1536m -Xmx1536m",
服务器模式参数-server不加也可以 ,就变成
set JAVA_OPTS= -Xms1536m -Xmx1536m或者JAVA_OPTS=" -Xms1536m -Xmx1536m",
参数: AdaptivePermSizeWeight
用法:
参数: AdaptiveSizeDecrementScaleFactor
用法:
参数: AdaptiveSizeMajorGCDecayTimeScale
用法:
参数: AdaptiveSizePausePolicy
用法:
参数: AdaptiveSizePolicyCollectionCostMargin
用法:
参数: AdaptiveSizePolicyInitializingSteps
用法:
参数: AdaptiveSizePolicyOutputInterval
用法:
参数: AdaptiveSizePolicyWeight
用法:
参数: AdaptiveSizeThroughPutPolicy
用法:
参数: AdaptiveTimeWeight
用法:
参数: AdjustConcurrency
用法:
参数: AggressiveOpts
用法:
参数: AliasLevel
用法:
参数: AlignVector
用法:
参数: AllocateInstancePrefetchLines
用法:
参数: AllocatePrefetchDistance
用法:
参数: AllocatePrefetchInstr
用法:
参数: AllocatePrefetchLines
用法:
参数: AllocatePrefetchStepSize
用法:
参数: AllocatePrefetchStyle
用法:
参数: AllowJNIEnvProxy
用法:
参数: AllowNonVirtualCalls
用法:
参数: AllowParallelDefineClass
用法:
参数: AllowUserSignalHandlers
用法:
参数: AlwaysActAsServerClassMachine
用法:
参数: AlwaysCompileLoopMethods
用法:
参数: AlwaysLockClassLoader
用法:
参数: AlwaysPreTouch
用法: -XX:+AlwaysPreTouch
参数: AlwaysRestoreFPU
用法:
参数: AlwaysTenure
用法:
参数: AssertOnSuspendWaitFailure
用法:
参数: AssumeMP
用法:
参数: Atomics
用法:
参数: AutoBoxCacheMax
用法: -XX:AutoBoxCacheMax=128
参数: AutoGCSelectPauseMillis
用法:
参数: BCEATraceLevel
用法:
参数: BackEdgeThreshold
用法:
参数: BackgroundCompilation
用法:
参数: BaseFootPrintEstimate
用法:
参数: BiasedLockingBulkRebiasThreshold
用法:
参数: BiasedLockingBulkRevokeThreshold
用法:
参数: BiasedLockingDecayTime
用法:
参数: BiasedLockingStartupDelay
用法:
参数: BindCMSThreadToCPU
用法:
参数: BindGCTaskThreadsToCPUs
用法:
参数: BlockLayoutByFrequency
用法:
参数: BlockLayoutMinDiamondPercentage
用法:
参数: BlockLayoutRotateLoops
用法:
参数: BlockOffsetArrayUseUnallocatedBlock
用法:
参数: BranchOnRegister
用法:
参数: BytecodeVerificationLocal
用法:
参数: BytecodeVerificationRemote
用法:
参数: C1OptimizeVirtualCallProfiling
用法:
参数: C1PatchInvokeDynamic
用法:
参数: C1ProfileBranches
用法:
参数: C1ProfileCalls
用法:
参数: C1ProfileCheckcasts
用法:
参数: C1ProfileInlinedCalls
用法:
参数: C1ProfileVirtualCalls
用法:
参数: C1UpdateMethodData
用法:
参数: CICompilerCount
用法:
参数: CICompilerCountPerCPU
用法:
参数: CITime
用法:
参数: CMSAbortSemantics
用法:
参数: CMSAbortablePrecleanMinWorkPerIteration
用法:
参数: CMSAbortablePrecleanWaitMillis
用法:
参数: CMSBitMapYieldQuantum
用法:
参数: CMSBootstrapOccupancy
用法:
参数: CMSClassUnloadingEnabled
用法:
参数: CMSClassUnloadingMaxInterval
用法:
参数: CMSCleanOnEnter
用法:
参数: CMSCompactWhenClearAllSoftRefs
用法:
参数: CMSConcMarkMultiple
用法:
参数: CMSConcurrentMTEnabled
用法:
参数: CMSCoordinatorYieldSleepCount
用法:
参数: CMSDumpAtPromotionFailure
用法:
参数: CMSEdenChunksRecordAlways
用法:
参数: CMSExpAvgFactor
用法:
参数: CMSExtrapolateSweep
用法:
参数: CMSFullGCsBeforeCompaction
用法: -XX:CMSFullGCsBeforeCompaction=0
参数: CMSIncrementalDutyCycle
用法:
参数: CMSIncrementalDutyCycleMin
用法:
参数: CMSIncrementalMode
用法:
参数: CMSIncrementalOffset
用法:
参数: CMSIncrementalPacing
用法:
参数: CMSIncrementalSafetyFactor
用法:
参数: CMSIndexedFreeListReplenish
用法:
参数: CMSInitiatingOccupancyFraction
用法: -XX:CMSInitiatingOccupancyFraction=75
参数: CMSInitiatingPermOccupancyFraction
用法:
参数: CMSIsTooFullPercentage
用法:
参数: CMSLargeCoalSurplusPercent
用法:
参数: CMSLargeSplitSurplusPercent
用法:
参数: CMSLoopWarn
用法:
参数: CMSMaxAbortablePrecleanLoops
用法: -XX:CMSMaxAbortablePrecleanLoops=0
参数: CMSMaxAbortablePrecleanTime
用法: -XX:CMSMaxAbortablePrecleanTime=5000
参数: CMSOldPLABMax
用法:
参数: CMSOldPLABMin
用法:
参数: CMSOldPLABNumRefills
用法:
参数: CMSOldPLABReactivityFactor
用法:
参数: CMSOldPLABResizeQuicker
用法:
参数: CMSOldPLABToleranceFactor
用法:
参数: CMSPLABRecordAlways
用法:
参数: CMSParPromoteBlocksToClaim
用法:
参数: CMSParallelInitialMarkEnabled
用法: -XX:+CMSParallelInitialMarkEnabled
参数: CMSParallelRemarkEnabled
用法: -XX:+CMSParallelRemarkEnabled
参数: CMSParallelSurvivorRemarkEnabled
用法:
参数: CMSPermGenPrecleaningEnabled
用法:
参数: CMSPrecleanDenominator
用法:
参数: CMSPrecleanIter
用法:
参数: CMSPrecleanNumerator
用法:
参数: CMSPrecleanRefLists1
用法:
参数: CMSPrecleanRefLists2
用法:
参数: CMSPrecleanSurvivors1
用法:
参数: CMSPrecleanSurvivors2
用法:
参数: CMSPrecleanThreshold
用法:
参数: CMSPrecleaningEnabled
用法:
参数: CMSPrintChunksInDump
用法:
参数: CMSPrintEdenSurvivorChunks
用法:
参数: CMSPrintObjectsInDump
用法:
参数: CMSRemarkVerifyVariant
用法:
参数: CMSReplenishIntermediate
用法:
参数: CMSRescanMultiple
用法:
参数: CMSRevisitStackSize
用法:
参数: CMSSamplingGrain
用法:
参数: CMSScavengeBeforeRemark
用法: -XX:+CMSScavengeBeforeRemark
参数: CMSScheduleRemarkEdenPenetration
用法: -XX:CMSScheduleRemarkEdenPenetration=50
参数: CMSScheduleRemarkEdenSizeThreshold
用法: -XX:CMSScheduleRemarkEdenSizeThreshold=2097152
参数: CMSScheduleRemarkSamplingRatio
用法:
参数: CMSSmallCoalSurplusPercent
用法:
参数: CMSSmallSplitSurplusPercent
用法:
参数: CMSSplitIndexedFreeListBlocks
用法:
参数: CMSTriggerPermRatio
用法:
参数: CMSTriggerInterval
用法:
参数: CMSTriggerRatio
用法:
参数: CMSWaitDuration
用法: -XX:CMSWaitDuration=2000
参数: CMSWorkQueueDrainThreshold
用法:
参数: CMSYield
用法:
参数: CMSYieldSleepCount
用法:
参数: CMSYoungGenPerWorker
用法:
参数: CMS_FLSPadding
用法:
参数: CMS_FLSWeight
用法:
参数: CMS_SweepPadding
用法:
参数: CMS_SweepTimerThresholdMillis
用法:
参数: CMS_SweepWeight
用法:
参数: CPUForCMSThread
用法:
参数: CheckEndorsedAndExtDirs
用法:
参数: CheckJNICalls
用法:
参数: ClassUnloading
用法:
参数: ClassUnloadingWithConcurrentMark
用法:
参数: ClearFPUAtPark
用法:
参数: ClipInlining
用法:
参数: CodeCacheExpansionSize
用法:
参数: CodeCacheFlushingMinimumFreeSpace
用法:
参数: CodeCacheMinimumFreeSpace
用法:
参数: CollectGen0First
用法:
参数: CompactFields
用法:
参数: CompilationPolicyChoice
用法:
参数: CompilationRepeat
用法:
参数: CompileCommand
用法:
参数: CompileCommandFile
用法:
参数: CompileOnly
用法:
参数: CompileThreshold
用法:
参数: CompilerThreadHintNoPreempt
用法:
参数: CompilerThreadPriority
用法:
参数: CompilerThreadStackSize
用法:
参数: CompressedClassSpaceSize
用法:
参数: ConcGCThreads
用法: -XX:ConcGCThreads=4
参数: ConditionalMoveLimit
用法:
参数: ContendedPaddingWidth
用法:
参数: ConvertSleepToYield
用法:
参数: ConvertYieldToSleep
用法:
参数: CrashOnOutOfMemoryError
用法:
参数: CreateMinidumpOnCrash
用法:
参数: CriticalJNINatives
用法:
参数: DTraceAllocProbes
用法:
参数: DTraceMethodProbes
用法:
参数: DTraceMonitorProbes
用法:
参数: DebugInlinedCalls
用法:
参数: DebugNonSafepoints
用法:
参数: Debugging
用法:
参数: DefaultMaxRAMFraction
用法:
参数: DefaultThreadPriority
用法:
参数: DeferInitialCardMark
用法:
参数: DeferPollingPageLoopCount
用法:
参数: DeferThrSuspendLoopCount
用法:
参数: DeoptimizeRandom
用法:
参数: DisableAttachMechanism
用法:
参数: DisableExplicitGC
用法: -XX:+DisableExplicitGC
参数: DisableIntrinsic
用法:
参数: DisplayVMOutput
用法:
参数: DisplayVMOutputToStderr
用法:
参数: DisplayVMOutputToStdout
用法:
参数: DoEscapeAnalysis
用法: -XX:+DoEscapeAnalysis
参数: DominatorSearchLimit
用法:
参数: DontCompileHugeMethods
用法:
参数: DontYieldALot
用法:
参数: DumpLoadedClassList
用法:
参数: DumpReplayDataOnError
用法:
参数: DumpSharedSpaces
用法:
参数: EagerXrunInit
用法:
参数: EliminateAllocationArraySizeLimit
用法:
参数: EliminateAllocations
用法:
参数: EliminateAutoBox
用法:
参数: EliminateLocks
用法:
参数: EliminateNestedLocks
用法:
参数: EmitSync
用法:
参数: EnableContended
用法:
参数: EnableInvokeDynamic
用法:
参数: EnableResourceManagementTLABCache
用法:
参数: EnableSharedLookupCache
用法:
参数: EnableTracing
用法:
参数: ErgoHeapSizeLimit
用法:
参数: ErrorFile
用法:
参数: ErrorReportServer
用法:
参数: EscapeAnalysisTimeout
用法:
参数: EstimateArgEscape
用法:
参数: ExitOnOutOfMemoryError
用法:
参数: ExplicitGCInvokesConcurrent
用法: -XX:+ExplicitGCInvokesConcurrent
参数: ExplicitGCInvokesConcurrentAndUnloadsClasses
用法:
参数: ExtendedDTraceProbes
用法:
参数: ExtraSharedClassListFile
用法:
参数: FLSAlwaysCoalesceLarge
用法:
参数: FLSCoalescePolicy
用法:
参数: FLSLargestBlockCoalesceProximity
用法:
参数: FLSVerifyAllHeapReferences
用法:
参数: FLSVerifyIndexTable
用法:
参数: FLSVerifyLists
用法:
参数: FailOverToOldVerifier
用法:
参数: FastTLABRefill
用法:
参数: FenceInstruction
用法:
参数: FieldsAllocationStyle
用法:
参数: FilterSpuriousWakeups
用法:
参数: FlightRecorderOptions
用法:
参数: FoldStableValues
用法:
参数: ForceDynamicNumberOfGCThreads
用法:
参数: ForceNUMA
用法:
参数: ForceTimeHighResolution
用法:
参数: ForceUnreachable
用法:
参数: FreqInlineSize
用法:
参数: G1ConcMarkStepDurationMillis
用法:
参数: G1ConcRSHotCardLimit
用法:
参数: G1ConcRSLogCacheSize
用法:
参数: G1ConcRefinementGreenZone
用法:
参数: G1ConcRefinementRedZone
用法:
参数: G1ConcRefinementServiceIntervalMillis
用法:
参数: G1ConcRefinementThreads
用法:
参数: G1ConcRefinementThresholdStep
用法:
参数: G1ConcRefinementYellowZone
用法:
参数: G1ConfidencePercent
用法:
参数: G1HeapRegionSize
用法: -XX:G1HeapRegionSize=4m
参数: G1HeapWastePercent
用法:
参数: G1MixedGCCountTarget
用法:
参数: G1PrintHeapRegions
用法:
参数: G1PrintRegionLivenessInfo
用法:
参数: G1RSetRegionEntries
用法:
参数: G1RSetScanBlockSize
用法:
参数: G1RSetSparseRegionEntries
用法:
参数: G1RSetUpdatingPauseTimePercent
用法:
参数: G1RefProcDrainInterval
用法:
参数: G1ReservePercent
用法:
参数: G1SATBBufferEnqueueingThresholdPercent
用法:
参数: G1SATBBufferSize
用法:
参数: G1SummarizeConcMark
用法:
参数: G1SummarizeRSetStats
用法:
参数: G1SummarizeRSetStatsPeriod
用法:
参数: G1TraceConcRefinement
用法:
参数: G1UpdateBufferSize
用法:
参数: G1UseAdaptiveConcRefinement
用法:
参数: G1VerifyHeapRegionCodeRoots
用法:
参数: G1VerifyRSetsDuringFullGC
用法:
参数: GCDrainStackTargetSize
用法:
参数: GCHeapFreeLimit
用法:
参数: GCLockerEdenExpansionPercent
用法:
参数: GCLockerInvokesConcurrent
用法:
参数: GCLockerRetryAllocationCount
用法:
参数: GCLogFileSize
用法: -XX:GCLogFileSize=256m
参数: GCParallelVerificationEnabled
用法:
参数: GCPauseIntervalMillis
用法:
参数: GCTaskTimeStampEntries
用法:
参数: GCTimeLimit
用法:
参数: GCTimeRatio
用法:
参数: GuaranteedSafepointInterval
用法:
参数: HeapBaseMinAddress
用法:
参数: HeapDumpAfterFullGC
用法: -XX:+HeapDumpAfterFullGC
参数: HeapDumpBeforeFullGC
用法: -XX:+HeapDumpBeforeFullGC
参数: HeapDumpOnOutOfMemoryError
用法: -XX:+HeapDumpOnOutOfMemoryError
参数: HeapDumpPath
用法: -XX:HeapDumpPath=${目录}
参数: HeapFirstMaximumCompactionCount
用法:
参数: HeapMaximumCompactionInterval
用法:
参数: HeapSizePerGCThread
用法:
参数: IgnoreEmptyClassPaths
用法: -XX:IgnoreEmptyClassPaths
参数: IgnoreUnrecognizedVMOptions
用法:
参数: IgnoreUnverifiableClassesDuringDump
用法:
参数: IncreaseFirstTierCompileThresholdAt
用法:
参数: IncrementalInline
用法:
参数: InitialBootClassLoaderMetaspaceSize
用法:
参数: InitialCodeCacheSize
用法:
参数: InitialHeapSize
用法:
参数: InitialRAMFraction
用法:
参数: InitialSurvivorRatio
用法:
参数: InitialTenuringThreshold
用法:
参数: InitiatingHeapOccupancyPercent
用法:
参数: Inline
用法:
参数: InlineDataFile
用法:
参数: InlineSmallCode
用法:
参数: InlineSynchronizedMethods
用法:
参数: InsertMemBarAfterArraycopy
用法:
参数: InteriorEntryAlignment
用法:
参数: InterpreterProfilePercentage
用法:
参数: JNIDetachReleasesMonitors
用法:
参数: JavaMonitorsInStackTrace
用法:
参数: JavaPriority10_To_OSPriority
用法:
参数: JavaPriority1_To_OSPriority
用法:
参数: JavaPriority2_To_OSPriority
用法:
参数: JavaPriority3_To_OSPriority
用法:
参数: JavaPriority4_To_OSPriority
用法:
参数: JavaPriority5_To_OSPriority
用法:
参数: JavaPriority6_To_OSPriority
用法:
参数: JavaPriority7_To_OSPriority
用法:
参数: JavaPriority8_To_OSPriority
用法:
参数: JavaPriority9_To_OSPriority
用法:
参数: LIRFillDelaySlots
用法:
参数: LargePageHeapSizeThreshold
用法:
参数: LargePageSizeInBytes
用法:
参数: LazyBootClassLoader
用法:
参数: LiveNodeCountInliningCutoff
用法:
参数: LoadExecStackDllInVMThread
用法:
参数: LogCommercialFeatures
用法:
参数: LogCompilation
用法:
参数: LogEvents
用法:
参数: LogEventsBufferEntries
用法:
参数: LogFile
用法:
参数: LogVMOutput
用法:
参数: LoopLimitCheck
用法:
参数: LoopMaxUnroll
用法:
参数: LoopOptsCount
用法:
参数: LoopUnrollLimit
用法:
参数: LoopUnrollMin
用法:
参数: LoopUnswitching
用法:
参数: MallocMaxTestWords
用法:
参数: MallocVerifyInterval
用法:
参数: MallocVerifyStart
用法:
参数: ManagementServer
用法:
参数: MarkStackSize
用法:
参数: MarkStackSizeMax
用法:
参数: MarkSweepAlwaysCompactCount
用法:
参数: MarkSweepDeadRatio
用法:
参数: MaxBCEAEstimateLevel
用法:
参数: MaxBCEAEstimateSize
用法:
参数: MaxDirectMemorySize
用法: -XX:MaxDirectMemorySize=1024m
参数: MaxFDLimit
用法:
参数: MaxGCMinorPauseMillis
用法:
参数: MaxGCPauseMillis
用法: -XX:MaxGCPauseMillis=200
参数: MaxHeapFreeRatio
用法:
参数: MaxHeapSize
用法:
参数: MaxInlineLevel
用法:
参数: MaxInlineSize
用法: -XX:MaxInlineSize=35
参数: MaxJNILocalCapacity
用法:
参数: MaxJavaStackTraceDepth
用法: -XX:MaxJavaStackTraceDepth=1024
参数: MaxJumpTableSize
用法:
参数: MaxJumpTableSparseness
用法:
参数: MaxLabelRootDepth
用法:
参数: MaxLoopPad
用法:
参数: MaxMetaspaceExpansion
用法:
参数: MaxMetaspaceFreeRatio
用法:
参数: MaxMetaspaceSize
用法:
参数: MaxNewSize
用法:
参数: MaxNodeLimit
用法:
参数: MaxPermHeapExpansion
用法:
参数: MaxPermSize
用法: -XX:MaxPermSize=128m
参数: MaxRAM
用法:
参数: MaxRAMFraction
用法:
参数: MaxRecursiveInlineLevel
用法:
参数: MaxTenuringThreshold
用法:
参数: MaxTrivialSize
用法:
参数: MaxVectorSize
用法:
参数: MetaspaceSize
用法: -XX:MetaspaceSize=128m
参数: MethodFlushing
用法:
参数: MinCodeCacheFlushingInterval
用法:
参数: MinHeapDeltaBytes
用法:
参数: MinHeapFreeRatio
用法:
参数: MinInliningThreshold
用法:
参数: MinJumpTableSize
用法:
参数: MinPermHeapExpansion
用法:
参数: MinMetaspaceExpansion
用法:
参数: MinMetaspaceFreeRatio
用法:
参数: MinRAMFraction
用法:
参数: MinSurvivorRatio
用法:
参数: MinTLABSize
用法:
参数: MonitorBound
用法:
参数: MonitorInUseLists
用法:
参数: MultiArrayExpandLimit
用法:
参数: MustCallLoadClassInternal
用法:
参数: NUMAChunkResizeWeight
用法:
参数: NUMAInterleaveGranularity
用法:
参数: NUMAPageScanRate
用法:
参数: NUMASpaceResizeRate
用法:
参数: NUMAStats
用法:
参数: NativeMemoryTracking
用法:
参数: NeedsDeoptSuspend
用法:
参数: NeverActAsServerClassMachine
用法:
参数: NeverTenure
用法:
参数: NewRatio
用法: -XX:NewRatio=2
参数: NewSize
用法:
参数: NewSizeThreadIncrease
用法:
参数: NmethodSweepActivity
用法:
参数: NmethodSweepCheckInterval
用法:
参数: NmethodSweepFraction
用法:
参数: NodeLimitFudgeFactor
用法:
参数: NumberOfGCLogFiles
用法: -XX:NumberOfGCLogFiles=16
参数: NumberOfLoopInstrToAlign
用法:
参数: ObjectAlignmentInBytes
用法:
参数: OldPLABSize
用法:
参数: OldPLABWeight
用法:
参数: OldSize
用法:
参数: OmitStackTraceInFastThrow
用法: -XX:-OmitStackTraceInFastThrow
参数: OnError
用法: -XX:OnError="pmap %p",或者-XX:OnError="gcore %pdbx - %p"
参数: OnOutOfMemoryError
用法:
参数: OnStackReplacePercentage
用法:
参数: OptimizeExpensiveOps
用法:
参数: Optim
围绕垃圾收集和内存,您可以将600多个参数传递给 JVM 。如果包括其他方面,则JVM参数总数将很容易超过1000+。任何人都无法消化和理解太多的论据。在本文中,重点介绍了七个重要的 JVM 参数,在 Java性能测试 中起着非常重要的作用。
-Xmx 可能是最重要的 JVM 参数。 -Xmx 定义要分配给应用程序的最大堆大小。。您可以这样定义应用程序的堆大小: -Xmx2g 。
堆大小在影响应用性能和所需物理硬件需求。这带来了一个问题,我的应用程序正确的堆大小是多少?我应该为应用程序分配大堆大小还是小堆大小?答案是:取决于需求和预算。
将 -Xms 和 -Xmx 设置为相同值的会提高JVM性能
元空间是将存储 JVM 的元数据定义(例如类定义,方法定义)的区域。默认情况下,可用于存储此元数据信息的内存量是无限的(即受您的容器或计算机的RAM大小的限制)。您需要使用 -XX:MaxMetaspaceSize 参数来指定可用于存储元数据信息的内存量的上限。
-XX:MaxMetaspaceSize=256m
OpenJDK中有7种不同的GC算法:
如果您未明确指定GC算法,那么JVM将选择默认算法。在Java 8之前, Parallel GC 是默认的GC算法。从Java 9开始, G1 GC 是默认的GC算法。
GC算法的选择对于确定应用程序的性能起着至关重要的作用。根据我们的研究,我们正在使用Z GC算法观察到出色的性能结果。如果使用 JVM 11+ ,则可以考虑使用 Z GC 算法(即 -XX:+ UseZGC )。
下表总结了激活每种垃圾收集算法所需传递的JVM参数。
垃圾收集日志包含有关垃圾收集事件,回收的内存,暂停时间段等信息,可以通过传递以下JVM参数来启用垃圾收集日志:
从JDK 1到JDK 8:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:{file-path}
从JDK 9及更高版本开始:
-Xlog:gc*:file={file-path}
Demo:
通常,GC日志用于调整垃圾回收性能。但是,GC日志包含重要的微观指标。这些指标可用于预测应用程序的可用性和性能特征。在本文中将重点介绍一种这样的标尺:GC吞吐量。GC吞吐量是您的应用程序在处理客户交易中花费的时间与它在处理GC活动中花费的时间之比。假设您的应用程序的GC吞吐量为98%,则意味着应用程序将其98%的时间用于处理客户活动,其余2%用于GC活动。
现在,让我们看一个健康的JVM的堆使用情况图:
您会看到一个完美的锯齿图案。您会注意到,当运行Full GC(红色三角形)时,内存利用率将一直下降到最低。
现在,让我们看一下有问题的JVM的堆使用情况图:
您可以注意到,在图表的右端,即使GC反复运行,内存利用率也没有下降。这是一个典型的内存泄漏迹象,表明该应用程序正在存在某种内存问题。
如果您仔细观察一下该图,您会发现重复的完整GC开始在上午8点左右开始。但是,该应用程序仅在上午8:45左右开始获取OutOfMemoryError。到上午8点,该应用程序的GC吞吐量约为99%。但是,在上午8点之后,GC吞吐量开始下降到60%。因为当重复的GC运行时,该应用程序将不会处理任何客户交易,而只会进行GC活动。
OutOfMemoryError 是一个严重的问题,它将影响您的应用程序的可用性和性能。要诊断 OutOfMemoryError 或任何与内存相关的问题,必须在应用程序开始遇到 OutOfMemoryError 的那一刻或一瞬间捕获堆转储。由于我们不知道何时会抛出 OutOfMemoryError ,因此很难在抛出时左右的正确时间手动捕获堆转储。但是,可以通过传递以下JVM参数来自动化捕获堆转储:
-XX:+ HeapDumpOnOutOfMemoryError和-XX:HeapDumpPath = {HEAP-DUMP-FILE-PATH}
在 -XX:HeapDumpPath 中,需要指定堆转储所在的文件路径。传递这两个JVM参数时,将在抛出 OutOfMemoryError 时自动捕获堆转储并将其写入定义的文件路径。例:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/crashes/my-heap-dump.hprof
一旦捕获了堆转储,就可以使用 HeapHero 和 EclipseMAT 之类的工具来分析堆转储。
每个应用程序将具有数十,数百,数千个线程。每个线程都有自己的堆栈。在每个线程的堆栈中,存储以下信息:
他们每个都消耗内存。如果它们的使用量超出某个限制,则会引发 StackOverflowError 。可以通过传递-Xss参数来增加线程的堆栈大小限制。例:
-Xss256k
如果将此 -Xss 值设置为一个很大的数字,则内存将被阻塞并浪费。假设您将 -Xss 值指定为 2mb ,而只需要 256kb ,那么您将浪费大量的内存。
假设您的应用程序有500个进程,然后 -Xss 值为 2Mb ,则您的线程将消耗 1000Mb 的内存。另一方面,如果您仅将 -Xss 分配为 256kb ,那么您的线程将仅消耗 125Mb 的内存。每个JVM将节省 875Mb 内存。
注意:线程是在堆(即 -Xmx )之外创建的,因此这 1000Mb 将是您已经分配的-Xmx值的补充。
现代应用程序使用多种协议(即SOAP,REST,HTTP,HTTPS,JDBC,RMI)与远程应用程序连接。有时远程应用程序可能需要很长时间才能做出响应,有时它可能根本不响应。
如果没有正确的超时设置,并且远程应用程序的响应速度不够快,则您的应用程序线程/资源将被卡住。远程应用程序无响应可能会影响您的应用程序的可用性。它可以使您的应用程序停止磨削。为了保护应用程序的高可用性,应配置适当的超时设置。
您可以在JVM级别传递这两个强大的超时网络属性,这些属性可以全局适用于所有使用 java.net.URLConnection 的协议处理程序:
sun.net.client.defaultConnectTimeout :指定建立到主机的连接的超时(以毫秒为单位)。例如,对于HTTP连接,它是与HTTP服务器建立连接时的超时。当建立与资源的连接时, sun.net.client.defaultReadTimeout 指定从输入流读取时的超时(以毫秒为单位)。
例如,如果您要将这些属性设置为2秒:
注意,默认情况下,这两个属性的值为-1,这表示未设置超时。