IE有强制清理内存的方法,Chrome有V8

解决方案 »

  1.   

    以为是问题帖,原来LZ是想写php比js厉害。
    话说,没用过php不是很了解。
      

  2.   

    PHP是服务器端脚本,js是客户端脚本....php应该和java,C#去比
      

  3.   

    银行不能及时销毁记录也是一个巨大的缺陷!我每次取钱银行都记录起来,造成我的卡透支是非常“愚蠢”的方法,应该我取5次后就销毁记录,让我的卡得到释放,下次又可以重新取款而不要减少我的存款!
    for(var i=1;i<0x1000000;i++){
      var obj = new getMonery(1000);
      obj.balance-=1000;
      if(i%6==5)obj.balance=1000000.00;
    }
      

  4.   

    虚拟机回收内存基本上都是定时回收的,比如JAVA,这钟方式系统开销较小。
      

  5.   

    不是的, JavaScript是垃圾回收, JavaScript没有局部变量, 所有的变量其实都是一样的. V8引擎, 是当内存使用达到一个临界点的时候, 停止脚本的执行, 开始清扫垃圾, 完成后接执行着脚本.而PHP虽然也是脚本语言, 但是有更多的C或C++的影子, 比如传地址调用, 返回地址等等. PHP变量就是出了它的作用域, 立刻就销毁, 在语言设计上, 这比垃圾收集要简单. 当然和C++不同, PHP如果你其它地方引用了这个变量, 就不再销毁它, 而JavaScript仅仅是标记这个对象已经没有代码引用它, 可以进行回收, 但是真正回收是垃圾收集器运行的时候. 当然, 这和JavaScript的内存设计有关, 在分配的时候, JavaScript的变量可能(几乎一定)就是顺序的在一个公共的地方分配, 单独的挑出哪些不用这种方式是行不通的, 而PHP可能是在一个小的容器里分配, 可以集中的即时的销毁. 不过PHP的这种方式可能引起内存碎片, 而JavaScript甚至会自己整理内存, 把不销毁的对象移动到一个新位置.少了个析构函数, 包括Java都是一个巨大的损失, 这意味着你无法让释放或者关闭动作自动化. 你每次都需要写一个close函数, 如果这种机制不重要的话, C++以及JavaScript为什么要有构造函数(JavaScript的构造函数就是函数本身), 每次new一个对象, 然后调用一个init函数, 效果是一样的, 但是就是这一个小小的自动化, 是整个程序设计大大的简化了. 而JavaScript和Java没有析构函数, 可以说就是一个半残.
      

  6.   

    其实java和javascript都是很残废的东西  所以用了几十年还在用
    不知楼主是什么意思
    析构函数无非是人工的去释放内存  像c++之类的如果是new出来的对象是无法自动释放内存的  一般是通过析构函数人工的去释放  但缺点是如果程序员忘记去释放内存的话则这块内存一直不释放知道程序全部结束或溢出强制结束程序 
    而java是会自动的管理内存  无需程序员手动释放 但也可以根据一个方法去请求(是请求 不是命令)去释放某些内存 
    如果说灵活性或效率的话java是不如c++  
      

  7.   

    不知楼主是看了些什么书 
    管理内存  尤其对于很庞大的程序来说是件非常麻烦而且极易出错的事  java通过垃圾回收机制虽然效率上可能低了点  但解决了上边的问题 也不能说弊大于利 而且java也有一套很复杂的内存管理的东西  那个没哈好看  所以不敢说什么  楼主自己去查查 
    php不怎么了解 貌似门户网站用的多点   
      

  8.   

    学习受教了
    JavaScript当然有局部变量的,有作用域 ,生存的上下文环境
     
      

  9.   


    JavaScript没有作用域, JavaScript的变量作用域是语法硬性规定的, 函数内部的var变量, 你一样可以返回给外部, 本质上说, 所有JavaScript变量都是一样的. C++分栈变量和堆变量, 栈这个特性高级语言很少涉及到, 栈之所以统治编程语言这么多年, 就是因为它是一个非常高效的机制.举例来说, 比如一个程序分配2M的栈空间, 实际上变量除了字串好分配内存这种大内存需求, 整数,指针 和小的结构 这些通常的变量都是分配在栈上的, 实际上栈往往用不到几千字节, 但是这意味着任意多个函数, 这个线程内都是使用这2M的栈空间, 而且无需分配, 它一直在那里.同样函数和代码, 如果用JavaScript, 每次执行都需要重新给每个变量分配内存, V8引擎已经足够快了, JavaScript实际上也是预分配大量内存, 但是和栈不同, 它需要内存清理, 因为变量分配和销毁是直接和代码相关的. 而栈的使用与代码是无关的, 完全看变量的位置, 总之, 栈是一种先进先出的无需内存管理的机制.
      

  10.   

    HTML不是更烂, 乱的一塌糊涂, 人们还不是在用. 因为没得选择, 只此一家别无分店. 即使有人弄了一个更好, 更先进的网页标准, 以往的写好的那些网页怎么办? 制定标准的人必须考虑实际应用.我发这种贴就是希望看到大家不要被语言束缚死, 每种东西都有优缺点, 都需要改进. JavaScript如果有确定销毁机制, 必然有析构函数, JavaScript和Java之所以没有析构函数, 就是因为他的销毁策略无法设计析构函数. 而不是JavaScript不需要析构函数.
      

  11.   

    javascript为网页前端动态效果而生,而网页前端并不用太考虑效率,要知道web程序一旦页面刷新或跳转,所有资源都会被释放,所以一般情况下,连内存泄露这种天大的问题都不用在意,何况只是资源释放的及时性。所以js的机制是完全适合在web环境生存的,你把这个说成一个巨大缺陷,实在不能赞同你脱离了语言的应用环境单独去审视它的内存效率问题,感觉没有什么意义;如果像你这样判定语言好不好,我也可以说c++不能动态给对象添加成员,不灵活,c++不好
      

  12.   

    一百万次的循环哪,new那么多obj干嘛,和牛魔王比谁的虱子多?
      

  13.   

    回帖的某些人,对js的印象还是停留在web前端脚本这部分
      

  14.   

    给个传送门:JavaScript:The World's Most Misunderstood Programming Language
    http://www.crockford.com/javascript/javascript.html
    下面是带翻译的:
    http://blog.csdn.net/uoyevoli/article/details/744915
      

  15.   

    再放个Node.js的传送门吧:
    http://www.nodebeginner.org/index-zh-cn.html
      

  16.   


    赞同。nodejs,webApp,这些都与目前的前端交互脚本大不相同
      

  17.   

    如果仅仅局限于浏览器, 他们索性使用jQurery就行了.实际上除了汇编和C, 几乎所有我使用过的语言我都发过牢骚, C++也有很多弊端, 没有什么是完美的, 这不代表我不认可这种语言, 其实从C++, JavaScript, PHP, 这3们语言设计的都非常好, PHP的效率是个问题, 所以它基本上就是函数使用, 你很少需要自己设计库函数, 函数都是应用层面的. V8引擎把JavaScript的性能带入到一个新的境界, 所以其它平台才有可能使用它.但是正是在其它的平台, JavaScript对象不仅仅是个JavaScript对象, 就像XMLHttpRequest对象一样, 它可能是个很大的对象, 某些场合就是需要上百万次的new, 或者持续的生成新对象. Java鼓励对象复用, 因为new和删除对象的开销非常大, 可是如果对象复用, JavaScript或者Java的特点在哪里? 这两种语言就是号称随便的new, 不用考虑释放问题. 其实JavaScript的DOM文档, 浏览器内部做了很多特殊处理, 使人们不用太关心效率问题, 但是这是浏览器的设计优化的好, 不是JavaScript本身的问题不存在.如果每次使用一个对象, new完之后, 调用一个init函数初始化, 使用完了调用一个close函数释放资源(在某些场合必须这么做, 因为这个对象可能占用了系统资源, 而系统资源是有限的, Java这个问题就非常突出), 那么所谓面向对象的高效就丧失殆尽. 而C++语言只要把这个对象作为局部变量, 一切问题都不存在, 初始化写在构造函数里, 清理写在析构函数里, 干干净净, 丁点都不用担心内存泄漏, 我根本就没有new, 也就不用delete.有人可能觉得, 多些调用2个函数问题不大, 注意一下就行了, 我举个例子, 有一个C的库, 他有7,8千行代码, 上百个函数(也许更多). 它的每个函数开头和结尾都是这样的:
    void func(){
      VAR a,b,c,d,e,f...;
      init(a);
      init(b);
      ....
      init();
      ......
      功能代码.
      clear(..);
      clear(..);
      ...
      ...
      clear(b);
      clear(a);
    }
    他用到多少个变量, 它就要配对的调用多init和clear. 所以那7.8千行代码, 用C++来写可能1000行就够了. 如果用JavaScript来写, 可以省一半, 不用init, 如果每个函数不new, 难道弄几个公共变量, 来回init它?
      

  18.   

    楼主涉猎广泛啊,建议可以看看lisp
      

  19.   

    某些人就是说我了?
    你不去看看js的历史就直接下了判定?
    javascript出现还就是为了解决网页前端的交互问题,不知你除了网页前端还看到哪儿在使用javascript? asp.net可以在服务端使用js,但你熟悉js的历史就知道,微软那个叫jscript,当时微软想自己搞一套前端脚本取代ecmascript,最终没成功才有了jscript这么个畸形存在
      

  20.   


    哎,不要辜负我放的几个传送门唉,你去看一下node.js再想想自己说的话
      

  21.   

    node.js
    看了它的功能就知道,也是javascript的功能配合服务端代码实现的罢了,通讯方式无疑是ajax,调用服务端函数需要在回调函数中写代码,服务端代码负责将被请求的函数返回值包装传递到前端,你觉得它功能神奇无非是它是一个前后端代码配合使用的库罢了。
    看不出在这儿javascript发挥了除客户端交互以外的作用
      

  22.   

    哪里看出通讯方式是ajax了啊?
      

  23.   

    你这种辩驳的精神我无话可说,但你辩驳的论点直接体现了对web程序的认识不足
    目前后端的无刷新交互,都是用ajax,除了ajax只有html5的websocket服务端主动发送数据能动态更新,但websocket兼容性很差,目前还未能应用,而且也不是nodejs这种方式
    建议你还是补一补web的基础知识,免得哪天没有nodejs了,就抓瞎了,据我所知,nodejs可并没有普及,过度依赖它只会悲剧  
      

  24.   

    其实我真的不想再回复你的贴子了,我做了快三年web开发,
    我知道ajax是啥
    我知道啥是无刷新交互我只是奇怪,对于node.js这个javascript运行环境,你咋能扯到ajax上面
    别的不说了,多说无益。
      

  25.   


    对了,再给你普及下node.js的普及情况吧,免得你误导别人。github上node项目的情况:
    7.  Node(Joyent) 
    一套用来编写高性能网络服务器的JavaScript工具包。 
    Fork:2300
    Star:17197
    Pull Request:84
    分支:31
    上面那个7是指截止12年8月底,github上的项目被fork次数,node排第7名网易:
    发布nodejs游戏框架pomelo另外 淘宝,新浪也有在使用
    更不要提国外的微软,ebay,yahoonode诞生才两三年,已有5000多个npm包,社区非常活跃。没有普及?只是你没接触到而已。世界比你想象的大,frog。
      

  26.   

    一直把JS作为改善用户体验和减少服务器压力而使用的。写了上万行,也没碰到过for(var i=0;i<0x1000000;i++){这种情况。
    实现任何一种需求都有N种方法,像我们这种码农只有找出最好的一种方法,而不是像大牛一样去把最差的方法变成最好的。
      

  27.   

    靠!今天才看到居然还在诋毁我,
    别的不说,先鄙视一下你的为人,自己自动提出的懒得说了,我本就不想跟你废话,于是真的什么都不说,你居然紧接着又在诋毁人,这个为人方面自己去想再说技术方面,你做web都三年了,还连自己用的框架的实现原理都搞不清楚,还好意思在那宣扬
      

  28.   


    函数内部声明JS变量 不使用var  直接 xxx = xxx 外部就引用不到了貌似。
    还有最后句我迷糊了  栈不是先进后出么..
      

  29.   

    呵呵  比较赞同你的观点。所谓任何的js插件无非就是自己用js编写的通用的多功能的框架而已,这个所谓的nodejs确实是一个牛逼的框架,但是也逃脱不了js这个基础语言,涉及到的服务端和客户端无刷新交互,目前除了ajax再无其他,楼主确实不是很清楚web程序的一些原理和机制,也许他对于开发语言本身来说比较感兴趣,但他对nodejs这东西理解确实有误
      

  30.   

    楼主 你确实应该搞清楚js和服务端通信的原理,你所知道的这些js框架看起来多么实用,功能多么强大,不过就是开发者本身用js写出的脚本插件而已,就像我2年前看jquery一样,觉得jquery多么强大,多么好用,但是你看了jquery的源码之后,随着慢慢深入,你也可以写出这样实用的框架整合进自己的系统里
      

  31.   


    首先,我不是楼主
    至于上面争论的东西,我已无力吐槽你好歹nodejs入个门再来和我理论。。
      

  32.   

    js所有变量都是等同的, 但是其实在浏览器有一点不同, 就是全局变量是window的对象, 换句话说, 浏览器只有window一个变量, 其它的所谓全局变量都是他的属性, 这引起一个性能问题,就是写在页面上的语句会比在函数内部执行要慢一点. 因为每次使用一个变量都要看看他是不是window的属性, window的属性可能是不能赋值的, 有特殊处理, 这个检测拖慢速度.栈是先进后出的, 口误.
      

  33.   

    现代浏览器都清一色把js 编译成native code JIT 运行,还要什么销毁,都已经不是解释执行了
      

  34.   

    很想告诉你,nodejs不用看,因为绝对是一个js框架而已,你所看到的这些所谓的很炫的功能,就是封装的一些脚本,做了3年的web开发你连这点都没弄懂,真心觉得有点可惜
      

  35.   

    dennn       dedd