performance

performance…

内存溢出和内存泄漏的区别

内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory;比如申请了一个 integer,但给它存了 long 才能存下的数,那就是内存溢出。

内存泄露是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。

内存溢出和内存泄漏都是 Java 应用程序中常见的问题,但它们之间有所不同。

内存溢出指的是当应用程序需要分配更多内存空间时,但无法分配到足够的空间,导致程序抛出 Out of Memory 异常。这通常是由于应用程序中存在大量占用内存的对象,或者内存泄漏导致的。

而内存泄漏则是指应用程序中的对象已经不再使用,但占用的内存空间没有被垃圾回收器回收。这可能是由于对象被错误地持有,或者应用程序中存在循环引用导致的。随着时间的推移,内存泄漏会导致应用程序占用越来越多的内存空间,最终导致内存溢出。

当 Java 线程在处理请求时,抛出了 OOM 异常,整个进程还能处理请求吗?

内存溢出的情况,当 GC 的速度跟不上内存的分配时,会发生 OOM, 从而将那个线程 Kill 掉,在这种情况下,进程一般还能继续处理请求。
内存泄漏的情况,由于这些内存不能被回收掉,会发生 OOM,从而将那个线程 Kill 掉,防止继续创建不能被回收的对象,此时有些不占用内存的线程可能将继续执行,而那些会占用大量内存的线程可能将无法执行,最坏的情况可能是进程直接挂掉。

qps 和 tps

  1. tps

Transactions Per Second,意思是每秒事务数。一个事务是指客户端向服务器发送请求然后服务器做出反应的过程,具体的事务定义,可以是一个接口、多个接口、一个业务流程等等。以单接口定义为事务举例,每个事务包括了如下 3 个过程:

(1)向服务器发请求
(2)服务器自己的内部处理(包含应用服务器、数据库服务器等)
(3)服务器返回结果给客户端
如果每秒能够完成 N 次以上 3 个过程,TPS 就是 N。

TPS 是软件测试结果的测量单位。我们在进行服务性能压测时,接口层面最常关注的是最大 TPS 以及接口响应时间,个人理解 TPS 可以指一组逻辑相关的请求,而服务整体处理能力取决于处理能力最低模块的 TPS 值。

  1. qps

Queries Per Second,意思是每秒查询率。指一台服务器每秒能够响应的查询次数,用于衡量特定的查询服务器在规定时间内所处理流量多少,主要针对专门用于查询的服务器的性能指标

(1)如果是对一个查询接口压测,且这个接口内部不会再去请求其它接口,那么 TPS = QPS,否则,TPS ≠ QPS

(2)如果是容量场景,假设 N 个接口都是查询接口,且这个接口内部不会再去请求其它接口,QPS = N * TPS