JVM(下)

持久代:不会被 gc 给轻易回收的,创建后一直存在,持久代在非堆里面。持久代是非堆里面的,动态 load 的那些 class

1.8 之前是 Perm Gen之后 ,1.8 之后 ,非堆就变成了 mate space,叫元组区,就放 load 的那些 class。mate space用的是本地内存,1.8之前用的是虚拟内存。

# jstat -gcutil 17720
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  14.74  65.26  61.44  98.03  95.33    539   96.791    16    3.201   99.992

 非堆里面是栈,栈区控制的是,线程进栈出栈,控制方法的创建、运行和退出的。管调度。

jvm关注俩:堆和栈,堆里面关注 gc 的情况,栈里面关注栈的运行状态。

分代收集的好处?为啥要分什么年轻代,老年代。不分代当然是 ok 的,但是效果不好。不分代,全放一块,满了一块之后 full gc 时间太长。其实我们可以理解成, young gc 时间短,频率高, full gc 时间长。如果每次都全部堆满了再去一次性执行 full gc ,那么一次 full gc 的耗时肯定是巨长的,如果我在不用 full gc 的情况下,去进行 一些频率较高的 young gc ,某种意义程度上会增加 gc 的效率。三年不开张,开张吃三年;和细水长流的一个区别。

分析堆内存的 jmap -histo pid号,找前20开发写的方法或者类

为啥要 jmap -dump?或者说有啥好处?在 我们的 jmap -histo 分析不到,那么我们可以去 jmap -dump 把内存dump 下来,用jhat 或者 mat 分析,但是建议用 mat 去分析。核心的作用还是分析堆内存的。

线程栈是什么?线程堆栈也称线程调用堆栈,是虚拟机中线程(包括锁)状态的一个瞬间状态的快照,即系统在某一个时刻所有线程的运行状态,包括每一个线程的调用堆栈,锁的持有情况。

分析线程栈,能分析到什么?分析线程死锁以及其产生原因。

线程死锁怎么分析?看线程状态有没有 blocked /  monitor 。死锁的原因,看 waiting to lock 什么,有的是锁数据库连接池,所以有可能是数据库连接池有问题

猜你喜欢

转载自www.cnblogs.com/xiaowenshu/p/10236282.html