Java项目jvm调优

项目启动命令

nohup java -jar -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=256m -Xms256m -Xmx256m -Xmn64m -Xss256k -XX:SurvivorRatio=8 -XX:+UseG1GC deviceservice-0.0.2-SNAPSHOT.jar > system.log 2>&1 &

参数

先了解一下 Metaspace(元空间) jdk8之后 PermGen已经不存在由元空间代替,元空间本质与PermGen(永久代)类似,与PermGen最大的区别就在于Metaspace是使用内存,直接存储在内存中,因此元空间默认受本地内存限制。
-XX:MetaspaceSize 元空间初始大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
-XX:MaxMetaspaceSize 元空间最大空间,默认是没有限制的
-Xms 设置JVM使用内存大小
-Xmx 设置JVM最大使用内存大小(-Xms和-Xmx相同可避免每次GC之后JVM重新分配内存)
-Xmn 设置年轻代大小。整个JVM内存大小=年轻代大小 + 年老代大小 + 持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss 设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同内存的条件下,该值越小的话  能生成的线程数量就越多,不过线程数也是有限制的,非无限制。
-XX:SurvivorRatio 设置年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:8,表示Eden:Survivor=8:2,一个Survivor区占整个年轻代的1/10。
-XX:+UseG1GC 设置GC垃圾收集器
垃圾收集器有:
-XX:+UseSerialGC	串行垃圾收集器
-XX:+UseParallelGC	并行垃圾收集器
-XX:+UseConcMarkSweepGC	并发标记扫描垃圾收集器
-XX:ParallelCMSThreads=N	并发标记扫描垃圾收集器  N为使用的线程数量
-XX:+UseG1GC	G1垃圾收集器

垃圾收集器

1、串行垃圾收集器
串行垃圾收集器通过持有应用程序所有的线程进行工作。它为单线程环境设计,只使用一个单独的线程进行垃圾回收,
通过冻结所有应用程序线程进行工作,所以可能不适合服务器环境。它最适合的是简单的命令行程序。

	通过JVM参数-XX:+UseSerialGC可以使用串行垃圾收集器。


2、并行垃圾收集器
并行垃圾收集器也叫做 throughput collector 。它是JVM的默认垃圾收集器。与串行垃圾收集器不同,它使用
多线程进行垃圾收集。相似的是,它也会冻结所有的应用程序线程当执行垃圾收集的时候

	通过JVM参数-XX:ParallelCMSThreads=N 可以使用并行垃圾收集器


3、并发标记扫描垃圾收集器
并发标记垃圾收集使用多线程扫描堆内存,标记需要清理的实例并且清理被标记过的实例。并发标记垃圾收集器只会
在下面两种情况持有应用程序所有线程。
	3.1当标记的引用对象在tenured区域;
	3.2在进行垃圾收集的时候,堆内存的数据被并发的改变。
相比并行垃圾收集器,并发标记扫描垃圾收集器使用更多的CPU来确保程序的吞吐量。如果我们可以为了更好的程序
性能分配更多的CPU,那么并发标记上扫描垃圾收集器是更好的选择相比并发垃圾收集器。

	通过JVM参数 XX:+USeParNewGC 打开并发标记扫描垃圾收集器。


4、G1垃圾收集器
G1垃圾收集器适用于堆内存很大的情况,他将堆内存分割成不同的区域,并且并发的对其进行垃圾收集。G1也可以
在收集内存之后对剩余的堆内存空间进行压缩。并发扫描标记垃圾收集器在STW情况下压缩内存。G1垃圾收集会优先
选择第一块垃圾最多的区域

	通过JVM参数 –XX:+UseG1GC 使用G1垃圾回收器

以上为个人用于学习jvm调优的记忆,方便日后学习,若有大神有更好的,可以学习一下

你可能感兴趣的:(Java项目jvm调优)