国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

如何管理用于高規(guī)模服務(wù)的單寫(xiě)數(shù)據(jù)庫(kù)管理系統(tǒng)?

最近我一直在進(jìn)行一個(gè)項(xiàng)目,旨在創(chuàng)建一個(gè)實(shí)時(shí)高性能的JavaScript圖表庫(kù)。該項(xiàng)目使用了一個(gè)雄心勃勃且新穎的技術(shù)堆棧,其中包括一個(gè)大型的C/C++遺留代碼庫(kù),使用Emscripten編譯為WebAssembly,針對(duì)WebGL進(jìn)行渲染,并提供TypeScript API包裝器,可在JavaScript中加載圖表而無(wú)需擔(dān)心底層的Wasm。

為什么要使用WebAssembly?

WebAssembly是一項(xiàng)令人興奮的技術(shù),在許多情況下比JavaScript具有更好的性能優(yōu)勢(shì)。而且,在這種情況下,由于遺留的C++代碼庫(kù)已經(jīng)處理了OpenGL中的大部分圖表渲染工作,只需要做一些工作即可將其定位到WebGL。

使用Emscripten將現(xiàn)有的C++代碼編譯成WebAssembly非常簡(jiǎn)單,只需編寫(xiě)綁定生成類(lèi)型并在Wasm庫(kù)周?chē)帉?xiě)JavaScript API即可使用它。

在開(kāi)發(fā)庫(kù)的過(guò)程中,我們學(xué)到了一些關(guān)于WebAssembly內(nèi)存模型的有趣事實(shí),以及如何避免和調(diào)試內(nèi)存泄漏,下面我將分享給大家。

JavaScript與WebAssembly內(nèi)存模型的區(qū)別

WebAssembly與JavaScript具有完全不同的內(nèi)存模型。雖然JavaScript擁有自動(dòng)垃圾回收器,可以自動(dòng)清理不再需要的變量的內(nèi)存,但WebAssembly則沒(méi)有。在Wasm內(nèi)存中聲明的對(duì)象或緩沖區(qū)必須由調(diào)用者刪除,否則將導(dǎo)致內(nèi)存泄漏。

JavaScript中的內(nèi)存泄漏是如何引起的

無(wú)論是JavaScript還是WebAssembly,都可能發(fā)生內(nèi)存泄漏,開(kāi)發(fā)人員必須小心確保在使用WebAssembly時(shí)正確清理內(nèi)存。

盡管JavaScript是一種帶有垃圾回收機(jī)制的托管式編程語(yǔ)言,但使用純粹的JavaScript仍然很容易創(chuàng)建內(nèi)存泄漏。以下是在JavaScript應(yīng)用程序中無(wú)意中導(dǎo)致內(nèi)存泄漏的幾種方式:

  • 箭頭函數(shù)和閉包可以捕獲變量并使其保持活動(dòng)狀態(tài),因此無(wú)法被JavaScript垃圾回收器刪除。

  • 回調(diào)函數(shù)或事件監(jiān)聽(tīng)器可以捕獲變量并保持其活動(dòng)狀態(tài)。

  • 全局變量或靜態(tài)變量在應(yīng)用程序的生命周期中一直存在。如果忘記使用let或const關(guān)鍵字,變量將轉(zhuǎn)換為全局變量。

  • 即使從DOM中分離的節(jié)點(diǎn)也可以在JavaScript中保持對(duì)象的活動(dòng)狀態(tài)。僅僅移除一個(gè)節(jié)點(diǎn)但保留對(duì)它的引用變量,將阻止該節(jié)點(diǎn)及其子節(jié)點(diǎn)被回收。

WebAssembly中的內(nèi)存泄漏是如何引起的

Wasm擁有與JavaScript虛擬機(jī)不同的堆內(nèi)存。該內(nèi)存在瀏覽器中分配,并從主機(jī)操作系統(tǒng)中保留。當(dāng)您在Wasm中分配內(nèi)存時(shí),Wasm堆會(huì)增長(zhǎng),并且保留了一定范圍的地址。當(dāng)您刪除Wasm中的內(nèi)存時(shí),堆不會(huì)縮小,并且內(nèi)存也不會(huì)返回給主機(jī)操作系統(tǒng)。相反,內(nèi)存只是被標(biāo)記為已刪除或可用。這意味著它可以被未來(lái)的分配重新使用。

要在WebAssembly中引起內(nèi)存泄漏,只需分配內(nèi)存并忘記刪除它即可。由于沒(méi)有自動(dòng)垃圾回收、終結(jié)或?qū)?nèi)存標(biāo)記為不再需要的機(jī)制,必須由用戶(hù)來(lái)處理。由編譯器Emscripten導(dǎo)出的所有WebAssembly類(lèi)型都具有一種在使用Wasm內(nèi)存的對(duì)象上調(diào)用的`.delete()`函數(shù)。當(dāng)不再需要該對(duì)象時(shí),需要調(diào)用此函數(shù)進(jìn)行刪除。以下是一個(gè)快速示例:

示例:Wasm中的內(nèi)存泄漏

假設(shè)您在C++中聲明了如下類(lèi)型:

// person.cpp
#include <string>
class Person {
public:
  // C++ 構(gòu)造函數(shù)
  Person(std::string name, int age) : name(name), age(age) {}
  // C++ 析構(gòu)函數(shù)
  ~Person() {}
  std::string getName() { return name; }
  int getAge() { return age; }
private:
  std::string name;
  int age;
};

`然后使用Emscripten編譯和導(dǎo)出該類(lèi)型,如下所示:

emcc person.cpp -o person.js -s EXPORTED_FUNCTIONS="['_createPerson', '_deletePerson', '_getName', '_getAge']" -s MODULARIZE=1

現(xiàn)在,您可以在JavaScript中實(shí)例化、使用和刪除該類(lèi)型,如下所示:

const Module = require('./person.js'); // 包含生成的JavaScript接口
Module.onRuntimeInitialized = () => {
  // 實(shí)例化一個(gè)Person對(duì)象
  const person = new Module.Person('John Doe', 30);
  console.log('創(chuàng)建Person對(duì)象:', person);
  // 訪問(wèn)并打印屬性
  console.log('姓名:', person.getName());
  console.log('年齡:', person.getAge());
  // 刪除Person對(duì)象(調(diào)用C++析構(gòu)函數(shù))
  person.delete();
};

然而,如果忘記調(diào)用`.delete()`函數(shù),就會(huì)導(dǎo)致Wasm內(nèi)存泄漏。瀏覽器的內(nèi)存將增長(zhǎng)而不會(huì)縮小。

檢測(cè)WebAssembly應(yīng)用程序中的內(nèi)存泄漏

由于內(nèi)存泄漏對(duì)應(yīng)用程序來(lái)說(shuō)是災(zāi)難性的,我們不僅要確保我們的代碼不會(huì)泄漏內(nèi)存,還要確保用戶(hù)代碼(即使用我們的JavaScript圖表庫(kù)的應(yīng)用程序)不會(huì)泄漏內(nèi)存。

為此,我們開(kāi)發(fā)了內(nèi)部?jī)?nèi)存調(diào)試工具。它實(shí)現(xiàn)為一個(gè)對(duì)象注冊(cè)表,其中包含所有未刪除和未收集的對(duì)象的Map<string, TObjectEntryInfo>,其中TObjectEntryInfo是一個(gè)存儲(chǔ)對(duì)象的WeakRef的類(lèi)型。

通過(guò)使用JavaScript代理技術(shù),我們能夠攔截對(duì)所有WebAssembly類(lèi)型的new/delete的調(diào)用。每次實(shí)例化一個(gè)對(duì)象時(shí),我們將其添加到objectRegistry中;每次刪除一個(gè)對(duì)象時(shí),我們將其從objectRegistry中移除。

現(xiàn)在,您可以運(yùn)行應(yīng)用程序,啟用內(nèi)存調(diào)試工具,并輸出應(yīng)用程序狀態(tài)的特定快照。以下是該工具輸出的示例。

首先,啟用MemoryUsageHelper(內(nèi)存調(diào)試工具):

import { MemoryUsageHelper } from "scichart";
MemoryUsageHelper.isMemoryUsageDebugEnabled = true;

這將自動(dòng)跟蹤我們庫(kù)中的所有類(lèi)型,但您也可以通過(guò)調(diào)用register和unregister來(lái)跟蹤應(yīng)用程序中的任意對(duì)象:

// 注冊(cè)一個(gè)任意對(duì)象
MemoryUsageHelper.register(yourObject, "identifier");
// 注銷(xiāo)一個(gè)任意對(duì)象
MemoryUsageHelper.unregister("identifier");

稍后,在特定的點(diǎn)上通過(guò)調(diào)用此函數(shù)輸出一個(gè)快照:

MemoryUsageHelper.objectRegistry.log();

這將在控制臺(tái)輸出所有未被刪除或未收集的對(duì)象和它們的標(biāo)識(shí)符。通過(guò)檢查這個(gè)快照,您可以確定是否有任何內(nèi)存泄漏。文章來(lái)源地址http://www.zghlxwxcb.cn/article/652.html

到此這篇關(guān)于如何管理用于高規(guī)模服務(wù)的單寫(xiě)數(shù)據(jù)庫(kù)管理系統(tǒng)?的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

原文地址:http://www.zghlxwxcb.cn/article/652.html

如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)聯(lián)系站長(zhǎng)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Go如何優(yōu)雅的寫(xiě)數(shù)據(jù)庫(kù)的單測(cè)

    Go如何優(yōu)雅的寫(xiě)數(shù)據(jù)庫(kù)的單測(cè)

    ?當(dāng)你想在代碼中測(cè)試 Gorm 時(shí),可以考慮使用單元測(cè)試或集成測(cè)試來(lái)確保 Gorm 的功能正常。下面是一個(gè)簡(jiǎn)單的示例,展示了如何編寫(xiě)一個(gè)基本的 Gorm 單元測(cè)試。 app config config.yaml conf.go services project.go project_test.go init_test.go cmd main.go rootDir, err := os.Getwd() : os.Getwd() 函數(shù)用于獲取當(dāng)

    2024年02月03日
    瀏覽(25)
  • sqlite3 是一個(gè)命令行工具,用于與 SQLite 數(shù)據(jù)庫(kù)進(jìn)行交互和管理

    sqlite3 example.db sqlite3 new_database.db sqlite3 -init init_script.sql example.db

    2024年02月09日
    瀏覽(29)
  • 一臺(tái)服務(wù)器安裝兩個(gè)mysql、重置數(shù)據(jù)庫(kù)用于測(cè)試使用

    一臺(tái)服務(wù)器安裝兩個(gè)mysql、重置數(shù)據(jù)庫(kù)用于測(cè)試使用

    這個(gè)方法可以讓你不用安裝新的數(shù)據(jù)庫(kù),就可以得到一個(gè)全新的一個(gè)數(shù)據(jù)庫(kù) 缺點(diǎn):原來(lái)的數(shù)據(jù)庫(kù)被暫停使用 優(yōu)點(diǎn):數(shù)據(jù)切換速度快 更改mysql配置文件 重啟mysql 使用data02為新的存儲(chǔ)數(shù)據(jù)的地方 配置文件的datadir參數(shù)也更改成這個(gè)文件夾 對(duì)數(shù)據(jù)庫(kù)進(jìn)行初始化 查看初始化密碼 重

    2024年02月19日
    瀏覽(30)
  • Flink與Cassandra:如何在大規(guī)模數(shù)據(jù)處理中存儲(chǔ)與管理數(shù)據(jù)

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) 1.1. 背景介紹 隨著大數(shù)據(jù)時(shí)代的到來(lái),數(shù)據(jù)處理的需求也越來(lái)越大。在實(shí)際工作中,我們常常需要處理海量數(shù)據(jù),如何高效地存儲(chǔ)與管理數(shù)據(jù)成為了我們必須面對(duì)的問(wèn)題。 1.2. 文章目的 本文旨在探討如何在大型數(shù)據(jù)處理環(huán)境中使用 Flink 和 Ca

    2024年02月13日
    瀏覽(22)
  • 區(qū)塊鏈:OpenDataPlatform如何與區(qū)塊鏈結(jié)合用于數(shù)據(jù)存儲(chǔ)和管理

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) 區(qū)塊鏈(Blockchain)近年來(lái)受到越來(lái)越多人的關(guān)注,因?yàn)槠淠軌蛱峁┎豢纱鄹?、透明、安全、高效率的?shù)據(jù)存證功能。隨著其功能的不斷完善,越來(lái)越多的創(chuàng)業(yè)公司都開(kāi)始使用區(qū)塊鏈技術(shù)進(jìn)行數(shù)據(jù)存證及管理。然而,不同于傳統(tǒng)互聯(lián)網(wǎng)應(yīng)用中的數(shù)據(jù)

    2024年02月12日
    瀏覽(18)
  • 什么是T-SQL編程?T-SQL是Transact-SQL的縮寫(xiě),是一種擴(kuò)展了SQL(結(jié)構(gòu)化查詢(xún)語(yǔ)言)的編程語(yǔ)言,用于Microsoft SQL Server數(shù)據(jù)庫(kù)管理系統(tǒng)中的數(shù)據(jù)管理和操作。T-

    什么是T-SQL編程? T-SQL是Transact-SQL的縮寫(xiě),是一種 擴(kuò)展了SQL(結(jié)構(gòu)化查詢(xún)語(yǔ)言) 的編程語(yǔ)言,用于Microsoft?SQL?Server數(shù)據(jù)庫(kù)管理系統(tǒng)中的數(shù)據(jù)管理和操作。T-SQL支持創(chuàng)建 存儲(chǔ)過(guò)程、觸發(fā)器、函數(shù) 等高級(jí)特性,能夠更加靈活地進(jìn)行數(shù)據(jù)操作和處理。基本的T-SQL語(yǔ)法與標(biāo)準(zhǔn)SQL很相

    2024年01月21日
    瀏覽(97)
  • 【postgresql 基礎(chǔ)入門(mén)】數(shù)據(jù)庫(kù)服務(wù)的管理

    【postgresql 基礎(chǔ)入門(mén)】數(shù)據(jù)庫(kù)服務(wù)的管理

    ? 專(zhuān)欄內(nèi)容 : postgresql內(nèi)核源碼分析 手寫(xiě)數(shù)據(jù)庫(kù)toadb 并發(fā)編程 ? 開(kāi)源貢獻(xiàn) : toadb開(kāi)源庫(kù) 個(gè)人主頁(yè) :我的主頁(yè) 管理社區(qū) :開(kāi)源數(shù)據(jù)庫(kù) 座右銘:天行健,君子以自強(qiáng)不息;地勢(shì)坤,君子以厚德載物. 初始化集群 數(shù)據(jù)庫(kù)服務(wù)管理 postgresql 數(shù)據(jù)庫(kù)是一款通用的關(guān)系型數(shù)據(jù),在開(kāi)

    2024年02月10日
    瀏覽(21)
  • 【數(shù)據(jù)庫(kù)大作業(yè)--酒店服務(wù)管理系統(tǒng)】

    【數(shù)據(jù)庫(kù)大作業(yè)--酒店服務(wù)管理系統(tǒng)】

    在學(xué)習(xí)《數(shù)據(jù)庫(kù)系統(tǒng)原理教程》等相關(guān)課程時(shí),期末的結(jié)課作業(yè)往往是設(shè)計(jì)一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)。設(shè)計(jì)開(kāi)發(fā)過(guò)程中,大多數(shù)只是注重需求分析、概念結(jié)構(gòu)設(shè)計(jì)、邏輯結(jié)構(gòu)設(shè)計(jì)、數(shù)據(jù)庫(kù)實(shí)施、運(yùn)行測(cè)試等主要環(huán)節(jié)。本篇博客即為本人的結(jié)課作業(yè),本人才疏學(xué)淺,文章中如有錯(cuò)誤之處

    2024年02月07日
    瀏覽(34)
  • 服務(wù)器管理平臺(tái)開(kāi)發(fā)(2)- 設(shè)計(jì)數(shù)據(jù)庫(kù)表

    服務(wù)器管理平臺(tái)開(kāi)發(fā)(2)- 設(shè)計(jì)數(shù)據(jù)庫(kù)表

    本篇文章主要對(duì)數(shù)據(jù)管理平臺(tái)數(shù)據(jù)庫(kù)表設(shè)計(jì)進(jìn)行介紹,包括單庫(kù)多表設(shè)計(jì)、SQL語(yǔ)句、視圖構(gòu)造等 設(shè)備品牌、序列號(hào)、型號(hào)等使用業(yè)務(wù)主表進(jìn)行記錄,邏輯磁盤(pán)、PCI設(shè)備可能出現(xiàn)1對(duì)N的情況,分別使用PCI設(shè)備表、Mac地址表、邏輯磁盤(pán)表、應(yīng)用程序表、登錄日志表進(jìn)行記錄 構(gòu)建虛

    2024年01月22日
    瀏覽(21)
  • 如何遠(yuǎn)程管理天翼云RDS數(shù)據(jù)庫(kù)

    如何遠(yuǎn)程管理天翼云RDS數(shù)據(jù)庫(kù)

    ????????天翼云MySQL RDS數(shù)據(jù)庫(kù)當(dāng)前僅允許從云主機(jī)內(nèi)網(wǎng)訪問(wèn),暫時(shí)不支持綁定公網(wǎng)IP地址遠(yuǎn)程訪問(wèn)和控制數(shù)據(jù)庫(kù)。很多用戶(hù)更習(xí)慣使用Windows上的圖形客戶(hù)端對(duì)數(shù)據(jù)庫(kù)進(jìn)行管理,如果有Windows云主機(jī)則可以遠(yuǎn)程桌面登錄到Windows云主機(jī)上使用MySQL-Front或Navicat等圖形客戶(hù)端訪問(wèn)

    2023年04月08日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包