介绍一下jvm堆内存的结构
有新生代和老年代组成,而新生代有分为Eden、from、to
,新生代比例8:1:1
jvm新生代中的Suvivor区为什么要有from跟to,作用是干嘛的,互换的好处
标记复制,标记from
存活,然后把存活的移到to
区,清除未存活,最后把to
重新移会from
优点:回收效率高,不会产生内存碎片
讲一个垃圾回收算法的原理
主要是引用计数法的GC
和可达性分析法的GC
引用计数:新的引用指向该对象就+1
,如果该引用被置空或引用其他对象就-1
,为0
就回收
可达性分析:沿着GC root
(引用链)找,找不到就回收
阐述一下HashMap的数据结构
JDK1.8
之前是数组+链表
1.8
之后是数组+链表/红黑树,但数组容量到64
,并且链表长度到达8
,就会转红黑树
HashMap是线程安全的吗?有什么线程安全的Map
HashMap
线程不安全,HashTable
线程安全,ConcurrentHashMap
线程安全
ConcurrentHashMap如何实现的线程安全
1.8
之前是底层数据结构是segment
大数组+hashEntry
小数组+链表,实现线程安全主要靠synchronize
关键字,1.8之后底层数据结构数组+链表/红黑树,使用CAS(compare and swap)
比较与交换实现线程安全
synchronized是如何实现线程安全的
给对象加锁,防止其他线程访问共享资源,进而保证临界区内的变量在多线程下的安全,原理是使用flag
标记acc-synchronized
,线程执行先持有同步锁,然后再执行方法,最后释放锁