BigData JVM运行参数-内存模型-MAT-命令调试-VisualJVM_待烟火清凉的博客-CSDN博客


本站和网页 https://blog.csdn.net/gcxzflgl/article/details/106397907 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

BigData JVM运行参数-内存模型-MAT-命令调试-VisualJVM_待烟火清凉的博客-CSDN博客
BigData JVM运行参数-内存模型-MAT-命令调试-VisualJVM
最新推荐文章于 2022-10-27 09:23:48 发布
待烟火清凉
最新推荐文章于 2022-10-27 09:23:48 发布
632
收藏
分类专栏:
Java
Jvm
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gcxzflgl/article/details/106397907
版权
Java
同时被 2 个专栏收录
27 篇文章
0 订阅
订阅专栏
Jvm
2 篇文章
0 订阅
订阅专栏
目标
我们为什么要学习JVM优化掌握jvm的运行参数以及参数的设置掌握jvm的内存模型(堆内存)掌握jmap命令的使用以及通过MAT工具进行分析掌握定位分析内存溢出的方法掌握jstack命令的使用掌握VisualJVM工具的使用
1.我们为什么学习JVM优化
在本地开发环境中我们很少会遇到对jvm进行优化的需求,一旦到了生产环境,可能将会有下面的问题:
运行的应用“卡住了”,日志不输出,程序没有反应服务器的CPU负载突然升高在多线程应用下,如何分配线程的数量?……
2.JVM运行参数以及参数的设置
在jvm中有很多的参数可以进行设置,这样可以让jvm在各种环境中都能够高效的运行。绝大部分的参数保持默认即可。
2.1、三种参数类型
jvm的参数类型分为三类,分别是:
标准参数
-help-version -X参数 (非标准参数)
-Xint-Xcomp -XX参数(使用率较高)
-XX:newSize-XX:+UseSerialGC
2.2、标准参数
jvm的标准参数,一般都是很稳定的,在未来的JVM版本中基本不会改变,使用 java -help 检索出所有的标准参数。
用法: java [-options] class [args...]
(执行类)
或 java [-options] -jar jarfile [args...]
(执行 jar 文件)
[root@k8s-master ~]# java -help
其中选项包括:
-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>
使用指定的图像显示启动屏幕
2.2.1、实战
实战1:查看jvm版本
[root@k8s-master ~]# java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
[root@k8s-master ~]#
# -showversion参数是表示,先打印版本信息,再执行后面的命令,在调试时非常有用,后面会使用到。
实战2:通过-D设置系统属性参数
public class TestJVM {
public static void main(String[] args) {
String str = System.getProperty("gcx");
if (str == null) {
System.out.println("雅阁先生");
} else {
System.out.println(str);
进行编译、测试
[root@k8s-master test]# javac TestJVM.java
[root@k8s-master test]# java TestJVM
雅阁先生
[root@k8s-master test]# java -Dgcx=123 TestJVM
123
[root@k8s-master test]#
2.2.2、-server与-client参数
可以通过-server或-client设置jvm的运行参数。
它们的区别是Server VM的初始堆空间会大一些,默认使用的是并行垃圾回收器,启动慢运行快。Client VM相对来讲会保守一些,初始堆空间会小一些,使用串行的垃圾回收器,它的目标是为了让JVM的启动速度更快,但运行速度会比Serverm模式慢些。JVM在启动的时候会根据硬件和操作系统自动选择使用Server还是Client类型的JVM。32位操作系统
如果是Windows系统,不论硬件配置如何,都默认使用Client类型的JVM。如果是其他操作系统上,机器配置有2GB以上的内存同时有2个以上CPU的话默认使用server模式,否则使用client模式。 64位操作系统
只有server类型,不支持client类型。
[root@k8s-master test]# java -client -showversion TestJVM
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
雅阁先生
[root@k8s-master test]# java -server -showversion TestJVM
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
雅阁先生
[root@k8s-master test]#
#由于机器是64位系统,所以不支持client模式
2.3、-X参数
jvm的-X参数是非标准参数,在不同版本的jvm中,参数可能会有所不同,可以通过java -X查看非标准参数。
[root@k8s-master test]# java -X
-Xmixed 混合模式执行 (默认)
-Xint 仅解释模式执行
-Xbootclasspath:<用 : 分隔的目录和 zip/jar 文件>
设置搜索路径以引导类和资源
-Xbootclasspath/a:<用 : 分隔的目录和 zip/jar 文件>
附加在引导类路径末尾
-Xbootclasspath/p:<用 : 分隔的目录和 zip/jar 文件>
置于引导类路径之前
-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
显示所有与区域设置相关的设置并继续
-X 选项是非标准选项, 如有更改, 恕不另行通知。
2.3.1、-Xint、-Xcomp、-Xmixed
在解释模式(interpreted mode)下,-Xint标记会强制JVM执行所有的字节码,当然这会降低运行速度,通常低10倍或更多。-Xcomp参数与它(-Xint)正好相反,JVM在第一次使用时会把所有的字节码编译成本地代码,从而带来最大程度的优化。
然而,很多应用在使用-Xcomp也会有一些性能损失,当然这比使用-Xint损失的少,原因是-xcomp没有让JVM启用JIT编译器的全部功能。JIT编译器可以对是否需要编译做判断,如果所有代码都进行编译的话,对于一些只执行一次的代码就没有意义了。 -Xmixed是混合模式,将解释模式与编译模式进行混合使用,由jvm自己决定,这是jvm默认的模式,也是推荐使用的模式。
示例:强制设置运行模式
#强制设置为解释模式
[root@k8s-master test]# java -showversion -Xint TestJVM
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, interpreted mode)
雅阁先生
#强制设置为编译模式
[root@k8s-master test]# java -showversion -Xcomp TestJVM
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, compiled mode)
雅阁先生
#注意:编译模式下,第一次执行会比解释模式下执行慢一些,注意观察。
#默认的混合模式
[root@k8s-master test]# java -showversion TestJVM
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
雅阁先生
2.4、-XX参数
-XX参数也是非标准参数,主要用于jvm的调优和debug操作。
-XX参数的使用有2种方式,一种是boolean类型,一种是非boolean类型:
boolean类型
格式:-XX:[±]<name> 表示启用或禁用<name>属性如:-XX:+DisableExplicitGC 表示禁用手动调用gc操作,也就是说调用System.gc()无效 非boolean类型
格式:-XX:<name>=<value> 表示<name>属性的值为<value>如:-XX:NewRatio=1 表示新生代和老年代的比值
用法:
[root@k8s-master test]# java -showversion -XX:+DisableExplicitGC TestJVM
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
雅阁先生
[root@k8s-master test]#
2.5、-Xms与-Xmx参数
-Xms与-Xmx分别是设置jvm的堆内存的初始大小和最大大小。
-Xmx2048m:等价于-XX:MaxHeapSize,设置JVM最大堆内存为2048M。
-Xms512m:等价于-XX:InitialHeapSize,设置JVM初始堆内存为512M。
适当的调整jvm的内存大小,可以充分利用服务器资源,让程序跑的更快。
示例:
[root@k8s-master test]# java -Xms512m -Xms2048m TestJVM
雅阁先生
[root@k8s-master test]#
2.6、查看jvm的运行参数
有些时候我们需要查看jvm的运行参数,这个需求可能会存在2种情况:
第一,运行java命令时打印出运行参数;
第二,查看正在运行的java进程的参数;
2.6.1、运行java命令时打印参数
运行java命令时打印参数,需要添加-XX:+PrintFlagsFinal参数即可。
[root@k8s-master test]# java -XX:+PrintFlagsFinal -version
[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 = 0 {product}
uintx AdaptiveSizePolicyWeight = 10 {product}
uintx AdaptiveSizeThroughPutPolicy = 0 {product}
uintx AdaptiveTimeWeight = 25 {product}
bool AdjustConcurrency = false {product}
bool AggressiveHeap = false {product}
bool AggressiveOpts = false {product}
intx AliasLevel = 3 {C2 product}
bool AlignVector = true {C2 product}
intx AllocateInstancePrefetchLines = 1 {product}
intx AllocatePrefetchDistance = 256 {product}
intx AllocatePrefetchInstr = 3 {product}
intx AllocatePrefetchLines = 3 {product}
intx AllocatePrefetchStepSize = 64 {product}
intx AllocatePrefetchStyle = 1 {product}
bool AllowJNIEnvProxy = false {product}
bool AllowNonVirtualCalls = false {product}
bool AllowParallelDefineClass = false {product}
bool AllowUserSignalHandlers = false {product}
bool AlwaysActAsServerClassMachine = false {product}
bool AlwaysCompileLoopMethods = false {product}
bool AlwaysLockClassLoader = false {product}
bool AlwaysPreTouch = false {product}
bool AlwaysRestoreFPU = false {product}
bool AlwaysTenure = false {product}
bool AssertOnSuspendWaitFailure = false {product}
bool AssumeMP = false {product}
intx AutoBoxCacheMax = 128 {C2 product}
uintx AutoGCSelectPauseMillis = 5000 {product}
intx BCEATraceLevel = 0 {product}
intx BackEdgeThreshold = 100000 {pd product}
bool BackgroundCompilation = true {pd product}
......
由上述的信息可以看出,参数有boolean类型和数字类型,值的操作符是 **=**或 :=,分别代表默认值和被修改的值。
示例:
[root@k8s-master test]# java -XX:+PrintFlagsFinal -XX:+AdjustConcurrency -version
[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 = 0 {product}
uintx AdaptiveSizePolicyWeight = 10 {product}
uintx AdaptiveSizeThroughPutPolicy = 0 {product}
uintx AdaptiveTimeWeight = 25 {product}
bool AdjustConcurrency := true {product}
bool AggressiveHeap = false {product}
bool AggressiveOpts = false {product}
intx AliasLevel = 3 {C2 product}
bool AlignVector = true {C2 product}
intx AllocateInstancePrefetchLines = 1 {product}
intx AllocatePrefetchDistance = 256 {product}
intx AllocatePrefetchInstr = 3 {product}
intx AllocatePrefetchLines = 3 {product}
intx AllocatePrefetchStepSize = 64 {product}
intx AllocatePrefetchStyle = 1 {product}
bool AllowJNIEnvProxy = false {product}
bool AllowNonVirtualCalls = false {product}
bool AllowParallelDefineClass = false {product}
2.6.2、查看正在运行的jvm参数
如果想要查看正在运行的jvm就需要借助于jinfo命令查看。
首先,启动一个tomcat用于测试,来观察下运行的jvm参数。
rz (上传到/opt/software)
tar -zxvf apache-tomcat-10.0.0-M5.tar.gz -C ../module/
cd /opt/module
cd apache-tomcat-10.0.0-M5/
bin/startup.sh
#查看所有的参数,用法:jinfo -flags <进程id>
#通过jps 或者 jps -l 查看java进程
[root@k8s-master bin]# jps
79603 Bootstrap
81746 Jps
[root@k8s-master bin]# jps -l
81760 sun.tools.jps.Jps
79603 org.apache.catalina.startup.Bootstrap
[root@k8s-master bin]# jinfo -flags 79603
Attaching to process ID 79603, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=46137344 -XX:MaxHeapSize=734003200 -XX:MaxNewSize=244318208 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=15204352 -XX:OldSize=30932992 -XX:+UseCompre
ssedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC Command line: -Djava.util.logging.config.file=/opt/module/apache-tomcat-10.0.0-M5/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -D
java.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -Dcatalina.base=/opt/module/apache-tomcat-10.0.0-M5 -Dcatalina.home=/opt/module/apache-tomcat-10.0.0-M5 -Djava.io.tmpdir=/opt/module/apache-tomcat-10.0.0-M5/temp
#查看某一参数的值,用法:jinfo -flag <参数名> <进程id>
[root@k8s-master bin]# jinfo -flag MaxHeapSize 79603
-XX:MaxHeapSize=734003200
[root@k8s-master bin]#
3.JVM内存模型
jvm的内存模型在1.7和1.8有较大的区别,本文是以1.8为例进行讲解,但是我们也是需要对1.7的内存模型有所了解,所以接下里,我们将先学习1.7再学习1.8的内存模型。
3.1、jdk1.7的堆内存模型
Young 年轻区(代) Young区被划分为三部分,Eden区和两个大小严格相同的Survivor区,其中,Survivor区间中,某一时刻只有其中一个是被使用的,另外一个留做垃圾收集时复制对象用,在Eden区间变满的时候, GC就会将存活的对象移到空闲的Survivor区间中,根据JVM的策略,在经过几次垃圾收集后,任然存活于Survivor的对象将被移动到Tenured区间。 Tenured 年老区 Tenured区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在Young复制转移一定的次数以后,对象就会被转移到Tenured区,一般如果系统中用了application级别的缓存,缓存中的对象往往会被转移到这一区间。 Perm 永久区 Perm代主要保存class,method,filed对象,这部份的空间一般不会溢出,除非一次性加载了很多的类,不过在涉及到热部署的应用服务器的时候,有时候会遇到java.lang.OutOfMemoryError : PermGen space 的错误,造成这个错误的很大原因就有可能是每次都重新部署,但是重新部署后,类的class没有被卸载掉,这样就造成了大量的class对象保存在了perm中,这种情况下,一般重新启动应用服务器可以解决问题。 Virtual区:
最大内存和初始内存的差值,就是Virtual区。
3.2、jdk1.8的堆内存模型
由上图可以看出,jdk1.8的内存模型是由2部分组成,年轻代 + 年老代。
年轻代:Eden + 2*Survivor
年老代:OldGen
在jdk1.8中变化最大的Perm区,用Metaspace(元数据空间)进行了替换。
需要特别说明的是:Metaspace所占用的内存空间不是在虚拟机内部,而是在本地内存空间中,这也是与1.7的永久代最大的区别所在。
3.3、为什么要废弃1.7中的永久区?
官网给出了解释:http://openjdk.java.net/jeps/122 查看 Motivation
This is part of the JRockit and Hotspot convergence effort.
JRockit customers do not need to configure the permanent generation
(since JRockit does not have a permanent generation)
and are accustomed to not configuring the permanent generation.
移除永久代是为融合HotSpot JVM与 JRockit VM而做出的努力,因为JRockit没有永久代,不需要配置永久代。
现实使用中,由于永久代内存经常不够用或发生内存泄露,爆出异常java.lang.OutOfMemoryError: PermGen。
基于此,将永久区废弃,而改用元空间,改为了使用本地内存空间。
3.4、通过jstat命令进行查看堆内存使用情况
jstat命令可以查看堆内存各部分的使用量,以及加载类的数量。命令的格式如下:
jstat [-命令选项] [vmid] [间隔时间/毫秒] [查询次数]
3.4.1、查看class加载统计
[root@k8s-master bin]# jps
85568 Jps
79603 Bootstrap
[root@k8s-master bin]# jstat -class 79603
Loaded Bytes Unloaded Bytes Time
3681 8060.6 0 0.0 2.83
[root@k8s-master bin]#
说明:
Loaded:加载class的数量Bytes:所占用空间大小Unloaded:未加载数量Bytes:未加载占用空间Time:时间
3.4.2、查看编译统计
[root@k8s-master bin]# jstat -compiler 79603
Compiled Failed Invalid Time FailedType FailedMethod
2791 0 0 4.48 0
[root@k8s-master bin]#
说明:
Compiled:编译数量。Failed:失败数量Invalid:不可用数量Time:时间FailedType:失败类型FailedMethod:失败的方法
3.4.3、垃圾回收统计
#指定打印的间隔和次数,每1秒中打印一次,共打印5次
[root@k8s-master bin]# jstat -gc 79603 1000 10
S0C S1C S0U S1U EC EU OC OU MC MU CCSC CCSU YGC YGCT FGC FGCT GCT
13824.0 10240.0 0.0 10221.9 90112.0 3249.8 37376.0 22556.0 27008.0 26302.3 2944.0 2676.4 7 0.535 1 0.152 0.687
13824.0 10240.0 0.0 10221.9 90112.0 3249.8 37376.0 22556.0 27008.0 26302.3 2944.0 2676.4 7 0.535 1 0.152 0.687
13824.0 10240.0 0.0 10221.9 90112.0 3249.8 37376.0 22556.0 27008.0 26302.3 2944.0 2676.4 7 0.535 1 0.152 0.687
13824.0 10240.0 0.0 10221.9 90112.0 3249.8 37376.0 22556.0 27008.0 26302.3 2944.0 2676.4 7 0.535 1 0.152 0.687
13824.0 10240.0 0.0 10221.9 90112.0 3249.8 37376.0 22556.0 27008.0 26302.3 2944.0 2676.4 7 0.535 1 0.152 0.687
13824.0 10240.0 0.0 10221.9 90112.0 3249.8 37376.0 22556.0 27008.0 26302.3 2944.0 2676.4 7 0.535 1 0.152 0.687
13824.0 10240.0 0.0 10221.9 90112.0 3249.8 37376.0 22556.0 27008.0 26302.3 2944.0 2676.4 7 0.535 1 0.152 0.687
13824.0 10240.0 0.0 10221.9 90112.0 3249.8 37376.0 22556.0 27008.0 26302.3 2944.0 2676.4 7 0.535 1 0.152 0.687
13824.0 10240.0 0.0 10221.9 90112.0 3249.8 37376.0 22556.0 27008.0 26302.3 2944.0 2676.4 7 0.535 1 0.152 0.687
13824.0 10240.0 0.0 10221.9 90112.0 3249.8 37376.0 22556.0 27008.0 26302.3 2944.0 2676.4 7 0.535 1 0.152 0.687
[root@k8s-master bin]#
说明:
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)MU:方法区使用大小(KB)CCSC:压缩类空间大小(KB)CCSU:压缩类空间使用大小(KB)YGC:年轻代垃圾回收次数YGCT:年轻代垃圾回收消耗时间FGC:老年代垃圾回收次数FGCT:老年代垃圾回收消耗时间GCT:垃圾回收消耗总时间
4、jmap的使用以及内存溢出分析
前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容,如:内存使用情况的汇总、对内存溢出的定位与分析。
4.1、查看内存使用情况
[root@k8s-master bin]# jmap -heap 79603
Attaching to process ID 79603, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.221-b11
using thread-local object allocation.
Parallel GC with 2 thread(s)
Heap Configuration: #堆内存使用配置
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 734003200 (700.0MB)
NewSize = 15204352 (14.5MB)
MaxNewSize = 244318208 (233.0MB)
OldSize = 30932992 (29.5MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:#堆内存使用情况
PS Young Generation #年轻代
Eden Space:
capacity = 92274688 (88.0MB)
used = 4100112 (3.9101715087890625MB)
free = 88174576 (84.08982849121094MB)
4.443376714533025% used
From Space:
capacity = 10485760 (10.0MB)
used = 10467224 (9.982322692871094MB)
free = 18536 (0.01767730712890625MB)
99.82322692871094% used
To Space:
capacity = 14155776 (13.5MB)
used = 0 (0.0MB)
free = 14155776 (13.5MB)
0.0% used
PS Old Generation #老年代
capacity = 38273024 (36.5MB)
used = 23097336 (22.02733612060547MB)
free = 15175688 (14.472663879394531MB)
60.3488660838506% used
16904 interned Strings occupying 1499664 bytes.
[root@k8s-master bin]#
4.2 查看内存中对象数量及大小
#查看所有对象,包括活跃以及非活跃的
jmap -histo <pid> | more
#查看活跃对象
jmap -histo:live <pid> | more
[root@k8s-master bin]# jmap -histo:live 79603 | more
num #instances #bytes class name
----------------------------------------------
1: 37783 3647072 [C
2: 36664 879936 java.lang.String
3: 1483 676424 [B
4: 16507 528224 java.util.HashMap$Node
5: 4150 477928 java.lang.Class
6: 4127 363176 java.lang.reflect.Method
7: 9798 313536 java.util.concurrent.ConcurrentHashMap$Node
8: 2333 279168 [I
9: 4331 260720 [Ljava.lang.Object;
10: 883 181288 [Ljava.util.HashMap$Node;
11: 97 132216 [Ljava.util.concurrent.ConcurrentHashMap$Node;
12: 6622 105952 java.lang.Object
13: 2296 73472 java.util.Hashtable$Entry
14: 1482 71136 java.util.HashMap
15: 907 57880 [Ljava.lang.String;
16: 92 50176 [Ljava.util.WeakHashMap$Entry;
17: 2275 48560 [Ljava.lang.Class;
18: 1097 43880 java.util.LinkedHashMap$Entry
19: 884 42432 org.apache.tomcat.util.modeler.AttributeInfo
20: 9 37008 [Ljava.nio.ByteBuffer;
21: 40 35856 [S
22: 846 33840 java.lang.ref.SoftReference
23: 1036 33152 java.lang.ref.WeakReference
24: 620 29760 java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync
25: 1238 29712 java.util.ArrayList
26: 138 28288 [Ljava.util.Hashtable$Entry;
27: 389 28008 java.util.logging.Logger
28: 1001 24024 java.util.LinkedList$Node
29: 677 21664 java.util.concurrent.locks.ReentrantLock$NonfairSync
30: 613 19616 javax.management.MBeanAttributeInfo
31: 395 18960 java.util.logging.LogManager$LoggerWeakRef
32: 431 17240 java.math.BigInteger
33: 344 16512 org.apache.tomcat.util.modeler.OperationInfo
34: 668 16032 java.util.concurrent.CopyOnWriteArrayList
35: 178 15664 org.apache.catalina.webresources.CachedResource
36: 621 14904 java.util.concurrent.locks.ReentrantReadWriteLock
37: 357 14280 jakarta.servlet.jsp.tagext.TagAttributeInfo
38: 168 13440 java.lang.reflect.Constructor
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
#对象说明
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其他对象
4.3、将内存使用情况dump到文件中
有些时候我们需要将jvm当前内存中的情况dump到文件中,然后对它进行分析,jmap也是支持dump到文件中的。
#用法:
jmap -dump:format=b,file=dumpFileName <pid>
#示例
jmap -dump:format=b,file=/tmp/dump.dat 79603
[root@k8s-master bin]# clear
[root@k8s-master bin]# jmap -dump:format=b,file=/tmp/dump.dat 79603
Dumping heap to /tmp/dump.dat ...
Heap dump file created
[root@k8s-master bin]# cd /tmp/
[root@k8s-master tmp]# ll
总用量 18516
-rw------- 1 root root 18959668 5月 28 11:12 dump.dat
drwxr-xr-x 2 root root 19 5月 28 11:12 hsperfdata_root
drwx------ 3 root root 17 5月 28 08:25 systemd-private-ca665d725bd54fc3aca13b61071b9d4d-chronyd.service-0ha2Yj
drwx------ 2 root root 6 5月 27 09:30 vmware-root_7268-2856323754
drwx------ 2 root root 6 5月 25 10:18 vmware-root_7278-2831355174
drwx------ 2 root root 6 5月 19 09:04 vmware-root_7382-3099672000
drwx------ 2 root root 6 5月 27 09:07 vmware-root_7411-4156401571
drwx------ 2 root root 6 5月 28 08:25 vmware-root_7447-4155942846
drwx------ 2 root root 6 5月 27 16:28 vmware-root_7462-3124836936
drwx------ 2 root root 6 5月 25 09:54 vmware-root_7469-4147488282
drwx------ 2 root root 6 5月 20 10:12 vmware-root_7570-2831289637
[root@k8s-master tmp]#
4.4、通过jhat对dump文件进行分析
在上一小节中,我们将jvm的内存dump到文件中,这个文件是一个二进制的文件,不方便查看,这时我们可以借助于jhat工具进行查看。
#用法:
jhat -port <port> <file>
#示例:
[root@k8s-master tmp]# jhat -port 9999 dump.dat
Reading from dump.dat...
Dump file created Thu May 28 11:12:17 CST 2020
Snapshot read, resolving...
Resolving 181134 objects...
Chasing references, expect 36 dots....................................
Eliminating duplicate references....................................
Snapshot resolved.
Started HTTP server on port 9999
Server is ready.
访问地址:http://ip:9999 拉倒滚动条最下
OQL查询功能
4.5、通过MAT工具对dump文件进行分析
4.5.1、MAT工具介绍
MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。
官网地址:https://www.eclipse.org/mat/
4.5.2、下载安装
下载地址:https://www.eclipse.org/mat/downloads.php 下载后解压zip文件
4.5.3、使用
查看可能存在内存泄漏的分析
5、实战:内存溢出的定位与分析
内存溢出在实际的生产环境中经常会遇到,比如,不断的将数据写入到一个集合中,出现了死循环,读取超大的文件等等,都可能会造成内存溢出。
如果出现了内存溢出,首先我们需要定位到发生内存溢出的环节,并且进行分析,是正常还是非正常情况,如果是正常的需求,就应该考虑加大内存的设置,如果是非正常需求,那么就要对代码进行修改,修复这个bug。
首先,我们得先学会如何定位问题,然后再进行分析。如何定位问题呢,我们需要借助于jmap与MAT工具进行定位分析。
接下来,我们模拟内存溢出的场景。
5.1、模拟内存溢出
编写代码,向List集合中添加100万个字符串,每个字符串由1000个UUID组成。如果程序能够正常执行,最后打印ok。
package com.gcxzflgl.springdemo;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
public class TestJvmOutOfMemory {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
for (int i = 0; i < 10000000; i++) {
String str = "";
for (int j = 0; j < 1000; j++) {
str += UUID.randomUUID().toString();
list.add(str);
System.out.println("ok");
运行结果已经内存异常打印出堆栈信息文件
D:\jdk\jdk\bin\java.exe -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:63584,suspend=y,server=n -Dvisualvm.id=12663888379118 -Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError -javaagent:C:\Users\admin\.IntelliJIdea2018.2\system\captureAgent\debugger-agent.jar=file:/C:/Users/admin/AppData/Local/Temp/capture.props -Dfile.encoding=UTF-8 -classpath com.gcxzflgl.springdemo.TestJvmOutOfMemory
Connected to the target VM, address: '127.0.0.1:63584', transport: 'socket'
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid11628.hprof ...
Exception in thread "main" Heap dump file created [8152677 bytes in 0.025 secs]
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at com.gcxzflgl.springdemo.TestJvmOutOfMemory.main(TestJvmOutOfMemory.java:14)
Disconnected from the target VM, address: '127.0.0.1:63584', transport: 'socket'
Process finished with exit code 1
配置运行参数
#参数如下:
-Xms8m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
将生成的文件通过MAT工具分析
可以看到,有90.40%的内存由Object[]数组占有,所以比较可疑。
分析:这个可疑是正确的,因为已经有超过90%的内存都被它占有,这是非常有可能出现内存溢出的。
查看详情: 可以看到集合中存储了大量的uuid字符串。
6、jstack的使用
有些时候我们需要查看下jvm中的线程执行情况,比如,发现服务器的CPU的负载突然增高了、出现了死锁、死循环等,我们该如何分析呢?
由于程序是正常运行的,没有任何的输出,从日志方面也看不出什么问题,所以就需要看下jvm的内部线程的执行情况,然后再进行分析查找出原因。
这个时候,就需要借助于jstack命令了,jstack的作用是将正在运行的jvm的线程情况进行快照,并且打印出来:
#用法:jstack <pid>
6.1、线程的状态
在Java中线程的状态一共被分成6种:
初始态(NEW)
创建一个Thread对象,但还未调用start()启动线程时,线程处于初始态。 运行态(RUNNABLE),在Java中,运行态包括 就绪态 和 运行态。
就绪态
该状态下的线程已经获得执行所需的所有资源,只要CPU分配执行权就能运行。所有就绪态的线程存放在就绪队列中。 运行态
获得CPU执行权,正在执行的线程。由于一个CPU同一时刻只能执行一条线程,因此每个CPU每个时刻只有一条运行态的线程。 阻塞态(BLOCKED)
当一条正在执行的线程请求某一资源失败时,就会进入阻塞态。而在Java中,阻塞态专指请求锁失败时进入的状态。由一个阻塞队列存放所有阻塞态的线程。处于阻塞态的线程会不断请求资源,一旦请求成功,就会进入就绪队列,等待执行。 等待态(WAITING)
当前线程中调用wait、join、park函数时,当前线程就会进入等待态。也有一个等待队列存放所有等待态的线程。线程处于等待态表示它需要等待其他线程的指示才能继续运行。进入等待态的线程会释放CPU执行权,并释放资源(如:锁) 超时等待态(TIMED_WAITING)
当运行中的线程调用sleep(time)、wait、join、parkNanos、parkUntil时,就会进入该状态;它和等待态一样,并不是因为请求不到资源,而是主动进入,并且进入后需要其他线程唤醒;进入该状态后释放CPU执行权 和 占有的资源。与等待态的区别:到了超时时间后自动进入阻塞队列,开始竞争锁。 终止态(TERMINATED)
线程执行结束后的状态。
6.2、实战:死锁问题
如果在生产环境发生了死锁,我们将看到的是部署的程序没有任何反应了,这个时候我们可以借助jstack进行分析,下面我们实战下查找死锁的原因。
6.2.1、构造死锁
编写代码,启动2个线程,Thread1拿到了obj1锁,准备去拿obj2锁时,obj2已经被Thread2锁定,所以发送了死锁。
package com.gcxzflgl.springdemo;
public class TestDeadLock {
private static Object obj1 = new Object();
private static Object obj2 = new Object();
public static void main(String[] args) {
new Thread(new Thread1()).start();
new Thread(new Thread2()).start();
private static class Thread1 implements Runnable{
@Override
public void run() {
synchronized (obj1){
System.out.println("Thread1 拿到了 obj1 的锁!");
try {
// 停顿2秒的意义在于,让Thread2线程拿到obj2的锁
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
synchronized (obj2){
System.out.println("Thread1 拿到了 obj2 的锁!");
private static class Thread2 implements Runnable{
@Override
public void run() {
synchronized (obj2){
System.out.println("Thread2 拿到了 obj2 的锁!");
try {
// 停顿2秒的意义在于,让Thread1线程拿到obj1的锁
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
synchronized (obj1){
System.out.println("Thread2 拿到了 obj1 的锁!");
[root@k8s-master test]# javac TestDeadLock.java
[root@k8s-master test]# java TestDeadLock
Thread1 拿到了 obj1 的锁!
Thread2 拿到了 obj2 的锁!
#这里发生了死锁,程序一直将等待下去
[root@k8s-master ~]# jstack 102920
Java stack information for the threads listed above:
===================================================
"Thread-1":
at TestDeadLock$Thread2.run(TestDeadLock.java:49)
- waiting to lock <0x00000000f175aa58> (a java.lang.Object)
- locked <0x00000000f175aa68> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
"Thread-0":
at TestDeadLock$Thread1.run(TestDeadLock.java:29)
- waiting to lock <0x00000000f175aa68> (a java.lang.Object)
- locked <0x00000000f175aa58> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
可以清晰的看到:
Thread2获取了 <0x00000000f175aa58> 的锁,等待获取 <0x00000000f175aa68> 这个锁Thread1获取了 <0x00000000f175aa68> 的锁,等待获取 <0x00000000f175aa58> 这个锁由此可见,发生了死锁。
7、VisualVM工具的使用
VisualVM,能够监控线程,内存情况,查看方法的CPU时间和内存中的对 象,已被GC的对象,反向查看分配的堆栈(如100个String对象分别由哪几个对象分配出来的)。
VisualVM使用简单,几乎0配置,功能还是比较丰富的,几乎囊括了其它JDK自带命令的所有功能。
内存信息线程信息Dump堆(本地进程)Dump线程(本地进程)打开堆Dump。堆Dump可以用jmap来生成。打开线程Dump生成应用快照(包含内存信息、线程信息等等)性能分析。CPU分析(各个方法调用时间,检查哪些方法耗时多),内存分析(各类对象占用的内存,检查哪些类占用内存多)……
我们用idea查看 首先检查idea是否安装 VisualVM Launcher插件 设置好后选择图中按钮启动 启动后看到这个界面,进行实时监控
待烟火清凉
关注
关注
点赞
收藏
觉得还不错?
一键收藏
打赏
知道了
评论
BigData JVM运行参数-内存模型-MAT-命令调试-VisualJVM
目标我们为什么要学习JVM优化掌握jvm的运行参数以及参数的设置掌握jvm的内存模型(堆内存)掌握jamp命令的使用以及通过MAT工具进行分析掌握定位分析内存溢出的方法掌握jstack命令的使用掌握VisualJVM工具的使用1.我们为什么学习JVM优化在本地开发环境中我们很少会遇到对jvm进行优化的需求,一旦到了生产环境,可能将会有下面的问题:运行的应用“卡住了”,日志不输出,程序没有反应服务器的CPU负载突然升高在多线程应用下,如何分配线程的数量?……2.JVM运行参
复制链接
扫一扫
专栏目录
mat(mac)---jvm内存分析工具
05-26
jvm内存反洗工具:
模拟内存泄漏并MAT分析
myccode的专栏
07-21
307
记录一次如何通过MAT工具定位内存泄漏点
一、准备可以引起内存泄漏的代码OutOfMemoryGCLimitExceed.java
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class OutOfMemoryGCLimitExceed {
public static void addRandomDataToMap() {
Map<Integer, S.
参与评论
您还未登录,请先
登录
后发表或查看评论
nginx-upstream-jvm-route-1.12.0.tar.gz
01-15
nginx_upstream_jvm_route 是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。
安装方法(进入Nginx源码目录):
#patch -p0 < /path/to/this/directory/jvm_route.patch
# ./configure --prefix=/usr/nginx-0.8.1 --with-http_stub_status_module --add-module=/path/to/this/directory/
#make
#make install
例如以下配置:
1. Resin:
upstream backend {
server 192.168.0.100 srun_id=a;
server 192.168.0.101 srun_id=b;
server 192.168.0.102 srun_id=c;
server 192.168.0.103 srun_id=d;
jvm_route $cookie_JSESSIONID;
2. Tomcat:
upstream backend {
server 192.168.0.100 srun_id=a;
server 192.168.0.101 srun_id=b;
server 192.168.0.102 srun_id=c;
server 192.168.0.103 srun_id=d;
jvm_route $cookie_JSESSIONID reverse;
Jvm性能优化-JVM内存结构原理分析03
06-22
Jvm性能优化-JVM内存结构原理分析03
jvm-monitoring-agent:从内部监视JVM,检测线程块并自动保存线程转储
05-07
JVM监控代理
监视JVM线程并在给定时间内阻塞线程时保存线程转储。
用法
从下载jar
将其添加到要监视的应用程序的命令行中:
java -javaagent:jvm-monitoring-agent-0.9.0.jar=threshold=1000,debug ...rest of command
配置标志/选项
debug
启用调试输出-如果您怀疑某些问题,则可能会提供其他信息。 要调试选项问题,请使其成为第一个传递的参数。
path=...
指定保存线程转储的位置。
interval=...
指定检查线程列表中被阻止线程的频率。 (毫秒)
threshold=...
指定在保存转储之前需要阻塞线程多长时间。 (毫秒)
delay=...
指定保存连续线程转储之间的延迟。 (毫秒)
filterRegex=...
指定用于过滤已知阻塞线程的正则表达式。 (毫秒)
例子
JVM之VisualVM工具的使用
write less , do more
10-27
2888
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。JMX可以跨越一系列异构操作系统平台、系统体系结构和网络传输协议,灵活的开发无缝集成的系统、网络和服务管理应用。
D:\Program Files\Java\jdk\bin\java.exe'' finished with non-zero exit value 1的正确解决方案
weixin_42446445的博客
05-07
2866
1.首先这里不是提供在根目录中加上任何代码来解决问题
2.其次更新换代工具和sdk也无益
3.观察build记录也无益
简单点来说,本来好好的项目突然报错,而且这个错误百分80是因为新加的关于java基础类的jar包和安卓子代jar包冲突,所以依次可以测试注释掉新加的jar包,找到冲突的jar包然后删除即可
...
neo4j 启动的时候 总是报错 C:\Program Files\Java\bin\java.exe 找不到
candy134834的博客
09-26
9074
环境变量java_home配置错了 必须配置 C:\Program Files\Java\jdk1.8.0_172 不能带bin要不然会报错
Error:Cannot run program "D:\JDK\bin\java" (in directory "C:\Users\Administrator\.IntelliJIdea2017.3
热门推荐
ruanwenjun_csdn的博客
04-04
2万+
安装IDEA之后运行一直报这个错误,今天又下了一个JDK10安装在C盘默认安装位置,然后就可以运行IDEA了
怀疑这个问题的原因可能如下:
1.原来的JDK版本会不会是32位的(好像是64位的)
2.安装在D盘是不是访问不到(可能性不大)
3.针对我????
反正现在已经暂时弄好了,待以后弄清楚了再来写
在网上一直搜不到这个问题的解决方案...
JVM内存模型-重排序&内存屏障 1
08-03
其java内存模型中更重要的,应该是内存屏障,memoryfence较粗犷,代价也提到内存屏障,先应该说到重排序,这强调下,重排序只对于那些在当前线程没有依赖关
nginx-upstream-jvm-route-1.15
05-08
nginx-upstream-jvm-route 支持nginx版本1.15
解决nginx: [emerg] invalid parameter "srun_id=tomcat1" 问题
nginx-upstream-jvm-route-1.6.tar.gz
01-15
nginx_upstream_jvm_route 是一个 Nginx 的扩展模块,用来实现基于 Cookie 的 Session Sticky 的功能。
安装方法(进入Nginx源码目录):
#patch -p0 < /path/to/this/directory/jvm_route.patch
# ./configure --prefix=/usr/nginx-0.8.1 --with-http_stub_status_module --add-module=/path/to/this/directory/
#make
#make install
例如以下配置:
1. Resin:
upstream backend {
server 192.168.0.100 srun_id=a;
server 192.168.0.101 srun_id=b;
server 192.168.0.102 srun_id=c;
server 192.168.0.103 srun_id=d;
jvm_route $cookie_JSESSIONID;
2. Tomcat:
upstream backend {
server 192.168.0.100 srun_id=a;
server 192.168.0.101 srun_id=b;
server 192.168.0.102 srun_id=c;
server 192.168.0.103 srun_id=d;
jvm_route $cookie_JSESSIONID reverse;
java技术面试必问:JVM-内存模型讲解.docx
12-16
java技术面试必问:JVM-内存模型讲解.docx
oberonc:用于JVM的Oberon-07编译器
01-31
Oberon-07编译器
oberonc是编程语言的单程自托管编译器。 它针对Java虚拟机(版本> = 1.8)。
该项目开始展示Niklaus Wirth编写编译器的方法(有关更多详细信息,请参见HanspeterMössenböck的-Niklaus )。
oberonc受到Niklaus Wirth的RISC处理器编译器的启发,可。
编译器紧凑,不依赖任何第三方库。 它在解析源文件时一次性生成Java字节码。 尽管为堆栈机生成代码很简单,但是复杂的类文件格式以及考虑到Java语言设计JVM的事实使这一任务更加恶化。 实际上,JVM缺少支持Oberon功能所需的许多原语,特别是:
值类型
通过参考评估策略
过程变量(指向函数的指针)和类型的相对结构兼容性
使用变通办法来实现这些功能会大大增加编译器的大小,总共增加了大约6000行Oberon。
源代码是尽可能遵循Niklaus Wirth的编码风格编写的。 在2.80GHz的旧Intel i5上, oberonc可以在不到300毫秒的时间内完成自身编译(对于热VM,则约为100毫秒)。
如何建造
您可以在Linux或W
JVM性能调优-JVM内存整理及GC回收
11-20
很好的学习资料,很详细的讲述了JVM性能调优,JVM内存模型,垃圾回收原理算法等等,很适合JAVA程序员阅读。
jvm-sandbox demo
01-03
基础的jvm-sandbox的一个demo
解决C:\Program Files\Java\jdk1.7.0_71\bin\java.exe'' finished with non-zero exit value 2
aengui的博客
11-24
1万+
使用android studio 导入了一个别人的module, gradle的时候就报了个错,完整错误信息为
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.
Idea的内存溢出和GC回收异常解决方法
suodod的博客
11-20
5685
在新入职的公司,第一件事当然是公司的现有项目在本地运行,一般的小型项目的话,IDEA的默认配置就可以满足日常开发的需求但是在遇到项目模块较多,或者说类比较多的话,idea的默认配置就无法满足我们的日常开发的需求了,所以,我也碰到了这个问题,并且这个问题还拦住了我接近10天,上网查的资料也是没什么卵用,项目在进行打包时还是会报GC回收异常或者是内存溢出;
java.lang.OutOfMemory...
解释jvm参数-xss
最新发布
03-02
`-Xss` 是Java虚拟机(JVM)的一个参数,用于设置每个线程的最大堆栈大小。
在Java应用程序中,每个线程都有一个堆栈(也称为调用堆栈或执行堆栈),用于保存方法调用的返回地址、局部变量以及方法参数。如果递归调用过深或者方法嵌套层数太多,堆栈就会溢出,导致`StackOverflowError`异常。
通过使用`-Xss`参数可以控制堆栈的大小,从而避免堆栈溢出问题。这个参数的默认值通常是512KB或者1MB,可以根据应用程序的需要进行调整。例如,下面的命令将线程的堆栈大小设置为2MB:
```
java -Xss2m MyApp
```
需要注意的是,增大堆栈大小会占用更多的内存,因此需要根据应用程序的内存使用情况进行权衡。同时,过大的堆栈大小也会导致性能下降,因为JVM需要分配更多的内存来管理堆栈。因此,在设置堆栈大小时需要慎重考虑。
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
待烟火清凉
CSDN认证博客专家
CSDN认证企业博客
码龄6年
暂无认证
232
原创
3万+
周排名
107万+
总排名
30万+
访问
等级
4910
积分
108
粉丝
245
获赞
23
评论
1010
收藏
私信
关注
热门文章
Python入门序列(列表,元组,字典,集合)
42104
Springboot内置tomcat优化说明
28937
HttpClient获取响应状态码Status
19796
HttpClient设置请求头模拟浏览器
14025
Linux NAT网络配置
13245
分类专栏
Docker
9篇
Kubernetes
1篇
Hdfs
2篇
mapreduce
1篇
yarn
1篇
Sap
1篇
Rocketmq
1篇
Springcloud Alibaba
Jvm
2篇
Rabbitmq
Dubbo
Concurrent
Elasticsearch
kylin
storm
flink
spark
scala
hbase
hue
oozie
azkaban
flume
sqoop
impala
hive
设计模式
21篇
Technical articles
1篇
AI Mathematical foundation
1篇
Framework
1篇
Java
27篇
Mysql
13篇
其它
2篇
SSH/SSM Interview questions
5篇
Linux
48篇
Google
3篇
Redis
5篇
Activiti
13篇
Lucene
5篇
JMS
2篇
Shiro
7篇
WebService
8篇
htmlunit
6篇
jsoup
3篇
HttpClient
6篇
Java Reptile
1篇
SpringBoot
8篇
IntellijIdea
2篇
GOF
21篇
struts2
1篇
Concurrent programming
5篇
website
1篇
mongodb
1篇
zookeeper
5篇
Spring
7篇
springsecurity
Python
7篇
最新评论
Activiti流程定义部署之ZIP方式
幽夜莫知途:
一次只能部署一个流程吗?如果这样zip也没有怎么省事啊
Python入门序列(列表,元组,字典,集合)
该努力张同学:
谢谢老板
java9多版本jar包兼容
码客567:
博主这个介绍似乎运行不起来
Python入门序列(列表,元组,字典,集合)
weixin_58255735:
太仔细了吧我好爱
Python入门序列(列表,元组,字典,集合)
Cxx_无名小卒:
散列值,偏移那块有问题,望修改,以免小白懵逼,比如我。
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
Kubernetes二进制离线安装(1.1.8)
HDFS 2.7.5核心讲解
Hadoop 2.7.5集群安装
2020年26篇
2018年94篇
2017年151篇
目录
目录
分类专栏
Docker
9篇
Kubernetes
1篇
Hdfs
2篇
mapreduce
1篇
yarn
1篇
Sap
1篇
Rocketmq
1篇
Springcloud Alibaba
Jvm
2篇
Rabbitmq
Dubbo
Concurrent
Elasticsearch
kylin
storm
flink
spark
scala
hbase
hue
oozie
azkaban
flume
sqoop
impala
hive
设计模式
21篇
Technical articles
1篇
AI Mathematical foundation
1篇
Framework
1篇
Java
27篇
Mysql
13篇
其它
2篇
SSH/SSM Interview questions
5篇
Linux
48篇
Google
3篇
Redis
5篇
Activiti
13篇
Lucene
5篇
JMS
2篇
Shiro
7篇
WebService
8篇
htmlunit
6篇
jsoup
3篇
HttpClient
6篇
Java Reptile
1篇
SpringBoot
8篇
IntellijIdea
2篇
GOF
21篇
struts2
1篇
Concurrent programming
5篇
website
1篇
mongodb
1篇
zookeeper
5篇
Spring
7篇
springsecurity
Python
7篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
添加红包
祝福语
请填写红包祝福语或标题
红包数量
红包个数最小为10个
红包总金额
红包金额最低5元
余额支付
当前余额3.43元
前往充值 >
需支付:10.00元
取消
确定
下一步
知道了
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝
规则
hope_wisdom 发出的红包
打赏作者
待烟火清凉
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值