• JVM 内存


    堆(Heap)

    堆是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。但是随着JIT 编译器的发展与逃逸分析技术的逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化发生,所有的对象都分配在堆上也渐渐变得不是那么“绝对”了。


    堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC 堆”。
    堆的大小可以通过 -Xms (最小值)和 -Xmx (最大值)参数设置,-Xms 为 JVM 启动时申请的最小内存,默认为操作系统物理内存的 1/64 但小于 1G,-Xmx 为 JVM 可申请的最大内存,默认为物理内存的 1/4 但小于1G,默认当空余堆内存小于 40% 时,JVM 会增大 Heap 到 -Xmx 指定的大小,可通过 -XX:MinHeapFreeRation= 来指定这个比列;当空余堆内存大于70%时,JVM 会减小 heap 的大小到 -Xms 指定的大小,可通过XX:MaxHeapFreeRation= 来指定这个比列,对于运行系统,为避免在运行时频繁调整 Heap 的大小,通常 -Xms 与 -Xmx 的值设成一样。

    如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java 堆中还可以细分为:新生代和老年代;
    新生代:程序新创建的对象都是从新生代分配内存,新生代由Eden Space和两块相同大小的Survivor Space(通常又称S0和S1或From和To)构成,可通过-Xmn参数来指定新生代的大小,也可以通过-XX:SurvivorRation来调整Eden Space及SurvivorSpace的大小。
    老年代:用于存放经过多次新生代GC仍然存活的对象,例如缓存对象,新建的对象也有可能直接进入老年代,主要有两种情况:1、大对象,可通过启动参数设置-XX:PretenureSizeThreshold=1024(单位为字节,默认为0)来代表超过多大时就不在新生代分配,而是直接在老年代分配。2、大的数组对象,且数组中无引用外部对象。
    老年代所占的内存大小为-Xmx对应的值减去-Xmn对应的值。

    GC 算法

    Young collector
    Old collector
    JVM option
    Serial (DefNew)
    Serial Mark-Sweep-Compact
    -XX:+UseSerialGC
    Parallel scavenge (PSYoungGen)
    Serial Mark-Sweep-Compact (PSOldGen)
    -XX:+UseParallelGC
    Parallel scavenge (PSYoungGen)
    Parallel Mark-Sweep-Compact (ParOldGen)
    -XX:+UseParallelOldGC
    Serial (DefNew)
    Concurrent Mark Sweep
    -XX:+UseConcMarkSweepGC 
    -XX:-UseParNewGC
    Parallel (ParNew)
    Concurrent Mark Sweep
    -XX:+UseConcMarkSweepGC 
    -XX:+UseParNewGC
    G1
    -XX:+UseG1GC

     

  • 相关阅读:
    webpack 学习
    文件操作
    关于列表remove的操作和字符串split的操作新领悟
    深浅拷贝和基础类型补充
    小数据池和编码
    字典和集合
    列表和元组
    字符串理论
    递归遍历多层列表
    基本数据类型和操作
  • 原文地址:https://www.cnblogs.com/weiweifeng/p/7462303.html
Copyright © 2020-2023  润新知