当垃圾收集事件运行时,它会在Java应用层花费大量时间。它还在操作系统/内核层花费一定的时间。
“用户”时间:
垃圾收集器在 Java 应用程序层花费的时间称为“用户”时间。以下是“用户”时间的原因:
1.垃圾收集器必须标记所有对象并识别具有活动引用的对象。
2.它必须驱逐内存中未引用的对象。
“系统”时间:
垃圾收集器在操作系统/内核层花费的时间称为“系统”时间。以下是“系统”时间的原因:
1.当需要内存时,应用程序会向操作系统请求额外的内存。将内存分配给JVM需要一些时间。一旦内存压力消失,JVM会将内存交还给操作系统。这种解除分配也需要时间。
2.JVM有时可能会请求大页面(比如2mb大小/页面)。如果操作系统无法找到连续的空闲空间来分配2mb页面,那么它将停止所有正在运行的进程,并开始移动数据以找到连续的空闲空间。这需要时间。
3.JVM在/tmp/hsperfdata_(用户名)文件。当GC事件运行时,该文件得到更新。当有大量磁盘I/O时,linux内核线程偶尔会阻止GC线程更新该文件。因此,大量的磁盘I/O活动会增加“系统”时间。
4.由于内存不足,操作系统可能会将您的应用程序换入和换出内存。该交换时间将被报告为“系统”时间。
5.有时,操作系统中可能存在某些问题(如系统故障、内存引用错位、浮点异常),在这种情况下,垃圾收集器将不得不在操作系统/内核层花费更多时间。
CPU时间:
CPU时间是应用程序花费在垃圾收集上的总时间。它基本上是“用户”时间和“系统”时间的总和。