JVM
深入理解JVM的内部组成以及运行原理
mischen520
JAVA高级架构师
展开
-
对象不可达,一定会被垃圾收集器回收么?
即使不可达,对象也不一定会被垃圾收集器回收,1)先判断对象是否有必要执行 finalize()方法,对象必须重写 finalize()方法且没有被运行过。2)若有必要执行,会把对象放到一个队列中,JVM 会开一个线程去回收它们,这是对象最后一次可以逃逸清理的机会。 ...原创 2021-11-13 08:07:22 · 542 阅读 · 0 评论 -
真实项目中如何排查jvm问题
对于还在正常运行的系统: 1.可以使用jmap来查看jvm中各个区域的使用情况 2.可以通过使用jstack来查看线程的运行情况,比如哪些线程阻塞、是否出现了死锁 3.可以通过jstat命令来查看垃圾回收的情况,特别是fullgc,如果发现fullgc比较频繁,那么就得进行调优了 4.通过各个命令的结果,或者jvisualvm等工具来进行分析 5.首先,初步猜测频繁发送fullgc的原因,如果频繁发生fullgc但是又一直没有出现内存溢出,那么表示fullgc实际上是回收了很多对象了,所以这些对象最好能在y原创 2021-10-14 07:00:46 · 694 阅读 · 0 评论 -
GC如何判断对象可以被回收
引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收 可达性分析法:从 GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GCRoots没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就判断是可回收对象。 引用计数法,可能会出现A引用了 B,B又引用了 A,这时候就算他们都不再使用了,但因为相互引用计数器=1永远无法被回收。 GC Roots的对象有: 虚拟机栈(栈帧中的本地变量表)中引用的对象 方法区中类静态属性引用的对象 方原创 2021-10-01 07:22:31 · 161 阅读 · 0 评论 -
java如何判断一个对象是否存活?(GC回收的依据)
判断一个对象是否存活有2种方法: 1.引用计数法 所谓引用计数法其实就是给每一个对象设置一个引用计数器,每当有一个地方引用这个对象时,就将计数器+1,引用失效时,就将计数器-1.当一个对象的引用计数器为0时,说明此对象没有被引用,也就是“死对象”,将会被垃圾回收。 引用计算法有一个缺陷就是无法解决循环引用问题,也就是说当对象A引用B,对象B又引用A,那么此时A、B对象的引用计数器都不为0,也就造成无法完成垃圾回收,所以主流的虚拟机都没有采用这种算法。 2.可达性算法(引用链法)...原创 2021-04-06 23:31:45 · 725 阅读 · 0 评论