jvm性能调优

1.JVM堆内存常用参数
在这里插入图片描述
与垃圾回收相关的JVM参数:

				-XX:-DisableExplicitGC — 让System.gc()不产生任何作用
				
				-XX:+PrintGCDetails — 打印GC的细节
				
				-XX:+PrintGCDateStamps — 打印GC操作的时间戳
				
				-XX:NewRatio — 可以设置老生代和新生代的比例
				
				-XX:PrintTenuringDistribution — 设置每次新生代GC后输出幸存者乐园中对象年龄的分布
				
				-XX:InitialTenuringThreshold / -XX:MaxTenuringThreshold:设置老年代阀值的初始值和最大值
				
				-XX:TargetSurvivorRatio:设置幸存区的目标使用率

2.jvm堆结构图及分代
一般分为新生代、老年代和永久代(静态属性、常量、类信息)
分代是为了提高对象内存分配 和 垃圾回收的效率
在这里插入图片描述

3.jvm监控工具

		(1)jps,显示指定系统内所有的虚拟机进程。
		    在实际生产环境中,如果jps无法查看,可通过ps命令查看(java程序启动后,会在目录/tmp/hsperfdata_{userName}/下生成几个文件,
		    文件名就是java进程的pid,因此jps列出进程id就是把这个目录下的文件名列一下而已,至于系统参数,则是读取文件中的内容。
		    如果没有权限读取,则jps失效)。
		(2)jstat,用于收集虚拟机各方面的运行数据。
		(3)jinfo,显示虚拟机配置信息。
		(4)jmap,生成虚拟机的内存转储快照。
		(5)jhat,内存转储快照分析工具,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言。
		(6)jstack,显示虚拟机的线程快照

4.垃圾回收器(GC)
在这里插入图片描述 (1)简介:
Java垃圾回收器是一个或多个运行在JVM中低优先级的守护线程,它负责监视JVM堆空间的使用情况,在预定的条件满足时负责回收“死亡对象”,释放可用的内存空间供应用程序使用。死亡对象是指在JVM所有线程堆栈引用中没有任何一个有效指向的对象,死亡对象是无法重新被程序使用的Java对象,在Java中,通过程序无法释放死亡对象的内存空间,JVM使用垃圾回收器来自动的不间断的回收死亡对象。
(2)内存分配策略:
大多数情况下,对象在新生代的Eden中分配。当Eden区没有足够的空间进行分配时,虚拟机将发起一次Minor GC,而大对象(需要大量 连续内存空间的Java对象,类似长字符串和数组)将通过分配担保机制直接进入老年代。
Minor GC——复制算法具体过程:
将Eden和S0中还存活着的对象一次性的复制到S1中,并且清理掉Eden与S0的空间。如果S1放不下还存活着的对象,那这些对象将通过分配担保机制进入老年代。【原理上随时保持S0和S1有一个是空的,用来存下一次的对象】
Eden区快满的时候,会进行上一步类似操作,将Eden和S1区的年纪大的对象放到S0区【此时S1区就是空的】
直到Eden区快满,S0或者S1也快满的时候,这时候就把这两个区的年纪大的对象放到Old区。
依次循环,直到Old区也快满的时候,Eden区也快满的时候,会对整个这一块内存区域进行一次大清洗(FullGC),腾出内存,为之后的对象创建,程序运行腾地方。
新生代GC(Minor GC):指发生在新生代的垃圾回收动作,因为java对象大多具备朝生夕灭的特征,所以Minor GC发生的特别频繁,
一般回收速度也很快。
老年代GC(Major GC/Full GC):指发生在老年代的GC,出现了Major GC,至少会伴随一次的MinorGC(但非绝对,
在Parallel Scavenge收集器的收集策略里就有直接进行Minor GC的策略选择过程)。Major GC的速度一般比Minor GC慢10倍以上。
(3)Java垃圾回收器的常用回收算法:
记数器清除(tracing):该算法使用引用计数器来区分存活对象和死亡的对象。堆中的每个对象对应一个引用计数器。当每一次创建一个对象并赋给一个变量时,引用计数器置为1。当对象被赋给任意变量时,引用计数器每次加1,当对象出了作用域后(该对象丢弃不再使用),引用计数器减1,一旦引用计数器为0,对象就满足了垃圾收集的条件。复制清除(replicate):<该算法将堆内存分成两个相同空间,从根(ThreadLocal的对象,静态对象)开始访问每一个关联的活跃对象,将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A。标记清除(mark-sweep):收集器先从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。
串行收集器(Serial):使用单线程处理所有垃圾回收工作,因为无需多线程交互,所以效率比较高。但是,也无法使用多处理器的优势,适合单处理器或小尺寸堆(100M左右)环境下使用。使用-XX:+UseSerialGC参数打开该收集器。并行收集器(Parallel):Java5.0新增加的收集器,使用多线程并行的对指定的内存块进行垃圾回收,可以充分的发挥多处理器的优势。使用-XX:+UseParallelGC参数打开该收集器,使用-XX:+UseParallelOldGC参数强制在年老代使用该收集器,使用-XX:ParallelGCThreads参数设置并行收集器使用的线程数 。并发收集器 (ConcMarkSweep):该收集器主要是针对标记清除算法,可以保证大部分工作都并发进行(应用不停止),垃圾回收只暂停很少的时间,此收集器适合对响应时间要求比较高的中、大规模应用。使用-XX:+UseConcMarkSweepGC打开。Java5.0默认情况下对年青代使用并行收集器(Java1.4使用的是串行收集器),对年老代使用并发收集器,当然可以使用上面提到的参数强制JVM使用其它的收集器
(4)调优方法
GC调优的目的有两个:将转移到老年代的对象数量降低到最小;减少Full GC的执行时间。为了达到这两个目的,需要做以下几个事情:

减少使用全局对象和大对象。
调整新生代的大小到最合适。
设置老年代的大小为最合适。
选择合适的GC收集器。
当然什么是最合适的,需要根据具体情况来决定。

内存参数设计示例

java
-server
-XX:UseParallelGC
-Xprof -verbose:gc
-Xmx1550m
-Xms1550m
-Xss128k
-Xns512m
-XX:NewRatio=4
-XX:SurvivorRatio=4
-XX:MaxPermSize=256m
-XX:MaxTenuringThreshold=10
-XX:NewRatio=4

5.tomcat调节jvm初始内存大小

windows下tomcat的运行文件为catalina.bat,打开文件,在文件中部找到“rem ----- Execute The Requested Command -----”字样 ,在它后面添加如下内容即可

复制代码
set “JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%”

rem ----- Execute The Requested Command ---------------------------------------
set JAVA_OPTS=%JAVA_OPTS% -server -Xms2048m -Xmx2048m -Xmn512m -XX:PermSize=400m -XX:MaxPermSize=700m
echo Using CATALINA_BASE: “%CATALINA_BASE%”
echo Using CATALINA_HOME2: “%CATALINA_HOME2%”
echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%“if “”%1"” == ““debug”” goto use_jdk
echo Using JRE_HOME: "%JRE_HOME%"goto java_dir_displayed
:use_jdk
echo Using JAVA_HOME: “%JAVA_HOME%”
:java_dir_displayed
echo Using CLASSPATH: “%CLASSPATH%”

两个命令记录一下:
1.查询各类型数据内存占有细节:jmap -histo 17811 (进程号)
2.查询新老年带内存占有细节: jmap -heap 17811

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值