BruceFan's Blog

Stay hungry, stay foolish

0%

反射机制

反射是Java语言的一个特性,是Java被视为动态语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括modifiers(如public,static等)、superclass(如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。Java可以加载一个运行时才得知名称的class,获得其完整结构。
A Simple Example

阅读全文 »

类加载机制

Dalvik虚拟机中,类加载机制的主要功能就是将应用程序中Dalvik操作码以及程序数据提取并加载到虚拟机内部。Dex文件是类加载机制的输入文件,输出是一个名为ClassObject的数据结构实例对象。

工作流程

类加载机制的主要内容及工作流程主要分三点:
(1) 对Dex文件进行验证并优化。
(2) 对优化后的Dex文件进行解析。
(3) 对指定类进行实际加载。

阅读全文 »

glibc中的内存分配是由ptmalloc2实现的,ptmalloc2是dlmalloc(General purpose allocator)的分支,并加入了线程支持。
System Calls malloc内部会调用brkmmap系统调用。
Threading ptmalloc2中,当两个线程同时调用malloc,内存会立即得到分配,因为每个线程有一个单独的堆段,因此free list数据结构中保存的这些堆也是分开的。这种为每个线程分配一个单独的堆和free list数据结构的行为称为per thread arena

阅读全文 »

trace使用

(1) 在代码中加入调试命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.example.dalviktestapp;

import android.app.Activity;
import android.os.Bundle;
import android.os.Debug;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
test();
}

public static void test() {
// 调用Android调试模式下的调试方法
Debug.startMethodTracing("/sdcard/test");
System.out.println("Hello Dalvik");
Debug.stopMethodTracing();
}
}
阅读全文 »

linux_x64与linux_x86的区别

主要两点:
1.内存地址的范围由32位变成了64位,但是可以使用的内存地址不能大于0x00007fffffffffff,否则会抛出异常。
2.参数传递方式发生改变,x86参数都是保存在栈上,x64中的前6个参数依次保存在rdi, rsi, rdx, rcx, r8r9中,如果有更多参数则保存在栈上。
拿一个简单的程序演示:

阅读全文 »

makefile规则

1
2
3
4
target: prerequisites
command
...
...

target可以是一个目标文件,也可以是一个执行文件。
prerequisites是要生成target所需要的文件或是目标。
command是make需要执行的命令。(任意的shell命令)
target这一个或多个目标文件依赖于prerequisites中的文件,其生成规则定义在command中。
prerequisites中如果有一个以上的文件比target文件要新的话,command所定义的命令就会被执行。

阅读全文 »

C++中,动态内存的管理是通过:new在动态内存中为对象分配空间并返回一个指向该对象的指针,我们可以选择对对象进行初始化;delete接受一个动态对象的指针,销毁该对象,并释放与之关联的内存。
动态内存很容易出问题,因为确保在正确的时机释放内存很困难。有时会忘了释放内存,产生内存泄露;有时还有指针引用内存就释放了它,会产生UAF。

阅读全文 »