Java GC 监控, jstat

java gc监控, jstat jstat -<option> [-t] [-h] <vmid> [<interval> [<count>]] jstat -gc -h3 <jvm PID> 3000 -1 # -gc 显示gc的信息,查看gc的次数,及时间。 # -h: 即-h跟数字,代表隔几行显示标题 # interval: 毫秒,代表监控间隔时间段,默认毫秒做单位 # count: 代表取数次数 Jstat在分析java的内存GC时的应用 jstat可以查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。 参数: jstat -class pid: Statistics on the behavior of the class loader. 显示加载class的数量,及所占空间等信息; jstat -compiler pid: Statistics of the behavior of the HotSpot Just-in-Time compiler.显示VM实时编译的数量等信息; jstat -gc pid: Statistics of the behavior of the garbage collected heap.可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。 jstat -gccapacity:可以显示,VM内存中三代 (young,old,perm) 对象的使用和占用大小,如: PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。 ...

Created 9096-08-09 · Updated 9096-10-09 · 2 min · 353 words · -

Java 强引用, 软引用, 弱引用, 虚引用

Java 强引用, 软引用, 弱引用, 虚引用 强引用 StrongReference 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。 Object o=new Object(); // 强引用 如果不使用时,要通过如下方式来弱化引用,如下: o=null; // 帮助垃圾收集器回收此对象 显式地设置o为null,或超出对象的生命周期范围,则gc认为该对象不存在引用,这时就可以回收这个对象。具体什么时候收集这要取决于gc的算法。 在一个方法的内部有一个强引用,这个引用保存在栈中,而真正的引用内容 (Object) 保存在堆中。当这个方法运行完成后就会退出方法栈,则引用内容的引用不存在,这个Object会被回收。 但是如果这个o是全局的变量时,就需要在不用这个对象时赋值为null,因为强引用不会被垃圾回收。 强引用在实际中有非常重要的用处,举个ArrayList的实现源代码: private transient Object[] elementData; public void clear() { modCount++; // Let gc do its work for (int i = 0; i < size; i++) elementData[i] = null; size = 0; } 在ArrayList类中定义了一个私有的变量elementData数组,在调用方法清空数组时可以看到为每个数组内容赋值为null。不同于elementData=null,强引用仍然存在,避免在后续调用 add()等方法添加元素时进行重新的内存分配。使用如clear()方法中释放内存的方法对数组中存放的引用类型特别适用,这样就可以及时释放内存。 软引用 SoftReference 如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 它兼有了StrongReference和WeakReference的好处,既能停留在内存中,又能在内存不足时去处理。 String str=new String("abc"); // 强引用 SoftReference<String> softRef=new SoftReference<String>(str); // 软引用 虚引用 PhantomReference ...

Created 17176-11-17 · Updated 9096-10-09 · 1 min · 143 words · -

2026 W29

从 HashMap 关联到的 上周说面试复盘整理了一部分,这周继续。blog 里 Java 相关的文档以前记得有些零散,重新整理一下。 HashMap 关联的东西其实挺多的… 先是解决哈希冲突主要的两条路:开链法和开放地址法。链表长到一定程度会转成红黑树,于是又去看了红黑树。哈希值怎么来的又牵出随机数——xorshift、LCG。再往下是 CPU 层面的事:加法/乘法/除法消耗的时钟周期不一样,缓存的空间局部性会直接影响这类数据结构的实际性能。横向看,Python 的 dict、Go 的 map 用的 Swiss Table,思路各不相同。 Swiss Table 这条又牵出 SIMD,还挺有意思的。1997 年的 Pentium MMX 就带了 MMX 指令集,不过只能做整数;AMD 1998 年 K6-2 上的 3DNow! 把单精度浮点加了进来;到 1999 年 Pentium III 的 SSE,才有了独立的 128 位寄存器。早年这套指令主要是拿来做多媒体和图形的。 而 Swiss Table 用 SIMD 一次比对一组控制字节来定位槽位,Go 的 map 后来换成了这个结构——中间隔了二十多年。一个 90 年代末为了跑多媒体加进来的特性,现在被用来加速哈希表的查找。 JVM 这边也一并整理了:HotSpot 的 GC 和 JIT。中间还跑偏去看了下 Linux 的进程调度。 starlabrys:把公司的壳先搭起来 和朋友聊天,有人找到了工作但不太理想,有人还在面试。我之前注册了营业执照,就在想我们是不是可以一起做点什么。 有人建议建一个 GitHub organization,这样想贡献代码的人可以加进来。公司暂时没业务,但有件事是现在就能做的——把官网建起来。 于是注册了域名 starlabrys.com,建了 GitHub org,把仓库和权限用 OpenTofu 管起来,后来又把这部分 IaC 从我自己的配置仓库拆出去,单独放进了 starlabrys-infra。 ...

Created 19196-07-19 · Updated 19196-07-19 · 1 min · 126 words · -

Java GC

分代模型 名词解释 在 GC 的世界里,对象指的是通过应用程序利用的数据的集合,是 GC 的基本单位,一般由头(header)和域(field)构成。 活动对象:能通过引用程序引用的对象,即可以直接或间接从全局变量空间中引出的对象 非活动对象:不能通过程序引用的对象,即被清除的目标 垃圾(Garbage):系统运行过程中产生的无用对象,这些对象占据一定的内存空间,如果长期不被释放,可能导致 OOM 垃圾收集器(Garbage Collector):负责回收垃圾对象的组件 垃圾回收(Garbage Collect):垃圾收集器工作时对垃圾进行回收的动作 新生代(Young Generation) 所有新生成的对象首先都放在新生代,新生代的目标是尽可能快速地收集掉那些生命周期短的对象。 新生代内存按照 8:1:1 的比例分为一个 Eden 区和两个 Survivor 区(Survivor0、Survivor1)。大部分对象在 Eden 区中生成。回收时先将 Eden 区存活对象复制到 Survivor0 区,然后清空 Eden 区;当 Survivor0 区也存放满时,则将 Eden 区和 Survivor0 区的存活对象复制到 Survivor1 区,然后清空 Eden 区和 Survivor0 区,此时 Survivor0 区为空,再将 Survivor0 区和 Survivor1 区角色互换,如此往复。 当 Survivor1 区不足以存放 Eden 区和 Survivor0 区的存活对象时,就将存活对象直接存放到老年代。若老年代也满了,就会触发一次 Full GC,即新生代、老年代都进行回收。 新生代发生的 GC 也叫 Minor GC,发生频率比较高(不一定要等 Eden 区满了才触发)。 老年代(Tenured Gen,Old Generation) 在新生代中经历了 N 次垃圾回收后仍然存活的对象,会被放到老年代中,因此老年代中存放的都是生命周期较长的对象。 老年代内存比新生代大很多(大概比例是 1:2),当老年代内存满时触发 Major GC 即 Full GC。Full GC 发生频率比较低,因为老年代对象存活时间长、存活率高。 持久代(Permanent Generation)与 Metaspace 持久代用于存放静态文件,如 Java 类、方法等。持久代对垃圾回收没有显著影响,但有些应用可能动态生成或调用一些 class(例如 Hibernate),这种情况下需要设置一个比较大的持久代空间来存放运行过程中新增的类。 ...

Created 4046-06-04 · Updated 14146-07-14 · 7 min · 1293 words · -