jvm笔记
方法区:存放类信息,常量,static变量,字节码,类加载器
方法区和堆为线程共享,其余为线程私有
运行时常量池:字段,方法,接口等描述信息
对象的创建
指针碰撞和空闲列表,都有并发问题,可以通过同步或TLAB,每个线程都分块地方,各自忙自己的
对象头
存储哈希码,gc年龄,锁标记
不同的锁标志位,会导致32bit的数据展示的不一样,对象的hashcode在其他锁状态没有是因为存到其他地方了
创建对象
创建对象有直接指针和句柄两种
句柄
句柄好处是比较规整,当数据移动后改个指针地址就可以了
直接指针
直接指针少了一些性能开销,但是直接操作堆内存,增加了一层风险
垃圾收集
哪些内存要回收,什么时候回收,怎么回收
引用计数法,可达性分析法
GCRoot:类变量,常量,锁对象,局部变量,类加载器,代码缓存
强软弱虚:
强,引用关系存在就不会回收,甚至报错也不清除。
软,要发生内存问题就回收,用SoftReference创建。
弱,下次垃圾回收就回收掉,WeakReference创建
虚,多一个标记,最弱的引用关系
回收方法区
所有实例都被回收
对应的类加载器被回收
无法反射获取
垃圾收集算法
强分代:越从垃圾收集下活下来,越难被回收
弱分代:大部分对象朝生夕灭,都是没
跨引代:跨代引用相对于同代引用来说仅占极少数
记忆集:将老年代存在跨代引用的加入记忆集,垃圾回收找记忆集,不用再遍历老年代。减少性能开销
标记清除算法
遍历对象,标记活下来的对象,删除其余对象。
碎片化问题,如果标记“该死”对象,性能消耗大
标记复制算法
内存分一半,只操作一半内存的数据,标记活下来的放到另一半内存,原先内存数据全部删除
内存使用效率低,简单
优化:修改比例,两个存活的区域和新生区域1:1:8
标记整理算法
标记活着的,统一放到一块地方,删除其他的。
如果对象存活的多,总是移来移去,“拖家带口”性能消耗大