- 博客(12)
- 收藏
- 关注
原创 Java虚拟机垃圾回收机制
Java虚拟机垃圾回收机制Java虚拟机在运行过程中时刻监控虚拟机管理的内存使用情况,当发现内存不够用时或者某个适当时机,就对其所管理的内存中的不再使用的对象进行内存回收,以便有更多内存来支持程序的运行。虚拟机是如何判断内存中的对象是否还存活的呢?如何判断对象是否存活在Java堆内存里存放着几乎所有的对象,虚拟机在进行垃圾回收之前需要判断哪些对象是存活,哪些是已经死亡的(没有其它对象再引用它)。引用计数法给对象添加一个引用计数器,当有对象引用它时计数器加1,当某对象不再引用它时计数器减1.这种方
2021-09-21 14:47:56 443
原创 什么是归并排序?
什么是归并排序?“ 归并排序的思想是分治,先将原始数组分解成若干子数组,对子数组使用归并方法进行排序,最后合并子数组成原数组产生已经排序的数列**”**举个例子在桌面上有十三张扑克牌分成两组,一组6张,一组7张,两组都是按从小到大顺序排好的,并且牌面向上,两堆牌中最小的都在上面,现在要将两堆牌合成一堆,并且按顺序从小到大排列。对于这个问题,我们可以做的很自然,过程如下示意最初的两堆牌,如下,都是最上面的最小第一次抓取,将两堆牌上面对比,将小的牌也就是1,拿走,放入第三堆中,此时如下所示,这
2021-09-20 21:05:07 226
原创 Java虚拟机类对象分配
Java虚拟机对象分配对象的创建过程对象的内存分配当虚拟机遇到一个new指令时,需要为类型分配一个对象。这个过程需要经过以下步骤:类加载<–>检查类型是否加载–>分配内存–>内存空间初始化–>设置–>对象初始化类加载参考类加载:https://blog.csdn.net/kingbojin/article/details/120394951检查类是否加载对象分配执行到这一步时,会先通过定位一个类型的符号引用,检查该符号引用表示的类型是否经过了类加载的三个过
2021-09-20 20:28:25 132
原创 Java虚拟机类加载过程
类加载Java虚拟机规范中没有明确规定类加载在虚拟机执行的什么时刻,但是却明确规定了有几种情况下必需要执行类的加载new一个对象时,读取或者设置一个类型的静态字段时,调用类的静态方法时使用反射调用类的方法时子类初始化时如果遇到父类还没有初始化时虚拟机遇到一个定义了main方法的类时,会对其优先加载Java7和Java8中新添加的其它两种情况动态语言支持和default修饰的接口方法时上面这几种情况在虚拟机规范中被称为主动加载,除这几种情况外,其它没有其它的方式会触发类的加载。类加载过程分
2021-09-20 20:22:42 119
原创 Java虚拟机JVM的内存区域
JVM的内存区域JVM的运行时数据区域java虚拟机启动的时候会从物理内存中映射一块内存,纳入虚拟机的虚拟内存管理中,这块儿被 虚拟机管理的虚拟内存就是Java虚拟机的运行时数据区域。 而这块区域被 JVM划分为几个不同的区域来管理。这几个不同的区域分别是:方法区java堆java虚拟机栈本地方法栈程序计数器同时按照与线程的关系来分的话,又可以分为:线程私有区域 和 线程共享区域。对于线程私有区域来说,它独立拥有一份内存区域,这块区域其它线程是无法访问的。而对于共享内存区域:它对于所
2021-09-18 19:50:18 128
原创 Java 虚拟机启动
Java 虚拟机Java程序的执行我们编写的 *.java代码文件经过编译产生了对应的 *.class文件,.class文件经过JVM的加载,再由执行引擎翻译成机器可识别的机器码去执行执行过程:java文件 --> java编译器 --> 字节码 --> JVM --> 机器码JVM的启动参数运行一个java程序,在命令行中输入命令:jps: 显示当前运行在虚拟机上的进程,可以查看我们自己的程序的进程号:3272然后输入下面命令:该命令会打印当前进程运行的 虚拟机的
2021-09-17 23:04:42 913
原创 LinkedHashMap源码分析
LinkedHashMap源码分析概述该类继承了HashMap,所以它有HashMap的所有特性,在其内部以双向链表的形式维护数据,这样就维护了内部数据的有序性,即插入时的顺序就是迭代时的顺序。当设置了accessOrder访问模式时,对结构中的元素进行访问时,会始终将被访问的元素移动到链表的尾部,这种特性非常适合用于实现LRU绑在机制。成员变量// 双向链表的头部结点,也是最早添加到其内部的数据transient LinkedHashMapEntry<K,V> head;// 双
2021-09-02 22:55:54 123
原创 HashTable源码分析,线程安全的哈希表
概述该类实现了一个键值对进行存储的哈希表,类似于HashMap,它也有两个可能影响其性能的参数:初始容量和负载因子,这里的容量也与HashMap中一样,是内存存储结构中哈希数组的长度,通常其默认的负载因子也是0.75。另外这个类是内部实现同步的,它的操作是线程安全的,如果在开发时不需要考虑数据的线程安全问题,可参考虑使用HashMap,效率更高一些,在实际使用时按实际情况具体决定。成员变量// 以键值对的形式存储为数组private transient HashtableEntry<?,?&g
2021-08-30 13:04:53 355
原创 HashMap源码分析,高效的键值对存储结构
概述HashMap是基于哈希表结构并实现了Map接口的一种数据存储结构,实现了几乎所有的Map操作,其可以允许null的value和null的key,它不以保持元素在其中的存储顺序,HashMap有两影响其性能的参数:初始容量和负载因子,容量就是哈希表中的桶数(如果哈希函数能够完美平均分散,则可以认为,一个桶中存储一个数据元素),初始容量是创建HashMap时设置的容量,负载因子是哈希表在何时扩容的一个试题值,当哈希表中存储的数据条目超过负载因子与总容量的乘积时,需要对哈希表进行扩容,并对存储的数据
2021-08-27 23:56:50 261
原创 LinkedList源码分析
LinkedList概述LinkedList实现的接口List和Deque,实现了几乎所有的LIst接口操作,其中保存的数据也可以是null。在其内部也不有实现线程安全的方法,所以其也是线程不安全的,跟ArrayList一样,多线程编程时要考虑同步的问题。其定义了一个Node内部类,表示一个双向链表上一个个节点,其内部使用双向链表来实现数据存储的。private static class Node<E> { E item; Node<E> next; ...
2021-08-27 13:18:04 72
原创 Vector源码分析
概述Vector跟ArrayList类似,也定义了一个可以大小可调整的结构,其内容可以重复也可以为null,另外在其内容实现了线程安全的机制,不用考虑线程同步的问题,其它操作与ArrayList基本类似 ,但是其添加删除操作就有所区别,构造函数从下面的构造函数中可以看出Vector默认初始化10个大小的数据容量,也可以通过重载的构造函数在创建时指定容量的每次扩容大小。public Vector() { this(10);// 默认容量10个元素}// 从其它集合构建一个Vect..
2021-08-27 13:13:10 75
原创 ArrayList源码分析
ArrayList概述ArrayList是一个可调整容量大小的数组,其实现了List接口,可以存放任意元素包括null,其内部实现是数组,get、set、Iterator操作是固定时间内运行,效率较高,但是add、remove操作效率稍低。不是线程安全的类,如果有多个线程访问该类的实例,并且至少有一个线程在修改列表,则必须在外部进行同步成员变量// 初始化时如果没有指定容量大小,则默认容量为10private static final int DEFAULT_CAPACITY = 10;
2021-08-27 13:03:47 81
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人