hang.li Blog

「离开世界之前 一切都是过程」

判断对象是否存活算法

引用计数算法 对象每当被引用一次在其头部计数器加一,引用失效,头部减一,计数器为0时代表该对象没有任何引用,视为垃圾。 缺点:无法解决循环引用问题。 可达性分析(java使用) 通过GC Roots沿引用开始搜索,没有被扫描到的即视为垃圾。 GC时常说的标记过程就是应用可达性分析算法进行标记;注,标记标记到的都是存活的对象。 java中的GC Root...

创建对象时的内存分配算法

判断空闲内存 根据内存是否规整使用不同的方法 内存规整:指针碰撞 在空闲区域,按照分配顺序一个接着一个往后排。常用于自带内存整理的垃圾收集器。 内存不规整:空闲列表 虚拟机会维护一个空闲内存列表,会把对象分配到空闲的内存上。 空闲列表的优化 在CMS的实现里面,为了能在多数情况下分配得更快,设计了一个叫作Linear Allocation Buffer的分配缓冲区,通过空闲列表拿到一大块分配...

synchronized锁

锁升级过程 无锁状态 偏向锁: 一旦有线程对该对象加锁,markword区前54位指向当前线程指针 自旋锁(无锁,轻量级): CAS一旦有多个线程竞争锁,在每个线程栈帧内生成Lock Record, 前62位保存拿到当前执行权限的线程的Lock Record Lock Record中保存之前对象头中被替换掉的内容 重量级: 自旋10次,升级为重量级锁, 其他线程不再自旋,进...

java中的引用类型

强引用(strong references) 如果有该引用关系,gc就不会回收该对象. 常见的赋值操作都是强引用 软引用(soft reference) 当内存不足时,会打破该引用,将对象回收 可用于缓存 弱引用(weak reference) 下次gc时就会打破该引用,将对象回收 虚引用(phantom reference) ...

object在内存

测试代码 引入maven环境 1 2 3 4 5 <dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>...

java运行时数据区内存

程序计数器 每一个线程独享一个程序计数器,在运行时数据区唯一不会发生内存溢出的区域。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地 址;如果正在执行的是本地(Native)方法,这个计数器值则应为空(Undefined)。 虚拟机栈 每一个线程独占一个虚拟机栈。每当一个线程执行,jvm都会创建一个对应的栈帧。 1)...

java自动装箱,拆箱

装箱: 在操作数栈顶压入常量值5 调用Integer.valueOf的静态方法,得到Integer的对象到操作数栈顶 将操作数栈顶赋给局部变量表的1号位置(因为是静态方法,局部变量表不存在this,所以形参args占0号位,i占1号位) 拆箱: 将刚才生成1号位的i对象压入操作数栈 调用对象i的intValue方法得到常量放在操作数栈顶 将操作数栈顶的值赋值给...

HashMap关键方法

1. 类介绍 官方api地址 该类是基于哈希表对Map接口进行的实现。该实现提供了所有可重写的map操作,并允许null值和null键。(HashMap与Hashtable大致相同,区别是Hashtable是同步的,并且Hashtable的key和value都不允许为null。)这个类不能保证map的顺序;不同时间相同的键值对也可能顺序不一样。 2.成员变量含义 1 2 3 4 5 6 7...

HashMap中树的相关操作

1.数据模型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 /** * hashMap超长时的数据模型,红黑树 * 并且在树中维护了一个潜在的双向链表(原链表的关系) */ static final class TreeNode<K,V> extends LinkedHashMap.Entry<K,V>...

ClassPathXmlApplicationContext加载过程

ClassPathXmlApplicationContext创建过程 调用父类中的方法创建一个上下文对象 1 org.springframework.context.support.AbstractApplicationContext#AbstractApplicationContext(org.springframework.context.ApplicationContext...