Tim's Track

书写是为了更好地思考


  • 首页

  • 关于

  • 归档

  • 标签

  • 搜索

虚拟机类加载机制

发表于 2017-09-19 | 分类于 jvm | 阅读次数
字数统计 7,630 | 阅读时长 27

概述

虚拟机的类加载机制:虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型。

与那些在编译时需要进行连接工作的语言不同,在 Java 语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,

  • 缺点:这种策略会令类加载时稍微增加一些性能开销
  • 优点:为 Java 应用程序提供高度的灵活性,Java 里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。
    • 例如,如果编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类;

约定:

  • 第一,在实际情况中,后文中直接对「类」的描述都包括了类和接口的可能性,而对于类和接口需要分开描述的场景会特别指明;
  • 第二,「Class 文件」并非特指某个存在于具体磁盘中的文件,这里所说的「Class 文件」应当是一串二进制的字节流,无论以何种形式存在都可以。
阅读全文 »

Java 集合框架之 LinkedHashMap 工作原理

发表于 2017-09-17 | 分类于 集合框架 | 阅读次数
字数统计 1,771 | 阅读时长 7
一、不同类型 Map 的适用场景 如果不关心 Map 中的 key 顺序,只是希望能够以 O(1) 的时间复杂度执行插入和查找操作。那么可以选择HashMap; 如果要求 key 有序,则选择TreeMap。 但是选择 TreeMap 就会有性能问题,因为 TreeMap 的 get 操作的时间 ...
阅读全文 »

Java 内存模型与线程浅析

发表于 2017-09-14 | 分类于 jvm , 并发 | 阅读次数
字数统计 8,140 | 阅读时长 29

硬件的效率与一致性

多级缓存的作用:由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以为了提高处理器的利用率,现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存(Cache)来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待缓慢的内存读写了。

缓存虽然解决了速度差,但是也引入了新问题——缓存与主内存的数据一致性(Cache Coherence)

阅读全文 »

Java 线程安全与锁优化

发表于 2017-09-11 | 分类于 并发 , JVM | 阅读次数
字数统计 6,692 | 阅读时长 24

1.线程安全

当我们谈线程安全的时候,我们谈些什么?

先看看「线程安全」的定义:

当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象是线程安全的。

1.1 Java 语言中的线程安全

可将 Java 语言中的各种操作共享的数据分为以下 5 类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。

阅读全文 »

Java 集合框架之 HashMap 工作原理

发表于 2017-09-10 | 分类于 java集合框架 , 原理分析 | 阅读次数
字数统计 5,160 | 阅读时长 21

概要

概括的说,HashMap 是一个关联数组、哈希表,它是线程不安全的,允许key 为 null,value 为 null。遍历时无序。
其底层数据结构是数组称之为哈希桶,每个桶里面放的是链表,链表中的每个节点,就是哈希表中的每个元素。
在 JDK8 中,当链表长度达到 8,会转化成红黑树,以提升它的查询、插入效率,它实现了Map<K,V>, Cloneable, Serializable接口。

因其底层哈希桶的数据结构是数组,所以也会涉及到扩容的问题。

当HashMap的容量达到threshold域值时,就会触发扩容。扩容前后,哈希桶的长度一定会是 2 的次方。
这样在根据 key 的 hash 值寻找对应的哈希桶时,可以用位运算替代取余操作,更加高效。

而 key 的 hash 值,并不仅仅只是 key 对象的hashCode()方法的返回值,还会经过扰动函数的扰动,以使 hash 值更加均衡。
因为hashCode()是int类型,取值范围是 40 多亿,只要哈希函数映射的比较均匀松散,碰撞几率是很小的。

阅读全文 »

JVM 垃圾收集器与内存分配策略

发表于 2017-09-08 | 分类于 jvm | 阅读次数
字数统计 10,724 | 阅读时长 38

确定回收的对象

「死去」的对象即不可能再被任何途径使用的对象。

几乎所有对象的实例都存在堆中。(部分 String 对象存在于字符串常量池中,JDK1.7 以前,字符串常量池存放在方法区中)。

进行回收的第一步就是确定哪些对象还活着,哪些已经死亡。

阅读全文 »

JVM 运行时数据区域与对象创建布局

发表于 2017-09-07 | 分类于 jvm | 阅读次数
字数统计 4,792 | 阅读时长 17

java 运行时数据区域

根据《Java 虚拟机规范》规定,Java 虚拟机锁管理的内存包含以下以下几个运行时数据区域,如下图所示:
java runtime memory

阅读全文 »

Java 集合框架之 ArrayList

发表于 2017-09-06 | 分类于 java集合框架 , 原理分析 | 阅读次数
字数统计 3,211 | 阅读时长 13

概要

ArrayList 是一个动态数组,它是线程不安全的,允许元素为 null。它的底层数据结构是数组,ArrayList 实现了 List<E>, RandomAccess, Cloneable, java.io.Serializable 接口,其中 RandomAccess 代表了其拥有随机快速访问的能力,ArrayList 可以以 O(1) 的时间复杂度去根据下标访问元素。

时间、空间效率

因为数组内存的连续,可以根据下标以 O1 的时间改查元素,因此时间效率很高

同样也因为数组要占据一块连续的内存空间,所以它也有数组的缺点——空间效率不高。

阅读全文 »
1…3456
Tim Lin

Tim Lin

Live a life you will remember.

46 日志
31 分类
28 标签
GitHub
© 2020 Tim Lin
由 Hexo 强力驱动
主题 - NexT.Pisces
0%