主要介绍JVM内存参数配置的详细说明,通过实例代码详细介绍,具有一定的参考价值。感兴趣的朋友可以参考一下。
首先我们知道:JVM中内存错误的类型。
1、堆内存泄漏:OutOfMemory:Java heap space
这种增加内存的内存泄露,只能暂时解决问题,不能根治。如果要优化代码,那一定是代码问题:如果检查堆中的大量对象,会发现这些对象都被引用了,对象不能及时回收,导致超过了堆的设定最大内存。
2、老年代内存泄漏:OutOfMemoryError:PermGen space
类名、访问修饰符、字段描述、方法描述等。当占用空间大于永久生成的最大值时会出现。一般在内存初始化的时候,空间太小,解决的办法就是扩展空间。
3、栈内存泄漏:StackOverflowError
当执行代码时,代码被推入堆栈。这时,如果堆栈的内存不足以容纳要推入堆栈的代码的大小,就会长时间报错。通过设置堆栈的空间大小。一般:-Xss设置线程的大小来求解。示例:-Xss256m
下面是检查jvm内存的方法:
1、监控JVM的GC情况:
Jstat -gcutil pid 2000 20(只需要看o,如果达到100%并且长时间停留在100%,说明晚年内存不足)
Pid:服务进程的pid。可以通过ps -ef | grep java查看java的服务进程pid。
2000:多少秒被监控。这是两秒钟。
20:总共20次。
伊甸区
奥:老年
永久世代
YGC:新生代的GC时代
YGCT:当前计数的YGCT的总时间(毫秒)。
FGC GC时代:老年全GC
FGCT:FGC在当前统计中花费的总时间(毫秒)
GCT:YGCFGC
2、查看jvm配置信息
Jmap -head pid //可以看到java进程堆的配置信息,各个区域的空间大小和配置信息。
3、查看jvm中类和对象的占用情况
Jmap -histo 5279 | head -20 //查看jvm中每个类的实例数、占用内存量和全名。
4、上面使我们的基本命令使用,那么我们怎么预测或者说内存泄漏会有什么征兆?
1.tps波动大,下降慢,甚至到0,响应时间波动小,上升慢。
2.根据jstat命令,Jvm中的旧区在增加,FullGC非常频繁,对应的FullGC消耗的时间也在增加。
3.从jconsole/JVM可以看出,堆内存曲线不断上升,接近上限时变成一条直线。
4.日志错误java.lang .内存不足错误:java堆空间
5、内存泄露怎么定位?
(1)确定症状:现象方面,Java进程抛出OOM异常,分析属于哪种异常,是正常的内存资源耗尽还是内存泄漏。
(2)监控jvm的GC状态:jstat -gcutil pid 1000 100(只需要看O,如果达到100%并且长时间停留在100%,说明陈年内存不足)。如果FGC很多,就要检查是否有内存泄漏。
(3)通过jmap命令检查当前堆内存中实例的数量以及占用内存最多的前20个对象:jmap -histo pid | head -20。
(4)通过jvm分析定位:转储远程堆,然后下载转储文件,用JVM打开进行分析,可以看到JVM中对象更直观的信息。
6、下面是进行最后的JVM参数调优:
虚拟机的通用参数
-
堆内存=年轻一代和老一代。
年轻一代=伊甸园幸存者
幸存者=从空间到空间
-
年轻一代=从空间到空间的伊甸园
堆内存=从空间到空间老年的伊甸园
====================================
-Xms2048m:初始堆大小,建议1/4物理内存,默认值为1/64物理内存。
-Xmx2048m:最大堆大小,建议与-Xms保持一致。默认值是物理内存的1/4。
-Xmn512m:新生代大小,建议不要超过堆内存的1/2-xs 256k,线程栈大小,建议256k。
-XX:PermSize=256m:永久初始值,默认值为物理内存的1/64。
-XX:MaxPermSize=256m:永久生成的最大值,默认值为物理内存的1/4。
-XX:SurvivorRatio=8:幼带中伊甸园面积与幸存者面积之比,默认为8:1,即伊甸园(8),FromSpace(1),ToSpace(1)。
-XX:MaxTenuringThreshold=15:提升到旧年龄的对象的年龄。每个对象在MinorGC中保存一次后,对象年龄为1,默认值为15。年龄超过15岁就进入老年。该参数在串行GC-中有效
xx:pretenurezethreshold=3145728:单位字节,仅对串行和ParNew收集器有效,新一代采用并行清除GC时无效,大于该值的对象在老一代直接分配。
7、参数设置在哪里?
一般来说,一个服务器可能有多个java服务,对吧?但是很多服务器都会出现这种情况,那么问题来了。如果我修改jvm配置文件中的jvm参数,不是所有的服务都有这个参数吗?那么还有别的办法吗?
是啊!也就是启动java进程中的命令设置。
nohup JAVA $ { JAVA _ OPT }-jar XXX . jar 21
JAVA_OPT的参数:里面的参数取决于设置什么以及具体的参数值。
JAVA _ OPT=-server-xms 256m-xmx 256m-xmn 512m-XX:MetaspaceSize=64m-XX:MaxMatespaceSize=256m
关于JVM内存参数配置的这篇文章到此为止。有关JVM内存参数配置的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!