摘要: 1、对象已死? 垃圾回收是对堆中对象的管理,首先就要确定什么是垃圾,即什么情况下堆中的对象可以被回收。最常用的判定算法是引用计数算法,即每当有一个对象被其它对象所引用,则将对象的引用数+1,当对象的引用数为0时,则认为对象将不再被使用,可以回收。但引用计数算法有一个缺陷,即无法解决对象循环引用的问题。当对象相互引用时,将会给引用的双方的对象的引用计数+1,这样的话对象的引用计数将一直无法被清零,也即是说,GC(Garbage Collection)无法判定对象为可回收对象,该对象将一直占据在内存中无法被释放。 Java中使用的判定算法为根搜索算法(GC Roots Tracing),这个算法. 阅读全文
posted @ 2014-04-10 22:16 YEQ 阅读(486) 评论(0) 推荐(0) 编辑
摘要: 首先应该明白,栈是从高地址向低地址延伸的。每个函数的每次调用,都有它自己独立的一个栈帧,这个栈帧中维持着所需要的各种信息。寄存器ebp指向当前的栈帧的底部(高地址),寄存器esp指向当前的栈帧的顶部(地址地)。下图为典型的存取器安排,观察栈在其中的位置入栈操作:push eax; 等价于 esp=esp-4,eax->[esp];如下图出栈操作:pop eax; 等价于 [esp]->eax,esp=esp+4;如下图我们来看下面这个C程序在执行过程中,栈的变化情况void func(int m, int n) { int a, b; a = m; b = n;}main() {. 阅读全文
posted @ 2014-03-01 21:26 YEQ 阅读(269) 评论(1) 推荐(0) 编辑
摘要: 1.条件变量和mutex到底有什么区别?都是在没有拿锁的情况下阻塞,拿到锁了解除阻塞。那为什么还要用条件变量呢?2.pthread_cond_broadcast和pthread_cond_signal。既然阻塞的线程被唤醒了之后第一件事就是拿锁,那么即使是broadcast,也会竞争锁,导致只有一个线程能继续,那么signal和broadcast有什么区别吗?3.pthread_cond_wait()前要加一个while循环来判断条件是否为假的原因?1、考虑一个简单的生产者和消费者的模型:由一个intcount标识生产者的生产数量,count由一个mutex上锁避免消费者和生产者同时访问。如果 阅读全文
posted @ 2014-03-01 20:54 YEQ 阅读(457) 评论(0) 推荐(0) 编辑
摘要: 本篇讲解在UML类图中,常见的几种关系: 泛化(Generalization),依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition)。1.泛化关系泛化关系是继承或实现的关系,是is-a关系,具体表现为类与类的继承,接口与接口的继承,类对接口的实现关系。2.依赖关系依赖关系表示为一个类使用另一个类,这种使用关系是具有偶然性的、临时性的、非常弱的,一个类的变化会影响到另一个类,是use a关系,如果类A依赖于类B,那么类B可以是类A的局部变量,或类A方法的参数,或静态方法的调用。3.关联关系关联关系是一种强依赖关系,这种关系不 阅读全文
posted @ 2014-03-01 10:50 YEQ 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) :一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注malloc,calloc,new申请的内存均位于此区。3、全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放。4、文字常量区 :常量字符串就是放在这里的。程序结束后由系统释放。5、程序代码区:存放函数体的 阅读全文
posted @ 2014-02-25 14:36 YEQ 阅读(5667) 评论(0) 推荐(0) 编辑