JVM调优

Java调试工具

1. jps --查看当前进程ID

2. jstack --当前虚拟机每一条线程执行的方法堆栈的快照
	
3. jconsole --使用GUI界面对线程进行监控
	
4. top -H -p pid --查看CPU的使用情况(Linux)
	
5. jinfo --输出并修改进程的opts
	
	可以修改运行时额java进程的运行参数
		
	jinfo [-jvm opt] pid 查看信息
	
	查看指定的参数
	$ jinfo -flag MaxHeapSize 12772
	-XX:MaxHeapSize=734003200
	
	打印所有的信息
	$ jinfo 12772
	
	打印JVM参数
	jinfo -flags 12772

	
6. jstat --用于查看JVM的内存使用以及GC情况
	
	jstat -class pid 查看class数量和占用资源情况
	
		$ jstat -class 12772
         Loaded  Bytes  Unloaded  Bytes     Time
          3931  7349.4        9    10.5       1.01

	jstat -compiler pid 查看实时编译的数量
	
	jstat -gc pid 查看gc的情况
	
        $ jstat -gc 12772
        .....   YGC     YGCT    FGC    FGCT     GCT
        .....   2    0.028   1      0.023    0.051
        YGC: Young GC 发生2次
        YGCT: 消耗时间0.028s
        FGC:Full GC 1次
        FGCT:Full GC耗费的时间0.023s,可以发现Full GC明显是Major GC耗费的时间多
        GCT:GC消耗的总时间
	
	jstat -gccapacity 显示vm内存三代对象的使用情况和占用大小
	
	jstat -gcnew pid 新生代GC的情况
	
	jstat -gcnewcapacity pid 新生代的内存使用情况
	
	jstat -gcold pid 老年代的GC情况
	
	jstat -gcoldcapacity pid 老年代的内存使用情况
	
	jstat -gcpermcapatity pid 永久代的GC情况
	
	jstat -gcutil pid 统计gc信息
	
	jstat -printcompilation pid	vm执行的信息
	
7. jmap --java内存映射信息
	
	jmap -heap pid	可以查看堆内存的情况
	
	jmap -histo 18936 --查看对象实例个数 占用资源情况 类名
	
    $ jmap -heap 12772
    Attaching to process ID 12772, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 25.171-b11

    using thread-local object allocation.
    Parallel GC with 8 thread(s)

    Heap Configuration: --Heap的配置情况
       MinHeapFreeRatio         = 0
       MaxHeapFreeRatio         = 100
       MaxHeapSize              = 734003200 (700.0MB)
       NewSize                  = 89128960 (85.0MB)
       MaxNewSize               = 244318208 (233.0MB)
       OldSize                  = 179306496 (171.0MB)
       NewRatio                 = 2
       SurvivorRatio            = 8
       MetaspaceSize            = 21807104 (20.796875MB)
       CompressedClassSpaceSize = 1073741824 (1024.0MB)
       MaxMetaspaceSize         = 17592186044415 MB
       G1HeapRegionSize         = 0 (0.0MB)

    Heap Usage: --Heap的使用情况
    PS Young Generation
    Eden Space:
       capacity = 67108864 (64.0MB)
       used     = 11190136 (10.671745300292969MB)
       free     = 55918728 (53.32825469970703MB)
       16.674602031707764% used
    From Space:
       capacity = 11010048 (10.5MB)
       used     = 0 (0.0MB)
       free     = 11010048 (10.5MB)
       0.0% used
    To Space:
       capacity = 11010048 (10.5MB)
       used     = 0 (0.0MB)
       free     = 11010048 (10.5MB)
       0.0% used
    PS Old Generation
       capacity = 109576192 (104.5MB)
       used     = 21402720 (20.411224365234375MB)
       free     = 88173472 (84.08877563476562MB)
       19.532272119841508% used

    7289 interned Strings occupying 626360 bytes

JVM调优

1. 为什么要对JVM调优

    1)出现OOM,并且在代码层次无法再优化

    2)需要更高的响应速度

2. JVM调优很大层次上是空间换时间

3. 对响应速度主要的影响是垃圾回收带来的停顿时间,也就是YGC和FGC的消耗时间

	1)OOM的处理
	
		通过jmap -heap pid或者jstat -gccapacity查看heap的内存情况
		
		确定是哪块区域内存爆满,并进行调整内存
		
	2)YGC和FGC太频繁,并且YGCT、FGCT的时间太长
	
		发生GC的主要原因是内存不足,这个可以调整内存
		
		如果需要更短的停顿时间,可以使用CMS或者G1垃圾收集器,使用jinfo查看JVM的参数
			
			jinfo -flags pid
			
		适当调整参数以达到优化的目的
			
4. 查看所有能被动态修改的参数
			
	windows: java -XX:+PrintFlagsInitial | findstr manageable
			
	Linux:   java -XX:+PrintFlagsInitial | grep manageable

代码调优

1) 类如果不需要被其他类继承,指定为final
	
    javac会内联所有的final方法,从而提高性能

2) 尽量重用对象,减少不必要的创建对象资源浪费

3) 尽量使用局部变量(栈中,速度快)

4) 不要重复初始化变量

5) 保证过期对象及时回收(设为null)

6) 减少变量重复计算,例如一个表达式,在if()中计算使用了多次,这个时候把表达式的结果提前计算,后面使用就行

7) 在需要的时候才创建对象和变量,延迟加载
	
8) 不在循环中使用try{}catch{}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值