• JVM学习笔记-内存管理


    第一章 内存分配
    1. 内存区域。
        方法区和堆(线程共享),程序计数器 , VM栈 和 本地方法栈(线程隔离)。
        1) java虚拟机栈:线程私有。描写叙述的是java方法执行的内存模型:栈帧,用户存储 局部变量表。操作数栈。动态链接,方法出口等信息。
             局部变量表在编译时就可以全然确定。假设线程请求的栈深度大于 规定的深度,StackOverflowError.
        2) 本地方法栈,相似。

        3)堆:垃圾收集器管理的主要区域。

    线程共享。

        4)方法区: 各个线程共享。存储:载入的类信息。常量。静态变量,即时编译后的代码数据。习惯称作:永久待。

    能够不选择垃圾回收(特殊情况有必要)。

             执行时常量池(属于方法区),编译时期的字面量和符号引用。执行期间能够将新的常量放入常量池:String.intern() 方法。
        ‘
    2. 对象创建
        1) new的执行: 首先。是否能定位到一个类的符号引用。这个符号引用代表的类是否已被载入、解析和初始化。通过后,为新生对象分配内存。内存大小在类载入完后可确定。

    内存分配有两种方式:指针碰撞和空暇列表。

        对象头:这个对象是哪个类的实例,假设找到类的元数据信息,对象的哈希码,GC分代年龄等。
        最后一步是init,依照程序猿的意愿进行初始化。

        2) 对象的内存分布:对象头,实例数据。和对齐填充。

        3)对象訪问的两种方式:句柄訪问  和 直接指针訪问。

    栈中存放 reference引用


    3. 栈溢出
        1)假设线程请求的栈深度大于虚拟机所同意的最大深度,StackoverflowError
        2)假设虚拟机在扩展栈时无法申请足够内存。则 OutofMemoryError
        JDK5.0以后每一个线程堆栈大小为1M,曾经每一个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在同样物理内存下,减小这个值能生成很多其它的线程.可是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右一般小的应用, 假设栈不是非常深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比較大。须要严格的測试。

    threadstacksize选项解释非常相似,官方文档似乎没有解释,在论坛中有这样一句话:"-Xss is translated in a VM flag named ThreadStackSize”
  • 相关阅读:
    (一)Kafka0.8.2官方文档中文版系列入门指南
    Hbase TTL(Time To Live)详解
    java源码学习详解Object类
    设计模式详细解读简单工厂方法模式
    (二)Kafka0.8.2官方文档中文版系列API
    Scala对象相等性判断
    scala中跳出循环的3种方法
    wpf 中借助 Grid 实现随着 Form 大小变化而按比例自动改变宽度或高度。
    static and cache
    约定编程之 Dictionary 的 String 类型的 Key
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/9929509.html
Copyright © 2020-2023  润新知