java内存

内存申请和内存使用是一回事吗?
内存申请是对应参数overcommit,使用是对应avalable。sysctl -a 里面overcommit的参数,2表示申请以后哪怕你不用,别人也不能用。一般用0,表示你申请了,但是没用,那么别人可以抢过来用。


类加载过程会有死锁吗?
有,类加载、初始化调用cinit方法的时候,会加锁(通过引用static保证单例就是因为有初始化类锁的存在),如果对类A加锁后,又去初始化另一个类B,而这个类B的初始化也会引起类A的初始化,那么有可能导致死锁。

最常见的触发类加载的方式包括:static引用(如果有final修饰那么不触发)、new实例。引用子类,会触发对父类的初始化。如果类A里面有其他类B的static引用,也会在初始化A的时候也会对B进行初始化


是不是一定是内存不够用才gc?
不是,有时候内存碎片也会导致full-gc。由于老年代不像新生代使用复制算法回收,所以存在碎片可能。


如何定位java代码引用的动态内存?
通过perftools找出底层方法申请的内存大小,再把底层方法和对应的java方法找到,最后通过bttrace跟踪这个方法栈

posted @ 2018-12-23 17:23  notlate  阅读(149)  评论(0编辑  收藏  举报