垃圾回收机制和Tomcat配置调优测试

 

一、垃圾回收机制概述

1、介绍:垃圾回收机制会不定时的向堆内存中清理不可达(没有被程序引用)的对象

2、finalize方法:该类是object类的方法,java虚拟机在垃圾回收之前会先调用垃圾对象的finalize方法。(因为垃圾回收机制只负责回收内存,并不负责资源的回收,资源回收要由程序员完成,java虚拟机在垃圾回收之前先调用垃圾对象的finalize方法用于使对象释放资源如关闭连接、关闭文件,之后才进行垃圾回收,该方法一般不会显示的调用,在垃圾回收时垃圾回收器会主动调用)。

3、final finalize finally区别:

      final:用于修饰类、成员变量和成员方法。final修饰的类不能被继承,其中所有的方法都不能被重写所以不能同时使用abstract(抽象类是用于被子类继承的和final起相反的作用)和final修饰类。final修饰的方法不能被重写,但是子类可以使用父类(父类没有使用final修饰)中final修饰的方法。final修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被修改,如果成员变量时引用类型,那么他只能指向初始化指向的那个对象,不能再指向其他的对象,但是对象中的内容是允许改变的。

4、object类方法复习:

       void clone()、boolean equals(Object)、void finalize()、Class<?> getClass、int hashCode()、void notify()、notifyAll()、String toString()、void wait()。具体详细信息参见博客:https://blog.csdn.net/u013894427/article/details/53468038

二、内存泄露和内存溢出

1、内存溢出:运行一个应用程序需要4g内存,项目只支持3g内存 溢出

2、内存泄露:程序中定义很多静态变量,但是垃圾回收机制不会进行回收,这个对象没有被引用,再次申请内存,会报错泄露。

三、垃圾回收机制算法

1、引用计数法:堆内存中做标记,默认15次,gc线程判断如果该对象不可达减一,可达加一,为0时gc直接回收。

2、复制算法:主要使用在堆内存的新生代区。新创建的对象user会先存放在eden区,如果被频繁引用的话会被放置s0或者s1区,再创建一个新的频繁引用的对象user2会从eden区到s0区并不会到s1区,gc发现user已经不再频繁使用会先将user2复制到s1区再将s0区的user清理,如果又有新的频繁引用的对象user3会从eden区到s1区。

3、标记清除:(老年代)有碎片化。

4、标记压缩:(老年代)连续没有碎片化。他会将没有引用的对象进行排序,连续删除

5、分代算法:新生代,老年代算法。

四、垃圾收集器

1、介绍:Java垃圾回收器是Java虚拟机(JVM)的三个重要模块(另外两个是解释器和多线程机制)之一,为应用程序提供内存的自动分配(Memory Allocation)、自动回收(Garbage Collect)功能,这两个操作都发生在Java堆上(一段内存快)。某一个时点,一个对象如果有一个以上的引用(Rreference)指向它,那么该对象就为活着的(Live),否则死亡(Dead),视为垃圾,可被垃圾回收器回收再利用。垃圾回收操作需要消耗CPU、线程、时间等资源,所以容易理解的是垃圾回收操作不是实时的发生(对象死亡马上释放),当内存消耗完或者是达到某一个指标(Threshold,使用内存占总内存的比列,比如0.75)时,触发垃圾回收操作。有一个对象死亡的例外,java.lang.Thread类型的对象即使没有引用,只要线程还在运行,就不会被回收。

2、分类:

串行回收器(Serial Collector):单线程执行回收操作,回收期间暂停所有应用线程的执行,client模式下的默认回收器,通过-XX:+UseSerialGC命令行可选项强制指定。参数可以设置使用新生代串行和老年代串行回收器。

并行回收器(ParNew回收器):并行回收器在串行回收器基础上做了改进,他可以使用多个线程同时进行垃圾回收,对于计算能力强的计算机而言,可以有效的缩短垃圾回收所需的尖际时间。ParNew回收器是一个工作在新生代的垃圾收集器,他只是简单的将串行回收器多线程快他的回收策略和算法和串行回收器一样。使用XX:+UseParNewGC 新生代ParNew回收器,老年代则使用市行回收器ParNew回收器工作时的线程数量可以使用XX:ParaleiGCThreads参数指定,一般最好和计算机的CPU相当,避免过多的栽程影响性能。

并行回收集器(ParallelGC):老年代ParallelOldGC回收器也是一种多线程的回收器,和新生代的ParallelGC回收器一样,也是一种关往吞吐量的回收器,他使用了标记压缩算法进行实现。

-XX:+UseParallelOldGC 进行设置

-XX:+ParallelCThread也可以设置垃圾收集时的线程教量。

 

五、Tomcat配置调优测试

1、测试工具Jmeter使用

1):打开

2):新建线程组

3):新建Http请求

4):聚合报告

2、Tomcat参数调优

1、参数设定:

测试串行吞吐量:

-XX:+PrintGCDetails -Xmx32M -Xms32M

-XX:+HeapDumpOnOutOfMemoryError

-XX:+UseSerialGC

-XX:PermSize=32M

项目启动GC回收6次 吞吐390

扩大堆的内存:

-XX:+PrintGCDetails -Xmx512M –Xms32M

-XX:+HeapDumpOnOutOfMemoryError

-XX:+UseSerialGC

-XX:PermSize=32M

GC回收6次  445

结论 最大内存越大,吞吐量越高。

调整初始堆:

-XX:+PrintGCDetails -Xmx512M –Xms512M

-XX:+HeapDumpOnOutOfMemoryError

-XX:+UseSerialGC

-XX:PermSize=32M

GC回收0次  492

并行回收UseParNewGC):

-XX:+PrintGCDetails -Xmx512M –Xms512M

-XX:+HeapDumpOnOutOfMemoryError

-XX:+UseParNewGC

-XX:PermSize=32M

GC回收0次 吞吐量452

并行合并回收UseParallelGC

-XX:+PrintGCDetails -Xmx512M -Xms256M

-XX:+HeapDumpOnOutOfMemoryError

-XX:+UseParallelGC

-XX:+UseParallelOldGC

-XX:ParallelGCThreads=8

-XX:PermSize=32M

3、Tomcat调优总结

初始堆值和最大堆内存内存越大,吞吐量就越高。

最好使用并行收集器,因为并行手机器速度比串行吞吐量高,速度快。

设置堆内存新生代的比例和老年代的比例最好为1:2或者1:3。

减少GC对老年代的回收。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐