Java内存参数设置
-XX:+PrintGC
-Xms1500m
-Xmx1500m
-XX:ReservedCodeCacheSize=512m
-XX:+IgnoreUnrecognizedVMOptions
-XX:+UseG1GC
-XX:SoftRefLRUPolicyMSPerMB=50
-XX:CICompilerCount=2
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-ea
-Dsun.io.useCanonCaches=false
-Djdk.http.auth.tunneling.disabledSchemes=""
-Djdk.attach.allowAttachSelf=true
-Djdk.module.illegalAccess.silent=true
-Dkotlinx.coroutines.debug=off
-XX:+PrintGCDetails
top -c
ps H -eo pid,tid,%cpu | grep 进程号 找线程占用高的
转化成16进制 printf "%x\n" 线程号
jstack 13567 | grep 354a -A 20
https://github.com/oldratlee/useful-scripts/tree/master
https://github.com/oldratlee/useful-scripts
设置线程栈的大小。
1.设置最大堆内存
java应用程序可以使用的最大堆可以使用-Xmx来进行设置。最大堆指的是新生代和老年代的大小之和的最大值,它是java应用程序的上限。
Runtime.getRuntime().maxMemory()可以得到最大堆。
使用 java -Xmx5M 。。。运行时,设置最大堆的上限为5M。
2.设置最小堆内存
使用JVM参数-Xms来设置系统的最小堆空间,也就是JVM启动时所占有的操作系统内存大小。
java 应用程序在运行时,首先会被分配-Xms指定的内存大小,并尽可能尝试在此大小空间内运行程序。当-Xms指定的大小不能满足应用程序的要求,JVM才会像系统申请更大的空间,直到内存到达-Xmx指定的最大内存为止。如果超过-Xmx指定的大小,则会抛出OutOfMemoryError异常。
如果-Xms指定的过小,则Jvm为了保证系统在指定的内存中运行,就会频繁的进行GC操作以释放失效的内存空间,从而增加Minor GC 和Full GC的操作,对系统性能造成一定影响。
3.设置新生代
参数-Xmn设置新生代的大小,设置一个较大的新生代会减老年代的大小,这个参数对系统性能以及GC行为有很大影响。新生代的大小一般为整个堆空间的1/4 到1/3 左右。
在Hot Spot 虚拟机中,-XX:NewSize 用于设置新生代的初始大小,-XX:MaxNewSize 用于设置新生代的最大值。
4. 设置持久代
持久代不属于堆的一部分。在Hot Spot 虚拟机中,使用 -XX:MaxPermSize设置持久代的最大值,使用-XX:PermSize 设置持久代的初始大小。
持久代的大小直接决定了系统中可以支持多少个类定义和多少个常量。
5.设置线程栈
线程栈是线程的一块私有空间,在JVM中使用 -Xss来设置线程栈的大小。
在线程中进行局部变量的分配,函数调用时,都需要在栈中开辟空间。如果栈空间太小,则没有太多的空间分配给局部变量或者达不到函数调用时的深度,则就会抛出异常,如果栈空间过大,则开设线程所需的内存成本就会上升,系统所支持的线程数就会下降。
java堆也是向操作系统申请空间的。如果堆空间越大,就会导致操作系统可用于线程栈的空间减少,从而导致支持的线程数减少。
6.堆的比例分配
参数-XX:SurvivorRatio 用来设置新生代中 enen空间和s0空间的比例。 s0 和 s1 分别是from 空间和to空间,大小一样,职能相同。 并在Minor GC 互换角色。
7 堆的分配参数总结
与java 应用程序堆内存相关的JVM参数。
-Xms:设置初始堆大小。
-Xmx:设置最大堆大小。
-Xss:设置线程栈大小。
-Xmn: 设置新生代大小
-XX:NewSize=n 设置新生代初始大小。
-XX:MinHeapFreeRation 设置堆空间的最小空闲比例。当堆空间的空闲内存小于此值时,JVM会自动扩展空间。
-XX:MaxHeapFreeRation 设置堆空间的最大空闲比例。当堆空间的空闲内存大于此值时,JVM会压缩空间,得到一个较小的堆。
-XX:NewRation=n 设置老年代和新生代的比例。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n 设置新生代中 enen 和 s0 比例. 年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
-XX:MaxPermSize=n: 设置持久代大小
-XX:PermSize 设置持久代的初始大小。
-XX:TargetSurvivorRatio。 设置survivor 的使用率。当survivor区的 空间使用率达到此值时,将对象送往老年代。
maxMemory()这个方法返回的是java虚拟机(这个进程)能构从操作系统那里挖到的最大的内存,以字节为单位,如果在运行java程序的时 候,没有添加-Xmx参数,那么就是64兆,也就是说maxMemory()返回的大约是6410241024字节,这是java虚拟机默认情况下能 从操作系统那里挖到的最大的内存。如果添加了-Xmx参数,将以这个参数后面的值为准,例如java -cp ClassPath -Xmx512m ClassName,那么最大内存就是51210240124字节。
totalMemory()这个方法返回的是java虚拟机现在已经从操作系统那里挖过来的内存大小,也就是java虚拟机这个进程当时所占用的所有 内存。如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,直 挖到maxMemory()为止,所以totalMemory()是慢慢增大的。如果用了-Xms参数,程序在启动的时候就会无条件的从操作系统中挖- Xms后面定义的内存数,然后在这些内存用的差不多的时候,再去挖。
freeMemory()是什么呢,刚才讲到如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操 作系统那里挖的,基本上是用多少挖多少,但是java虚拟机100%的情况下是会稍微多挖一点的,这些挖过来而又没有用上的内存,实际上就是 freeMemory(),所以freeMemory()的值一般情况下都是很小的,但是如果你在运行java程序的时候使用了-Xms,这个时候因为程 序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,这个时候,挖过来的内存可能大部分没用上,所以这个时候freeMemory()可 能会有些大。