v8 8.0以上版本中,V8_COMPRESS_POINTERS引发的崩溃

V8 8.0以上版本:V8_COMPRESS_POINTERS引发的指针崩溃解析
本文介绍了在V8 8.0以上版本中,由于V8_COMPRESS_POINTERS功能导致的指针崩溃问题。文章详细分析了V8压缩指针的基本原理,指出了由于inline函数在编译时未开启V8_COMPRESS_POINTERS宏导致的崩溃原因,并提出了解决方案,即在编译时开启该宏以及处理因开启V8_IMMINENT_DEPRECATION_WARNINGS宏带来的Handle句柄问题。

在移植过程中,遇到了指针崩溃的问题,经过多方查找,终于确定和V8_COMPRESS_POINTERS导致的问题。

V8_COMPRESS_POINTERS是v8新加入的功能。可以节省不少内存占用。如果设置v8_enable_pointer_compression = false就会关闭。

如果关闭了该功能,程序可以正常运行。

实际上,该功能只会在64位上开启。因为该功能是将64位指针压缩为32位指针。

基本原理

v8的对象,包括js对象等,很多都是在heap上分配的,这些对象称为heap对象。heap是一段连续的内存。这样,v8对象包含的子对象,他们的指针与v8对象的指针距离都很近,所以如果已知heap对象的地址,那么子对象只需要知道一部分地址即可。

如:一个 heap_object对象,关联一个内部的 map对象,从heap_object取map的地址。

假设 :

heap_object addr = 0x790804030c

子成员map 压缩后地址是 0x08040328

在64位下,将地址分为高32位低32位,那么map最终地址是取heap_object 的高32位,与map的低32位结合在一起,就可以了:

map最终地址: 0x7908040328 红色部分是heap_object的高32位,蓝色部分是map的压缩地址

这样才能得到一个完整的地址。

注:v8充分的利用了地址来表示对象的类型。地址总是4字节对齐的,故此,v8将最低3位利用起来,表示不同的数据类型:

在 include/v8-internal.h 中定义的

 37 // Tag information for HeapObject.      
 38 const int kHeapObjectTag = 1;                                            
 39 const int kWeakHeapObjectTag = 3;                                               
 40 const int kHeapObjectTagSize = 2;                                 
 41 const intptr_t kHeapObjectTagMask = (1 << kHeapObjectTagSize) - 1;

出现问题以及原因分析

当我们对一个 Local result 对象,调用 result->IsUndefined() 的时候,出现了coredump崩溃,崩溃时,显示的地址通常是 0x8040328 这样的地址。根据上面的原理介绍,这应该是由于没有加上

### 关于 `buffer_compress_percentage` 和 `buffer_compress_chunk` #### 参数定义 `buffer_compress_percentage` 是用于指定压缩目标的一个参数,表示希望达到的压缩比例。它通常是一个百分比值,范围从 0 到 100[^4]。此参数的作用在于优化存储空间利用率的同时保持性能平衡。当设置较高的压缩比例时,虽然可以节省更多的磁盘空间,但也可能增加 CPU 负载以完成更复杂的压缩算法。 另一方面,`buffer_compress_chunk` 定义了单次压缩操作所处理的数据块大小。它的单位通常是字节或者页数,具体取决于系统的实现细节。通过调整这一参数,管理员能够控制每次压缩操作涉及的数据量,从而影响到整体 I/O 性能和资源消耗之间的权衡关系[^5]。 #### 数据库或存储系统中的作用 在数据库环境中,这两个参数共同决定了如何有效地管理缓冲池内的数据压缩行为: - **空间效率提升**: 合理配置上述两个参数可以帮助减少实际写入物理介质上的数据体积,进而降低总体拥有成本(TCO),特别是在大规模部署场景下显得尤为重要。 - **读取性能改善**: 对频繁访问但变化较少的内容启用适当级别的压缩后,在相同容量条件下可容纳更多热数据副本,提高缓存命中率并缩短平均响应时间[^6]。 以下是基于 Oracle 数据库环境下的一个简单示例展示如何应用这些概念来增强工作负载表现: ```sql ALTER SYSTEM SET db_cache_advice='ON'; -- 开启建议功能以便观察当前状况后再做决定 SELECT * FROM v$db_cache_advice; -- 查看现有缓存策略效果评估报告 ALTER TABLESPACE users DATAFILE '/path/to/datafile.dbf' RESIZE 2G; CREATE DISKGROUP dg_compressed NORMAL REDUNDANCY COMPRESS FOR OLTP USING HIGH COMPRESSION ATTRIBUTE SIZE 1M CHECKSUM ON LOGGING BLOCKSIZE 8K ONLINE REBALANCE POWER LIMIT IMMEDIATE NOFORCE INITIALLY EMPTY QUOTA MAXIMUM EXTENT MANAGEMENT LOCAL AUTOALLOCATE SEGMENT SPACE MANAGEMENT AUTO RETENTION GUARANTEE FLASHBACK ON FORCE LOGGING ENABLE ROW MOVEMENT ALLOW PARALLEL DML ADD FILE '+DATA/dg_compressed/datafile/users.271.938475612' SIZE 2G REUSE AUTOEXTEND OFF NEXT 100M MAXSIZE UNLIMITED KEEP DUPLICATES VALIDATION INTERVAL 1 HOUR MONITORING USAGE TRACKING ALL STATISTICS LEVEL TYPICAL CACHE IN BUFFER_CACHE WITH STANDBY LOGS ARCHIVELOG THREAD 1 GROUP 1 ('/archivelog/arch_1_1.arc') FORMAT '%t_%s_%r.arc'; ALTER SESSION SET "_serial_direct_read"=ALWAYS; -- 强制串行模式下直接路径读取代常规机制以测试不同设定组合的影响差异 INSERT /*+ APPEND */ INTO large_table SELECT * FROM another_large_table WHERE MOD(rownum,10)=0; COMMIT; ``` 以上脚本片段展示了几个方面的工作流程改进措施,其中包括但不限于创建带有高压缩特性的表空间结构设计思路;同时利用会话级指令改变默认执行计划倾向,最终目的是为了验证特定条件下的最佳实践方案可行性分析过程。 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值