js object类型转换 内存泄漏 垃圾回收机制

-------------------------------------------------------------*************

- object 变量名存储在栈里面,存储的是引用地址 ,指向堆里面的对象内容数据;

- 内存泄漏

  + 发生条件:新对象不断创建,旧对象却不清除;

为了避免内存泄漏,有垃圾及回收机制

- 垃圾回收机制(gc)

  + 当对象的引用地址在栈中没有引用时,内存占比过高,垃圾回收车会将其清除。

  (前提:内存占比过高,object=null;如果引用对象的变量不全设为null不清除,全设为null不再引用了才有可能被清除掉;这个垃圾回收车不确定时间来。)

eg:

  1、object对象同字符串之间的转换(包括   JSON字符串)

   var obj={a:1};

console.log(String(obj));//[object Object] 所有的对象转换为字符串就会变成这样

console.log(JSON.stringify(obj));//{"a":1} 将object对象转换为字符串(JSON字符串)

console.log(JSON.parse(‘{"a":1}‘));//将JSON字符串转换为对象

  2、object对象,键(key)-属性名;值(value)-属性值;键值对

     栈 堆 

   var obj1=JSON.parse(JSON.stringify(obj)); //将obj对象转换成字符串再转换成对象重新赋值给obj2,这时所指向的堆区域不同了即引用地址不同了

console.log(obj,obj1); //{a: 10} {a: 1}结果不一样了,说明指向不同的两个堆区域

console.log(JSON.stringify(obj),JSON.stringify(obj1)); //{"a":10} {"a":1}

console.log(obj1===obj); //false

变量名存储的是引用地址

var obj2=obj;//将引用地址赋值给obj2

obj.a=10;

console.log(obj2.a);//10 结果一样,说明存储的引用地址一样


存在栈中,修改的是值

var num=3;

var num1=num;

num=10;

console.log(num1);//3 num1没有再继续改变

存在堆中,修改引用地址值的内容,地址不会发生改变

   //  存在堆中,修改引用地址值的内容,地址不会发生改变

// var obj1=JSON.parse(JSON.stringify(obj));

// console.log(obj1===obj);//这俩肯定引用地址不一样

var obj2=obj;//将引用地址赋值给obj2

console.log(obj2===obj);//true

obj.a=50; //只改变引用地址值的内容

console.log(obj2===obj);//true 这俩引用地址还是一样吧

console.log(obj,obj2); //{a: 50} {a: 50}

var obj2={a:10,b:{a:20}}; //现在我重新赋值给obj2,改变地址了

console.log(obj2===obj);//false

console.log(obj,obj2);//{a: 1} {a: 10, b: {…}}不一样了

原文地址:https://www.cnblogs.com/miniSkytrue/p/12099529.html

时间: 2024-08-27 19:48:52

js object类型转换 内存泄漏 垃圾回收机制的相关文章

[CLR via C#]21. 自动内存管理(垃圾回收机制)

目录 理解垃圾回收平台的基本工作原理 垃圾回收算法 垃圾回收与调试 使用终结操作来释放本地资源 对托管资源使用终结操作 是什么导致Finalize方法被调用 终结操作揭秘 Dispose模式:强制对象清理资源 使用实现了Dispose模式的类型 C#的using语句 手动监视和控制对象的生存期 对象复活 代 线程劫持 大对象 一.理解垃圾回收平台的基本工作原理 值类型(含所有枚举类型).集合类型.String.Attribute.Delegate和Event所代表的资源无需执行特殊的清理操作.

JS学习之生命周期与垃圾回收机制

生命周期 变量或者函数在相应的作用域里存在的时间 局部变量和局部函数:不再使用就是生命周期的结束,在函数内声明,当函数执行完毕后,这个变量就不存在了 全局变量和全局函数:当声明完成以后在整个页面中都可以用,当页面关闭的时候生命周期结束 垃圾回收机制: 变量或者函数存在于内存当中,变量在使用完以后,没有在其他地方在使用就会被清除用来释放内存.垃圾回收机制会按照固定的时候周期性的执行 1 function test(){ 2 var n=10; // 在函数内声明,局部变量,在函数外面是访问不到的

Java虚拟机--垃圾回收机制

Java与C++相比,具有动态分配内存和垃圾回收机制的技术优势,使得我们不用把精力集中在内存的管理上,那我们为什么还要去了解GC和内存分配呢?原因很简单:当需要排查各种内存溢出.内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些"自动化"的技术实施必要的监控和调节. 1.为什么进行垃圾回收  随着程序的运行,系统内存中存在的对象实例.各种变量越来越多,如果不进行垃圾回收,会影响到程序的性能,当占用内存过多时,还会产生OOM等系统异常. 2.哪些内存需要回收 关于

JVM垃圾回收机制总结(7) :调优方法

JVM调优工具 Jconsole,jProfile,VisualVM Jconsole : jdk自带,功能简单,但是可以在系统有一定负荷的情况下使用.对垃圾回收算法有很详细的跟踪.详细说明参考这里 JProfiler :商业软件,需要付费.功能强大.详细说明参考这里 VisualVM :JDK自带,功能强大,与JProfiler类似.推荐. 如何调优 观察内存释放情况.集合类检查.对象树 上面这些调优工具都提供了强大的功能,但是总的来说一般分为以下几类功能 堆信息查看 可查看堆空间大小分配(年

JS高程中的垃圾回收机制与常见内存泄露的解决方法

起因是因为想了解闭包的内存泄露机制,然后想起<js高级程序设计>中有关于垃圾回收机制的解析,之前没有很懂,过一年回头再看就懂了,写篇博客与大家分享一下. #内存的生命周期: 分配你所需要的内存: 由于字符串.对象等没有固定的大小,js程序在每次创建字符串.对象的时候,程序都会分配内存来存储那个实体. 使用分配到的内存做点什么. 不需要时将其释放回归: 在不需要字符串.对象的时候,需要释放其所占用的内存,否则将会消耗完系统中所有可用的内存,造成系统崩溃,这就是垃圾回收机制所存在的意义. 所谓的内

Java垃圾回收机制以及内存泄漏

原文地址 前言 在segmentfault上看到一个问题:java有完善的GC机制,那么在java中是否会出现内存泄漏的问题,以及能否给出一个内存泄漏的案例.本问题视图给出此问题的完整答案. 垃圾回收机制简介 在程序运行过程中,每创建一个对象都会被分配一定的内存用以存储对象数据.如果只是不停的分配内存,那么程序迟早面临内存不足的问题.所以在任何语言中,都会有一个内存回收机制来释放过期对象的内存,以保证内存能够被重复利用. 内存回收机制按照实现角色的不同可以分为两种,一种是程序员手动实现内存的释放

内存泄漏与垃圾回收机制

内存泄漏与垃圾回收机制 什么是内存泄漏? 程序的运行需要内存,只要程序提出要求,操作系统或者运行是就必须供给内存.对于持续运行的服务进程,必须及时释放内存,否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃.不再用到的内存,没有及时释放,就叫做内存泄漏. 有些语言(比如c语言)必须手动释放内存,程序员负责内存管理.这很麻烦,所以大多数语言提供自动内存管理,减轻程序员的负担,这被称为"垃圾回收机制". javascript垃圾回收机制原理: 解决内存的泄露,垃圾回收机制会定期(周

java中存在垃圾回收机制,但是还会有内存泄漏的问题,原因是

答案是肯定的,但不能拿这一句回答面试官的问题.分析:JAVA是支持垃圾回收机制的,在这样的一个背景下,内存泄露又被称为"无意识的对象保持".如果一个对象引用被无意识地保留下来,那么垃圾回收器不仅不会处理这个对象,而且也不处理被这个对象引用的其它对象."内存泄露"就是内存中某些内存不可被回收. 举个例子:如果对一个栈(Stack类)先是进行入栈操作,之后再进行出栈操作,那么弹出来的对象将不会被当做垃圾回收,即使使用栈的客户程序不再引用这些对象,因为栈内部存在着对这些已

js的垃圾回收机制

Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理:是当变量进入环境时,将这个变量标记为“进入环境”.当变量离开环境时,则将其标记为“离开环境”.标记“离开环境”的就回收内存. 工作流程: 1.    垃圾回收器,在运行的时候会给存储在内存中的所有变量都加上标记. 2.    去掉环境中的变量以及被环境中的变量引用的变量的标记. 3.    再被加上标记的会被视为准备删除的变量. 4.    垃圾回收器完成内存清除工作,销毁那