09 2011 档案
摘要:Oracle 临时表空间是Oracle数据库的重要组成部分,尽管该部分并没有cont体系结构上得以展现,但其重要地位也是不容忽视的。尤其是对于大型的频繁操作,如创建索引,排序等等都需要在临时表空间完成来减少内存的开销。当然对于查询性能要求较高的应尽可能的避免在磁盘上完成这些操作。本文主要描述的是临时表空间的管理与受损恢复。一、临时表空间的特性与注意事项1.特性 用户存储临时数据的表空间 临时数据通常只在一个数据库会话期间内存在的数据,分为两种形式,排序数据和全局临时表 临时数据不会被写入存储永久对象的普通表空间内,而是存储在临时表空间的临时段中 临时表空间临时性导致不需要备份该类型的表空间,.
阅读全文
摘要:SQL查询语句的性能从一定程度上影响整个数据库的性能。很多情况下,数据库性能的低下差不多都是不良SQL语句所引起。而SQL语句的执行计划则决定了SQL语句将会采用何种方式从数据库提取数据并返回给客户端,本文描述的将是如何通过EXPLAIN PLAN 获取SQL语句执行计划来获取SQL语句的执行计划。一、获取SQL语句执行计划的方式 1. 使用explain plan 将执行计划加载到表plan_table,然后查询该表来获取预估的执行计划 2. 查询动态性能视图v$sql_plan,v$sql_plan_statistics,v$sql_workarea 等来获取已缓存到库缓存中的真实执行计.
阅读全文
摘要:接着下来,来分析怎么样加载方法的代码,loadMethodFromDex函数的代码如下:staticvoidloadMethodFromDex(ClassObject*clazz, const DexMethod*pDexMethod, Method*meth){这个函数传入三个参数,第一个参数clazz是类相关信息;第二个参数pDexMethod是要加载的方法相关信息;第三个参数meth是指向加载的方法,也就是可以运行的代码。 DexFile*pDexFile = clazz->pDvmDex->pDexFile;这行代码是获取Dex文件。 constDexMethodId*pM
阅读全文
摘要:/*found a match, try to load it */ clazz =loadClassFromDex(pDvmDex, pClassDef, loader);这行代码是已经发现合适的类,并且找到相应的Dex文件时,就可以调用函数loadClassFromDex来加载类到内存,并准备好可以运行的状态。 if(dvmCheckException(self)) { /*class was found but had issues */ dvmReleaseTrackedAlloc((Object*)clazz, NULL...
阅读全文
摘要:Oracle负载均衡主要是指新会话连接到RAC数据库时,如何判定这个新的连接要连到哪个节点进行工作?通常情况下,负载均衡分为客户端负载均衡与服务器端负载均衡。客户端负载均衡通常是在客户端的tnsnames.ora中多添加一个链接地址以及LOAD_BALANCE与failover参数。而服务器端的负载均衡则相对复杂,下面具体描述服务器端负载均衡。 一、负载均衡 注意这里的负载均衡指的是连接的负载均衡,即客户可以随机从不同的实例中连接到数据库 1.配置tnsnames.ora使得该文件中包含如下全部内容: # LISTENERS_DEVDB DEVDB是数据库名,可以使用netmgr,netca.
阅读全文
摘要:clazz= dvmLookupClass(descriptor, loader, true);if(clazz == NULL) { constDexClassDef*pClassDef;这段代码是调用函数dvmLookupClass在已经加载的类里查找是否已经存在,如果已经存在,就直接使用就可以了。否则,就需要从Dex文件里读取出来。#ifdefWITH_PROFILER dvmMethodTraceClassPrepBegin(); profilerNotified = true;#endif#ifLOG_CLASS_LOADING u8 ...
阅读全文
摘要:接着来分析函数dvmDefineClass,它的代码如下: ClassObject*dvmDefineClass(DvmDex*pDvmDex, constchar*descriptor, Object*classLoader) { 这个函数输入的参数有三个,第一个pDvmDex参数是表示Dex文件对象,第二个descriptor参数是需要加载类名称,第三个classLoader参数是类的加载对象。 assert(pDvmDex !=NULL); returnfindClassNoInit(descriptor, classLoader, pDvmDex);这行代码调用函数fi...
阅读全文
摘要:当在虚拟机里加载Dex文件后,这个文件的数据已经读取到内存里,能不能马上使用呢?能不能使用里面的类呢?显然是不行的,因为那些加载到内存的数据,只是储存的格式,不具备运行的条件,因此需要调用方法defineClass来定义类,才可以运行在虚拟机里。所有Java编译后的类保存在Dex文件里,使用上面介绍的方法openDexFile打开Dex文件,接着需要调用方法defineClass来定义类,其实就是调用原生的函数Dalvik_dalvik_system_DexFile_defineClass, 类的加载流程如下:1)方法openDexFile里通过dvmDexFileOpenFromFd函数调用
阅读全文
摘要:演示地址:http://www.corange.cn/demo/3785/index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Conte
阅读全文
摘要:在上面的函数里,提到使用dvmJarFileOpen函数找到classes.dex文件,并加载到内存里,然后提供后面的函数使用。现在就来分析这个函数的代码,如下:intdvmJarFileOpen(const char* fileName, const char* odexOutputName, JarFile** ppJarFile, bool isBootstrap){在这里提供四个参数,第一个参数fileName是输入的Jar的文件名称;第二个参数odexOutputName是进行优化后的Dex输出文件;第三个参数ppJarFile是已经打开并缓存到内存里的文件对象;第四个参数isB..
阅读全文
摘要:从上面可知调用函数Dalvik_dalvik_system_DexFile_openDexFile来打开Dex文件,这个函数的源码如下:staticvoid Dalvik_dalvik_system_DexFile_openDexFile(const u4* args, JValue* pResult){ StringObject* sourceNameObj =(StringObject*) args[0];这行是输入的Jar或Dex文件名参数。 StringObject* outputNameObj =(StringObject*) args[1];这行是输出的文件名参数。 ...
阅读全文