nodejs v8引擎
Node.js 线程你理解的可能是错的
本文代码运行环境 系统:MacOS High Sierra Node.js:10.3.0 复制代码
Node.js是单线程的,那么Node.js启动后线程数是1?
答案:Node.js启动后线程数并不是1,以下面代码为例
const http = require('http'); http.createServer((req, res) => { res.end('hello'); }).listen(8000, () => { console.log('server is listening: ' + 8000); }); 复制代码
通过Mac实用工具 > 活动监视器可以查看进程的线程数其实是6
Node.js启动的线程数不为1,是因为线程池?
答案:线程数不为1,不是因为线程池,而是因为V8。Node.js启动后会创建V8实例,V8实例是多线程的,V8中的线程有:
- 主线程:获取代码、编译执行
- 编译线程:主线程执行的时候,可以优化代码
- Profiler线程:记录哪些方法耗时,为优化提供支持
- 其他线程:用于垃圾回收清除工作,因为是多个线程,所以可以并行清除
Node.js线程池是预先创建好的?
答案:并不是,线程池中的线程是按需创建的。
const http = require('http'); const fs = require('fs'); http.createServer((req, res) => { fs.readFile('./c.js', () => {}); res.end('hello'); }).listen(8000, () => { console.log('server is listening: ' + 8000); }); 复制代码
上面代码启动后,线程数依然是6
通过ab模拟访问后
ab -n1000 -c20 'http://192.168.76.101:8000/' 复制代码
线程数才变成了10。之所以为10,是因为线程池中线程的默认值是4。
异步IO都要占用线程池?
答案:并不是,网络IO不会占用线程池
const http = require('http'); http.createServer((req, res) => { http.get('http://192.168.1.100'); res.end('hello'); }).listen(8000, () => { console.log('server is listening: ' + 8000); }); 复制代码
上面这段代码,使用ab压测
ab -n10000 -c20 'http://192.168.76.101:8000' 复制代码
无论多少次访问都不会创建线程,线程数永远为6。
文件IO一定会占用线程池?
答案:并不是,*Sync会阻塞主线程所以不会占用线程池,另外fs.FSWatcher也不会占用线程池。
虽然官方文档里面提到了fs.FSWatcher,但是其实并不能直接调用,关于FSWatcher访问 StackOverflow上有一个相关的提问stackoverflow.com/questions/3…
线程池只能用于异步IO?
答案:并不是,除了一些IO密集操作外,Node.js对一些CPU密集的操作也会放到线程池里面执行(Crypto、Zlib模块)
DNS查询也有可能占用线程池?
答案:是的,因为dns.lookup方法会涉及到读取本地文件(例如nsswitch.conf
,resolv.conf
以及 /etc/hosts
)。而dns.resolve方法就不会占用线程池,这也是lookup和resolve的区别所在。
所以下面的代码,其实是会占用线程池的,因为http.get在dns解析的时候默认使用的是lookup方法。
const http = require('http'); http.createServer((req, res) => { http.get('http://bj.meituan.com'); res.end('hello'); }).listen(8000, () => { console.log('server is listening: ' + 8000); }); 复制代码
线程池只供Node.js核心模块内部使用?
答案:不是的,官方文档里面有如下描述
You can use the built-in Node Worker Pool by developing a C++ addon. On older versions of Node, build your C++ addon using NAN, and on newer versions use N-API. node-webworker-threads offers a JavaScript-only way to access Node's Worker Pool.
线程池内线程数可以为0吗,可以无限大吗?
答案:不可以为0,也不是无限大的。通过UV_THREADPOOL_SIZE可以修改线程池的线程数(默认为4),线程数最大值为128,最小值为1。
主线程任何时候都不会阻塞吗?
答案:不是的,主线程在特定的情况下是会阻塞的。Node.js的事件循环中有一个阶段是poll,poll阶段在特定情况下是会阻塞的。这就是下图服务启动起来没有任何用户请求的时候Event Loop执行一次的时间比有少量请求的时候还要长的原因。
图片来源:https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c
参考资料
https://nodejs.org/en/docs/guides/dont-block-the-event-loop/ https://medium.freecodecamp.org/what-exactly-is-node-js-ae36e97449f5 https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c https://jsblog.insiderattack.net/event-loop-and-the-big-picture-nodejs-event-loop-part-1-1cb67a182810
nodejs v8引擎的更多相关文章
- Nodejs V8引擎 fast property lookup
前言 之所以会研究这个东西,是我在网上找了一下各个语言的执行效率比较.好吧,我承认这是个无聊的东西,不过看看总是无妨,然而我惊讶的发现,有些测试声称Java,C,Nodejs是处在同一个效率级别参见链 ...
- nodejs v8引擎c++编译版本号升级教程
原GCC版本号:4.4.7. 目标:升级GCC到4.8.2.以支持C++11. yum install gcc-c++ 获取GCC 4.8.2包:wget http://gcc.skazkaforyo ...
- 深入出不来nodejs源码-V8引擎初探
原本打算是把node源码看得差不多了再去深入V8的,但是这两者基本上没办法分开讲. 与express是基于node的封装不同,node是基于V8的一个应用,源码内容已经渗透到V8层面,因此这章简述一下 ...
- 浅谈V8引擎中的垃圾回收机制
最近在看<深入浅出nodejs>关于V8垃圾回收机制的章节,转自:http://blog.segmentfault.com/skyinlayer/1190000000440270 这篇文章 ...
- google v8引擎常见问题
最近在项目中使用v8来进行扩展,下面简单说一下使用v8过程中遇到的一些问题. v8的多线程调用 最初调研v8的测试代码是单线程的,后来一个项目在多线程中使用,出现了一些问题,后来看到参考3中的才恍 ...
- V8引擎——详解
前言 JavaScript绝对是最火的编程语言之一,一直具有很大的用户群,随着在服务端的使用(NodeJs),更是爆发了极强的生命力.编程语言分为编译型语言和解释型语言两类,编译型语言在执行之前要先进 ...
- Chrome V8系列--浅析Chrome V8引擎中的垃圾回收机制和内存泄露优化策略
V8 实现了准确式 GC,GC 算法采用了分代式垃圾回收机制.因此,V8 将内存(堆)分为新生代和老生代两部分. 一.前言 V8的垃圾回收机制:JavaScript使用垃圾回收机制来自动管理内存.垃圾 ...
- v8引擎详解
引用网址: https://blog.csdn.net/swimming_in_it_/article/details/78869549 前言 JavaScript绝对是最火的编程语言之一,一直具有很 ...
- Node.js和Chrome V8 引擎了解
说起Node就不得不先介绍一个Chrome V8 引擎. 随着Web相关技术的发展,JavaScript所要承担的工作也越来越多,早就超越了“表单验证”的范畴,这就更需要快速的解析和执行JavaScr ...
随机推荐
- java EE ME SE有什么关系
1. Java SE(Java Platform,Standard Edition).Java SE 以前称为 J2SE.它允许开发和部署在桌面.服务器.嵌入式环境和实时环境中使用的 Java 应用程 ...
- 360全景图three.js与Photo-Sphere-Viewer-master 3D全景浏览开发
1.支持WebGL和canvas的浏览器 (IE10, IE11支持, 但在IE里移动图片时很卡, 不一定是全部人都有这情况) 2.Three.js (文件较大, 有官网demo, 可不下载, 下载p ...
- 【BZOJ3943】[Usaco2015 Feb]SuperBull 最大生成树
[BZOJ3943][Usaco2015 Feb]SuperBull Description Bessie and her friends are playing hoofball in the an ...
- 08.Curator缓存
可以利用ZooKeeper在集群的各个节点之间缓存数据.每个节点都可以得到最新的缓存的数据.Curator提供了三种类型的缓存方式:Path Cache,Node Cache 和Tree Ca ...
- #pragma预处理命令详解
#pragma预处理命令 #pragma可以说是C++中最复杂的预处理指令了,下面是最常用的几个#pragma指令: #pragma comment(lib,"XXX.lib") ...
- LINEAR HASH Partitioning
MySQL :: MySQL 8.0 Reference Manual :: 23.2.4.1 LINEAR HASH Partitioning https://dev.mysql.com/doc/r ...
- the source attachment does not contain the source for the file xxx.class无法关联到某个类
问题描述: 按下列操作添加相应路径(这里是错误操作) 该问题仍旧无法解决: 注意:这里spring-webmvc-4.1.7.RELEASE.JAR中确实包含AnntationMethodHandle ...
- 小米范工具系列之六:小米范 web查找器2.x版本发布
小米范web查找器是一款快速识别端口及服务的小工具. 此工具使用java 1.8以上版本运行. 下载地址:http://pan.baidu.com/s/1c1NDSVe 文件名web finder ...
- blockchain 区块链的开发,基于python或node js
现在很多人用node js做区块链的开发,因为点对点并发是区块链中的难点技术之一,而node js天然的对并发支持比较好,因此比较有优势. http://ecomunsing.com/build-yo ...
- gitlab卸载
1.停止gitlab gitlab-ctl stop 2.卸载gitlab(注意这里写的是gitlab-ce) rpm -e gitlab-ce 3.查看gitlab进程 ps aux | grep ...