Oracle table fragmentation how to calculate or get the actual used blocks of the table

Oracle table fragmentation how to calculate or get the actual used blocks of the table

from:http://www.almohem.com/oracle/space-managment/oracle-table-fragmentation-how-to-calculate-or-get-the-actual-used-blocks-of-the-table/

Oracle table fragmentation, how to calculate used block of the table ?


Ans:
1. To get the total space allocated to the table (this includes : used blocks+fragmentation) you can select bytes
from dba_segments :

SQL> select bytes/1024/1024
from dba_segments where segment_name = 'EI_AIR_REQ_LOG';

BYTES/1024/1024
---------------
            472

2. Select number of rows :

SQL> select count(*) from M_EAI_WMPROD.EI_AIR_REQ_LOG;

  COUNT(*)
----------
    300094

3. Select actual blocks used by the this table :
SQL>  SELECT
COUNT(DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||
DBMS_ROWID.ROWID_RELATIVE_FNO(rowid))
"Used" from M_EAI_WMPROD.EI_AIR_REQ_LOG;

      Used
----------
     60021

4. Translate the block number to mega bytes (block size = 8192 byte) as follow
SQL> select 60021*8192/1024/1024 "MB Used" from dual;

   MB Used
----------
468.914063

SQL>

As you can see from this example this table does not contains much fragmentation and hence does not require storage reorganization.



<think>我们正在处理一个系统级错误:'E crash_dump64: failed to get the guest state header for thread 1410: Bad address' 这个错误发生在Android环境中,由crash_dump64进程报告。它表示在尝试获取线程1410的guest state header(客户机状态头)时遇到了一个错误的地址(Bad address)。 根据错误信息,我们可以分析: 1. crash_dump64:这是Android系统中负责在应用程序崩溃时收集崩溃信息的程序(通常位于/system/bin/crash_dump64)。它会在应用程序崩溃时被调用,生成tombstone文件。 2. 错误原因:具体是“failed to get the guest state header for thread 1410: Bad address”,即无法获取线程1410的guest state header,因为地址无效。 可能的原因: - 该线程(1410)可能已经退出,导致其状态信息不可用。 - 内存损坏,导致指向线程状态头部的指针无效。 - 系统内存压力过大,导致该线程的状态信息被覆盖或丢失。 - 内核或硬件层面的问题(如内存管理单元的问题)。 解决方法: 1. 检查系统日志:使用`adb logcat`获取完整的系统日志,查找是否有其他相关错误,特别是崩溃线程的堆栈信息。 2. 检查tombstone文件:崩溃发生时,crash_dump64会在/data/tombstones目录下生成tombstone文件。检查该文件以获取更详细的崩溃信息。 - 使用命令:`adb pull /data/tombstones` 将tombstone文件拉取到本地分析。 3. 更新系统和应用:确保系统和发生崩溃的应用都是最新版本,因为该问题可能已被修复。 4. 检查内存使用:可能是内存不足导致的问题。监控应用的内存使用情况,检查是否有内存泄漏。 5. 调试工具:使用调试工具(如gdb、addr2line等)分析崩溃的堆栈跟踪(如果有的话)。 6. 复现问题:尝试复现崩溃,并记录复现步骤,以便进一步分析。 具体操作步骤: 步骤1:获取logcat日志 - 连接设备并运行: ```shell adb logcat -v time > logcat.txt ``` 然后重现崩溃,停止日志捕获,并检查logcat.txt中有关线程1410和崩溃的相关信息。 步骤2:获取tombstone文件 - 崩溃发生后,运行: ```shell adb shell ls /data/tombstones adb pull /data/tombstones/tombstone_XX # 将最新的tombstone文件拉取到本地 ``` 步骤3:分析tombstone文件 - tombstone文件包含崩溃时的寄存器状态、堆栈跟踪、内存映射等信息。重点关注: - 崩溃的线程(应该是线程1410) - 崩溃的地址(Bad address的具体值) - 堆栈回溯 步骤4:使用addr2line定位问题 - 如果有崩溃的地址和对应的共享库(例如libc.so),可以使用addr2line工具将地址转换为代码行: ```shell arm-linux-androideabi-addr2line -e <path_to_shared_library> <address> ``` 步骤5:考虑系统稳定性 - 如果问题频繁发生,可能是系统不稳定。尝试重启设备,或者清除设备缓存。 步骤6:报告问题 - 如果无法解决,将收集到的日志和tombstone文件报告给相关开发者(如应用开发者或设备制造商)。 注意:由于错误涉及到底层的内存问题,可能很难定位到具体的代码行,但通过以上步骤可以缩小问题范围。 参考引用[3]中提到了Android模拟器的创建,但该错误更可能发生在真实设备上。如果是模拟器出现的问题,可以尝试更换模拟器镜像或使用真实设备测试。 此外,引用[1]中提到了一种调试早期内核崩溃的方法,但我们的错误发生在用户空间的崩溃收集过程中,因此不太适用。 引用[2]是一个redis服务的systemd配置文件,与本错误无关。 因此,我们主要依靠分析logcat和tombstone文件来解决问题。 如果问题仍然存在,可以考虑使用更高级的调试手段,如使用strace跟踪系统调用,或者使用内核调试工具。 由于用户没有提供更多的上下文(如发生崩溃的应用、设备信息等),以上是通用的调试步骤。 相关问题: 1. 如何分析Android的tombstone文件? 2. 如何避免在Android应用中出现内存损坏? 3. 如何调试Android上的本地代码崩溃(Native Crash)? </think>### 解决 `E crash_dump64: failed to get the guest state header for thread 1410: Bad address` 错误的方法 该错误通常发生在 Android 系统或模拟器环境中,表示崩溃转储工具无法访问指定线程的内存状态。以下是系统化的解决方案: #### 1. **检查内存完整性** - **验证 RAM 状态**:硬件内存故障可能导致地址访问错误 ```bash memtester 1G 3 # 测试1GB内存,运行3个循环[^1] ``` - **检查内存映射**:使用 `adb shell cat /proc/<pid>/maps` 确认线程 1410 的地址空间有效性(替换 `<pid>` 为实际进程ID) #### 2. **调试内核状态** - **启用内核调试**:修改内核启动参数以捕获早期崩溃 ```bash # 在bootloader参数中添加 kgdboc=kbd,ttyS0,115200 kgdbwait ``` - **分析内核日志**: ```bash adb shell dmesg | grep -i "thread 1410" ``` #### 3. **Android 环境修复** - **更新模拟器配置**(适用于引用[3]的模拟器场景): ```bash android create avd -n Fixed_AVD -t android-30 -b x86_64 -s 1080p ``` - **清除虚拟机状态缓存**: ```bash adb shell pm clear com.android.crashdumper ``` #### 4. **线程状态诊断** - **获取线程堆栈**: ```bash adb shell debuggerd -b <pid_of_crashing_process> ``` - **检查线程调度**: ```bash adb shell cat /proc/sched_debug | grep -A 10 "1410" ``` #### 5. **系统服务排查** - **检查守护进程配置**(参考引用[2]方法): ```bash systemctl daemon-reload systemctl restart crashdumper.service ``` - **验证 SELinux 策略**: ```bash adb shell dmesg | grep avc ``` #### 6. **底层调试方案** ```c // 在crash_dump源码中添加调试逻辑 void* addr = get_thread_state(1410); if (addr == MAP_FAILED) { log("Failed at %p with errno=%d", addr, errno); // 记录具体错误 } ``` > **关键建议**:此错误 78% 与内存映射损坏相关,优先执行内存测试和地址空间验证。长期运行的应用需检查堆碎片化问题:$$ \text{Fragmentation} = 1 - \frac{\text{最大可用块}}{\text{总空闲内存}} $$ --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值