- 博客(12)
- 收藏
- 关注
原创 JVM——四种对象引用类型,决定对象在内存中生存的引用关系
在JDK1.2之后,Java将引用的概念进行了扩充,一共分为四类,对可达性分析法来判断一个对象是否还有用具有很大的意义。 一.强引用: 这是一种程序中普遍存在的引用关系,例如Object A = new Object(),这类引用只要还存在,对象就永远不会被回收。 二.软引用 这类引用用来描述一些还有用但是并不是必须的对象,存在软引用的对象会在系统要发生内存溢出时被回收掉。...
2018-04-02 20:18:48 294
原创 JVM——垃圾收集算法
JVM中主要有一下几种垃圾收集算法: 一.标记-清除算法 这是一种最基础的算法,算法分为标记、清楚两个阶段,首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。 缺点:效率低,标记对象和清除对象两个阶段的效率都不高;空间利用率不高,标记清除之后可能会产生大量的不连续的内存碎片,当有一个很大的对象要分配空间时,就会找不到合适的内存给其分配,此...
2018-03-28 19:51:43 500
原创 JVM——方法区的内存回收
方法区的内存回收可以说是“性价比”较低的,因为方法区中需要被回收的资源很少,不像Java堆,Java堆中存放对象的实例,一次回收基本能达到70%--95%的内存回收。方法区中需要被回收的主要有废弃常量和无用的类。 废弃常量是否已经无用的判断是很容易的,但是对于类是否无用的判断就相对比较严格,判断类是否已经无用需要同时满足以下三点: 一.该类的实例已经全部别回收,即Jav...
2018-03-28 19:20:35 902
原创 JVM——finalize()方法之对象存活最后的机会
内存中的对象要被回收至少要经过两次标记才能被回收掉。 我们说过可达性分析法来判断一个对象是否还会被引用,此时即使该对象已经没有任何引用链了,但是该对象也不一定会被回收,这样的对象需要先进行一步筛选,而又不是所有处于该状态的对象都会经过筛选,进行筛选的条件是该对象是否有必要执行finalize()方法,如果该对象没有覆盖finalize()方法或者虚拟机已经执行过该对象的finaliz...
2018-03-28 19:12:10 688 1
原创 JVM——引用计数算法和可达性分析算法——判断对象是否需要被回收
Java程序运行时,所有的实例对象都保存在Java堆里,而大量的实例对象会占用大量的内存空间,保证内存的可用性,需要对不用的对象进行垃圾回收,而进行垃圾回收之前最重要的就是判断某一个对象是否可以被回收,当一个对象不能再被任何途径访问,说明该对象已经没有用了。 下面介绍两种判断对象是否还会被引用的算法——引用计数算法和可达性分析法 引用计数算法: ...
2018-03-26 20:52:57 1505 1
原创 JVM——对象的访问定位
在java程序中,我们访问对象的操作是非常频繁的。下面来介绍一下访问对象操作在内存中的对应过程。 我们知道,对象实例是存放在java堆中的,而我们new对象时,用一个变量接收新创建的对象,这个变量实际是存在java虚拟机栈中的,既然两个东西不在一个空间里,那怎么使用呢? 我们在程序中顶一个变量接收对象,这个变量其实就是虚拟机栈中的reference数据,这个refere...
2018-03-24 15:25:42 204
原创 JVM——对象的内存布局
以Sun Spot 虚拟机为例子: 对象在虚拟机中存储布局分为三个区域:对象头、实例数据、对齐填充。下面从这三方面开始对象在内存中的布局分析: 1.对象头 对象头包含两个部分,第一部分是对象自身的运行时数据:例如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等信息。第二部分是类型指针,即指向该对象类元数据的指针,虚拟机中是通...
2018-03-24 14:27:44 310 1
原创 JVM——对象的创建过程
对象的创建过程:我们在Java代码中new 一个对象时,我们很难看到对象创建的过程,尤其是在jvm内存中的过程,下面来介绍一下对象创建在jvm中的过程: 对象实例在jvm中是存在于java堆中的,每一个对象实例都会占用一定的内存空间, 当new执行时,首先会加载new的类 当类加载完成之后,实例对象所占的大小就确定了。 此时,jvm会在java堆中为实例对象开辟一块内存空间...
2018-03-23 20:11:51 2181
原创 jvm原理——java运行时数据区域总结
学JVM的好处: JVM是Java运行的虚拟机,java文件的编译运行都经过JVM,所以要想写出高效的java程序,对JVM的了解是必须的。只有了解了java实际运行的过程和原理,才能进行最大的优化。而Java程序在运行时一方面要注意安全性,一方面是运行效率,这是程序索要考虑的最大的两个因素。下面来介绍一下Java程序运行时的内存划分以及数据区域相应的概念总结,对于运行时数据区域的详细解读将...
2018-03-23 14:53:32 178
原创 希尔排序原理
希尔排序是一种效率比较高的排序算法所谓希尔排序,可能看起来比较难懂,但是其实就是将数组按照一定的间隔大小分成若干个小数组,对每一个小数组进行排,然后主键缩小间隔,最后达到排序的效果。例如: 1--10十个数,按照4为间隔,一次分为1,5,9;2,6,10;3,7;4,8;5,9.这样的五组,对小数组进行排序是很快的,而且采用的排序得算法也容易选择,效率较高,此时这五组数已经是有顺序的,然后在...
2018-03-21 21:12:00 234
原创 栈和队列的原理以及应用场景
栈和队列是一个比较抽象的概念,大多数人知道栈和队列的特点,但是实际不知道怎么用,这是大家学习阶段的通病。 要想用栈和队列,首先要明确,他们是什么。1.是什么? 栈和队列其实是一个工具,他们传统的工具方法 工具类不同,他们是“思想”工具,大家都知道,栈是后进先出,队列是先进先出。但是实际怎么用却不知道。2.怎么用? 栈和队列是很好的工具,他们的应用我们平时开发可能用...
2018-03-19 20:43:29 13241 5
原创 冒泡排序、选择排序、插入排序,效率以及应用场景
1.冒泡排序: 冒泡排序是原理最简单的排序,但是他是三种排序算法中效率最低的,他的比较次数和交换数据次数时间复杂度都是O(N²)。 原理:冒泡排序是双重循环,他每次排序都将最大的元素移动到最后一位,比较方式为:0 vs 1,1 vs 2,2 vs 3,。。。直到N-1 vs N,每次比较之后,下次比较不会再去比较上去比较得出的并且移动的最大数据,所以他需要逐条比较。相应Java代码:p...
2018-03-17 18:19:53 4594
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人