- 博客(8)
- 收藏
- 关注
原创 【深入学习JVM 04】回收“已死”对象的过程
上篇文章讲到,虚拟机判断一个对象是否可回收是根据“可达性分析”,不可达的对象就是可回收的对象,但是被判定为“不可达的对象”也并非“非死不可”。它们只是被判了“缓刑”,最后是死是生都有可能。我们看看回收无效对象的过程:1.对象经过可达性分析后,发现没有被GC Roots关联,则会被第一次标记。2.判断对象是否覆盖了finalize方法。如果覆盖了该方法,并且该对象的finalize...
2018-08-27 21:54:32 209
原创 【深入学习JVM 03】判断一个对象是否可回收
我们知道,虚拟机判断一个对象是否“已死”,是判断对象是否还有引用指向它。而虚拟机又是如何判断是否有引用指向对象呢?目前,判断对象是否存活的算法有两种:引用计数算法可达性分析算法一、引用计数算法每个对象都有一个计数器,当这个对象被一个变量引用或者被另一个对象引用时,计数器值就加一,当引用失效时,计数器值就减1,当计数器为0时,则对象不可能再被使用,需要被回收。二、可...
2018-08-27 20:55:40 148
原创 【深入学习JVM 02】HotSpot虚拟机对象探秘
虚拟机运行时数据区域描述了虚拟机管理的内存划分情况,但是目前我们对于虚拟机还是有很多困惑,比如:问题1:如何为对象分配内存?问题2:对象内存模型是怎样的?问题3:是怎样访问内存中的对象的?问题4:分配内存的时候如果遇到并发问题,怎么保证分配操作的线程安全性?为了搞清楚这些问题,我们先从虚拟机是如何创建对象开始讲起。一、对象创建过程当虚拟机遇到一条new 指令时,便会进...
2018-08-27 16:12:27 156
原创 【深入学习JVM 01】运行时数据区域划分
前言在使用c++进行编程时,我们通过new创建的每一个对象都需要有对应的delete操作去释放对象所占用的内存,对内存的掌控度比较高,但是程序员需要知道对象什么时候不需要使用了,并需要手动释放内存,如果忘记了delete释放,很容易出现内存泄漏(申请内存后,没有释放,会一直占用着)和内存溢出(因为过多的内存泄漏导致无法申请足够的内存,即out of memory)的问题。相比之下,java...
2018-08-27 00:25:26 185
原创 【剑指offer-04】用两个栈实现一个队列
问题描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解法1入队的时候只push到栈1,而出队的时候先将栈1中的元素全部倒入栈2,然后弹出栈2顶端元素,并将剩下的栈2全部元素弹回栈1。import java.util.Stack;/*** 思路:第一个栈作为压入栈,第二个栈作为弹出栈,压入的时候只压入第一个栈,* 弹出的时候只...
2018-08-26 14:05:52 89
原创 【剑指offer-03】重建二叉树
问题描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路/** * Definition for binary tree * public class TreeNode {...
2018-08-26 00:36:58 149
原创 【剑指offer-02】反向输出一个链表
问题描述 输入一个链表,按照链表从尾到头的顺序,将值存入ArrayList中,并返回。解法1利用递归思想,递归本质也是利用了栈的思想。/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* ...
2018-08-25 19:02:25 396
原创 【剑指offer-01】二维数组中的查找
问题描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解法1:public class Solution { /** * 思路:由于元素在二维数组中是有序排列,因此可以从四个角开始查找,用两个指针分别代表行号...
2018-08-25 16:46:27 221
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人