jvm内存一条线路

入手从collection开始

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
集合常用 arrayList 底层数据结构 object[]  
数组特点
内存连续 数据挨个存放 那么删除中间一个时候 后面的数据会挨个往前挪移
因为地址可知 查询节点数据 较快 通过下标获取
应对业务场景 插入后查询修改数据 如果执行删除操作会造成资源浪费 需要时间重新规划数组结构

linkedList 底层数据结构链表
链表特点
内存不连续
代码 node first、 last; object;存放前后节点hash值【待查询】 然后跟节点对象
该链表实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。
应对业务场景
插入后 可能会删除某项数据 以作数据调整

{----------}

hashMap
内存结构是hash散列 【我理解为 散着放的列表】
内存特点
hash值分桶存储【其实就一一小块内存】 当hash值冲突 会在该桶内维护一个链表

警告:暂时不晓得这个桶有多大 所以尽量避免hash冲突 万一桶满了是不是要重新规划内存 造成资源浪费?

linkedHashMap
内存特点 与hashMap一致
不同点 linkedHashMap 额外维护了一个双重链表来记录数据插入的顺序性
那么相比较hashMap 多了一个链表要维护 性能要有所下降 【业务需要 没办法】

treeMap
内存结构 红黑二叉树
内存特点:位置 对于二叉树还没搞明白 只晓得父红子黑【还不知道对不对】

说到数据内存 就要讲讲内存结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
jvm内存分为五大块【程序计数器、虚拟机栈、本地方法栈、方法区、堆】

从线程是否共享分起: 线程共享:堆、方法区/非线程共享:程序计数器、虚拟机栈、本地方法栈

简单说下存储信息
1、程序计数器 用于存放下一条指令所在单元的地址的地方 【c与java的交界点用以存放执行指针】
2、虚拟机栈 【为java方法提供服务】
3、本地方法栈【为jvm提供使用native方法服务】
4、方法区 【存储类常量、静态变量等信息】
5、堆 【存放对象实例、对象成员变量】

对于一个obj:
类引用--stack中
类成员变量--Heap中【回收主要地方】
类静态变量、常量--Method Area中
类方法--以帧栈形式保存到栈中

那么内存存储规划完 就得看看 内存的回收机制

1
2
3
4
5
随便一查 就能查到 四种算法:标记清除、标记整理、复制、分代收集

那么实现这些算法的回收器:仔细查查有六种 :
Serial收集器【串行】、parNew收集器【并行】、Parallel Scavenge收集器 【并行】
Serial Old收集器 【串行】、Parallel Old 收集器 【并行】、cms收集器

差不多 回收完成

然后就是 jvm的执行优化

1
优化方向 对回收进行控制【减小回收频率】 设定堆栈大小、新生代老年代大小等等、很多很多

那么总结完成之后这一条内存线路就算差不多了 算一条知识线路

貌似还没有 创建….[尴尬笑]