zoukankan      html  css  js  c++  java
  • 《深入理解java虚拟机》笔记1

    java程序运行时的内存空间,按照虚拟机规范有下面几项:

    (1)程序计数器  

           指示下条命令执行地址。当然是线程私有,不然线程怎么能并行的起来。 不重要,占内存很小,忽略不计。

    (2)方法区

          这个名字很让我迷惑。这里面装的其实是程序运行需要的类文件,常量,静态变量等。作用容易明白。

          程序运行时,执行代码先得装入内存,当然java好像是在第一次用到时才加载,这样可以避免装入无用的类,节省内存。

          在HosSpot上,方法区现今和永久代是同一个区域。我就这么理解了,虽然作者解释说其实这两者根本不是同一个概念。

          概念暂时不大关心,垃圾回收是实实在在工作中用到的。

    (3)本地方法栈

          存储Native本地方法中用到的局部变量表和操作数栈,动态链接,方法出口等。作用和(4)中无区别,而且在HotSpot上本地方法栈与java虚拟机栈是合二为一的。

    (4)Java虚拟机栈

          线程私有

          存储java方法中用到的局部变量表和操作数栈,动态链接,方法出口等。

          在实际工作中会遇到栈内存溢出,StackOverflowError,不过以我的经验,如果出现栈溢出,绝大多数都是死循环递归造成的。

    (5)堆

         堆在各线程见是共享的。

         这个是用的最多的。有好多人甚至以为java运行的需要的内存就只有这个,果果-Xmx可以指定堆可分配的最大值。-Xms指定堆最小分配。

         如果-Xms堆不够用时,会自动扩展,当扩展到-Xmx的值,仍然不够,就内存溢出了。OutOfMemoryError。

         理论上所有的对象实例和数组都是在堆上分配的,但是JIT编译器可以聪明的做很多事情,也许有些对象的使用范围是局限在某些方法中的,这样就可以在栈上分配,

         毕竟栈上分配的内存管理要容易的多,用完即抛,不需要交给垃圾回收器来处理。

         当然,写代码的人最好有个谱,什么时候该局部变量,什么时候需要类变量,把自己写的破代码全交给编译器去吭哧吭哧优化,一方面它不能完全优化的完美,

         另一方面也占用cpu时间(哎,有感而发,破代码见得太多了)

  • 相关阅读:
    SVG
    GML、SVG、VML的比较
    用VS.NET中的测试工具测试ASP.NET程序
    Ajax.NET 初步应用
    解决“未能创建 Mutex”的问题(转)
    .net捕获全局异常并且记录日志、多线程方式发送邮件提醒
    DataTable导出到Excel时身份证号信息自动转换为科学计数法的解决方案
    js三级联动地址选择
    .net通过一般处理程序模拟用户控件数据保持、Ispostback 【第二版将html与ashx文件分开】
    .net通过一般处理程序模拟用户控件数据保持、Ispostback
  • 原文地址:https://www.cnblogs.com/zwm512327/p/3515667.html
Copyright © 2011-2022 走看看