
/*=============================================================================================
	author:ZhaoJun
	version:1.2
	email:2732810281@qq.com
=============================================================================================*/


//严格模式
/*-------------------------------------------------------------------------------------------*/	
'use strict';
const v8 = require('v8');
const fs = require("fs");
/*-------------------------------------------------------------------------------------------*/

// v8信息的操作
/*-------------------------------------------------------------------------------------------*/	
class info
{
	static shot(file)
	{ 
		if(file)
		{
			const stream = v8.getHeapSnapshot();
			let writer=fs.createWriteStream(file)
			stream.pipe(writer);			
		}
		else
		{
			return new Promise
			(
				(res,rej)=>
				{
					let str=''
					stream.on
					(
						'data',(data)=>
						{
							str+=data
						}
					)
					stream.on
					(
						'end',(data)=>
						{
							if(data)str+=data
							res(str)
						}
					)
					stream.on
					(
						'error',(err)=>
						{
							rej(err)
						}
					)
				}
			)
		}
	}

	static statis()
	{
		return v8.getHeapStatistics()
		//does_zap_garbage 是一个 0/1 布尔值，表示是否启用了 --zap_code_space 选项。 这使得 V8 用位模式覆盖堆垃圾。 
		//RSS 占用空间（常驻内存集）会变得越来越大，因为它不断触及所有堆页面，这使得它们不太可能被操作系统交换出。

		//number_of_native_contexts native_context 的值是当前活动的顶层上下文的数量。 随着时间的推移，此数字的增加表示内存泄漏。
		//number_of_detached_contexts detached_context 的值是已分离但尚未回收垃圾的上下文数。 该数字不为零表示潜在的内存泄漏。
	}

	static space()
	{
		return v8.getHeapSpaceStatistics()
	}

	static flag(flag)
	{
		// 打印GC事件 --trace_gc
		// 关闭打印GC事件 --notrace_gc
		// 暴露gc --expose-gc，加这个参数后，node可调用global.gc()，手动gc（需启动程序时就设置）
		// 开启调试模式--inspect（需启动程序时就设置）
		//PM2 --node_args=""
		if(flag)v8.setFlagsFromString(flag);
	}

	static serialize(data)
	{
		return v8.serialize(data)
	}

	static deserialize()
	{
		return v8.deserialize(data)
	}

}
/*-------------------------------------------------------------------------------------------*/    
module.exports=info;