zoukankan      html  css  js  c++  java
  • 内存分配

    分配过程:

    1. 编译器通过逃逸分析,确定对象是在栈上分配还是在堆上分配。如果是在堆上分配,则进入选项2.
    2. 如果tlab_top + size <= tlab_end,则在在TLAB上直接分配对象并增加tlab_top 的值,如果现有的TLAB不足以存放当前对象则3.
    3. 重新申请一个TLAB,并再次尝试存放当前对象。如果放不下,则4.
    4. 在Eden区加锁(这个区是多线程共享的),如果eden_top + size <= eden_end则将对象存放在Eden区,增加eden_top 的值,如果Eden区不足以存放,则5.
    5. 执行一次Young GC(minor collection)。
    6. 经过Young GC之后,如果Eden区任然不足以存放当前对象,则直接分配到老年代。

    对象不在堆上分配的情况有两种:TLAB栈上分配

    之所以在TLAB(Thread Local Allocation Buffer)上分配是因为TLAB是线程私有的,没有锁开销,在Eden上分配需要加锁

    Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配。

     

    关于JVM的一个不错的博客:

    《聊聊JVM的专栏》

  • 相关阅读:
    Postgres的TOAST技术
    Postgresql 分区表 一
    Postgresql 用户管理
    Linux FIO
    haproxy
    RHEL7/CentOS7 Network Service开机无法启动的解决方法
    Cockroachdb 四、用户管理及授权
    Cockroachdb 三、副本设置
    Cockroachdb 二、手动部署
    Cockroachdb 一、系统环境
  • 原文地址:https://www.cnblogs.com/drizzlewithwind/p/6666244.html
Copyright © 2011-2022 走看看