blog icon indicating copy to clipboard operation
blog copied to clipboard

🌈 技术博客,记录日常工作学习的整理~欢迎star

Results 49 blog issues
Sort by recently updated
recently updated
newest added

## 前言 在了解`Node.js`内存的分配的时候,堆外内存是一个神秘的存在,仅知道它是通过`Node.js`中的`C++`代码向内存申请使用的。这其中最具代表的必须要数`Node.js`中的`Buffer`和`Stream`了。 `Buffer`字面的意义是缓冲区,暂存器,了解过`操作系统组成原理`的同学一定不会陌生。在计算机中,缓冲器是存储变量,方便CPU直接读取的一款`存储区域`。而`Stream`则是类比数据字节的顺序的移动像是水流一样。 ## Buffer 作为前端工程师,在进阶学习`Node.js`时遇到`Buffer`常常比较陌生,因为虽然同是`Javascript`,但在浏览器场景下处理文件流、视频流是相对比较少的情况,而服务端`Javascript`的情况恰恰相反。 > Buffer 对象用于表示固定长度的字节序列。 --- 《Node.js文档》 > Buffer是一个像Array的对象,但它主要用于操作字节。 --- 《深入浅出Node.js》 ### Buffer与数组、字符串的关系 * `Buffer`类似于数组,可以使用下标访问,并且有`length`属性。 * 大小在创建时就固定,且无法调整。 * `Buffer`每一个元素都是一个`两位的十六进制数`。 ```js const buff = Buffer.from('swain wong')...

![](https://raw.githubusercontent.com/HXWfromDJTU/blog/master/blog_assets/v8_gc.png) ## 前言 `Javascript`是一门具有垃圾回收机制的编程语言,程序员大部分情况下不用手动去操心内存管理的问题。 和`EvemtLoop`类似,虽然我们不能直接地去操控垃圾清理的执行与停止,但充分了解了`V8`的垃圾回收机制后吗,在编码上能够有意识地去较少`GC`的影响。相当于武林高手虽然绑上了手脚,但仍然能够识破别人的招式,以守为攻。 本文主要分为两个部分,① 先了解`V8`与内存的关系,② 再延展开去了解`V8`对内存的管理(清理)。 ## V8 与内存 #### V8的初始内存限制 * V8启动后只能够使用物理机的部分内存,(64位系统下1.4GB,32位系统下0.7GB) * `V8`创始之初是设计为新一代`Chrome`的内核,作为浏览器所需要的内存当然就不需要太大,这从`系统安全`和`浏览器本身需求`两个角度去考虑的。 * 基于`V8`自身的垃圾回收机制,若分配的内存过大,单次的垃圾回收时间则会过长,这是在服务端`Node.js`和前端浏览器都不可以接受的。 #### 内存占用情况 ![](https://raw.githubusercontent.com/HXWfromDJTU/blog/master/blog_assets/node_memory_usage.png) * `heapTotal` 和 `heapUsed` 分别代表已申请到的堆内存大小,和当前的使用量。 * `external` 代表...

## 概述 本文主要为Node.js工作原理解析,从我们编写的`Application`到`Node`,再到`v8编译解析`,也会聊聊大家比较关心的`Libuv`和`EventLoop`的6阶段,所以把之前拆分开的内容,汇总到一起便于大家整体理解。 其实每一个点都可以讲上一天,本文主要为大家理清楚这几个过程间的关系,很多细节则不多赘述。 ## Node.js Framework ![](https://raw.githubusercontent.com/HXWfromDJTU/blog/master/blog_assets/node_framework.png) ##### 第一层(Javascript依赖包) * Standard Libary 是我们日常项目常用的`HTTP` `Buffer`等模块 ##### 第二层(桥阶层) * Node Binding 是沟通C++和Javascript的桥梁,封装了底层C与C++模块包,暴露出JavaScript接口给上层调用 ##### 第三层 (C/C++依赖包) 这一层是支撑 Node.js 运行的关键,由 C/C++ 实现 *...

![](https://raw.githubusercontent.com/HXWfromDJTU/blog/master/blog_assets/eventLoopTitle.png) Javascript的事件环,主要就在理解`宏任务`和`微任务`这两种异步任务 | 任务类型 | 事件类型 | 优先级 | | --- | --- | --- | | 宏任务 | `setTimeOut` 、 `setInterval` 、 `setImmediate` 、 `I/O` 、 各种`callback`、 `UI渲染` 、`messageChannel`等...

| 任务类型 | 事件类型 | | --- | --- | | 宏任务 | `setTimeOut` 、 `setInterval` 、 `setImmediate` 、 `I/O` 、 各种`callback`、 `UI渲染` 、`messageChannel`等 | | 微任务 | `process.nextTick` 、`Promise`...

[IEEE 754 - 维基百科](https://zh.wikipedia.org/wiki/IEEE_754) 在计算机的世界中,浮点数的表示范围优先。浮点数只是可以近似的标识一个数而已。与许多其他编程语言不同,JavaScript 并未定义不同类型的数字数据类型,而是始终遵循国际 IEEE 754 标准,将数字存储为双精度浮点数。 ![](https://raw.githubusercontent.com/HXWfromDJTU/blog/master/blog_assets/double_float_memory.png) * sign 符号位 * exponent 指数位 * mantissa 尾数部分 ## 十进制转二进制补课(敲黑板) ### 整数部分 用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。 ![](https://www.runoob.com/wp-content/uploads/2018/11/210-2.png) ### 小数部分 用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来。 ![](https://www.runoob.com/wp-content/uploads/2018/11/210-3.png)...

# Javascript 变量存储 > 最近在`webpack`调试的时候遇到,经常遇到`heap oout of menory`的情况,导致调试开发工作的十分不顺利。所以决心了解一下`Javascript`和`node`的内存机制。 ## 数据类型与存储空间 本篇文章先了解`Javascript In Browser`的内两种原始数据类型 | 类型 | 包含种类 | 存储情况 | | --- | --- | --- | | 原始值 |...

## 复制引用 使用直接赋值的方式,我们得到的效果一般就是浅拷贝,因为复制的只是对象和数组的引用地址。 ```js let a = {key:123}; let b = a; b; // {key:123} a === b; // true ``` ## 浅拷贝 #### 数组分割与合并 💎 常用方法:`array.slice(0)` 和 `array.concat()` 只对数组进行了第一层的完全拷贝,第二层以及内部若存在对象或者数组,则也都只是复制了对象的引用。...

![](https://raw.githubusercontent.com/HXWfromDJTU/blog/master/blog_assets/node_libuv.png) ## Linux下实现 * NIO意思是Non-Blocking I/O,非阻塞I/O的意思,与之相对应的是BIO(阻塞性I/O) * Linux NIO的几种类型 `select` `select/poll` `epoll` * 在linux 下 ,最多同时连接的文件描述符默认是 1024个 ![](https://raw.githubusercontent.com/HXWfromDJTU/blog/master/blog_assets/linux_FD_SETSIZE.png) ## 文件描述符 * 操作系统对计算机进行了抽象,将所有的输入输出设备都抽象为文件。 * 内核在进行文件操作的时候,通过文件描述符进行管理,文件描述符类似于应用程序与系统内核之间的凭证。 * 应用程序要进行I/O调用,需要先打开文件描述符,然后再根据文件描述符去实现文件数据的读写。 * 阻塞I/O与非阻塞I/O的的区别在于,阻塞I/O直接完成整个数据读取的过程,而非阻塞I/O请求后不带值返回,需要去获取结果的时候,还需要再次使用文件描述符进行获取。 > 摘自《NodeJS深入浅出》...

![](https://raw.githubusercontent.com/HXWfromDJTU/blog/master/blog_assets/socket_client_server.png) ## 简要理解 * #### 简单定义 * 网络上的两个程序通过一个双向链接实现数据的交换,这个连接的一段被称之为`socket`。 * `socket`的本质是一个编程接口,对TCP/IP进行了封装,`TCP/IP`也要提供可供开发者做网络开发的接口。 * 一台主机上多个端口,对应着不同的应用服务,每个服务都打开一个`socket`,并且绑定到一个端口上。 * #### socket做基础,应用层负责多样性 * 一台主机就像一个布满插座的房间,有的插座提供的是直流电,有的插座提供的是交流电,有的插座提供的是一个电视信号,用户通过插头插到不同的插座,就可以得到不同的服务。 * `HTTP`提供了封装或者显示数据的具体形式,`socket`是发动机,提供了网络通信的能力。 ![](https://raw.githubusercontent.com/HXWfromDJTU/blog/master/blog_assets/socket.png) * #### socket 与 fd * `socket` 是一套用于Unix进程间通信的api。`IP + port`...