zoukankan      html  css  js  c++  java
  • JVM堆的说明以及调优(包括GC)

    堆的内存结构图:

     堆的逻辑结构图

    代码调试堆:

    package com.edu.jvm;
    
    /**
     * @作者 five-five
     * @创建时间 2020/10/8
     */
    public class Test05 {
        public static void main(String[] args) {
            //返回虚拟机试图使用的最大内存
            long maxMemory = Runtime.getRuntime().maxMemory();//以字节为单位b
            //返回JVM的初始化总内存
            long totalMemory = Runtime.getRuntime().totalMemory();
            System.out.println("虚拟机试图使用的最大内存	"+maxMemory+"b	"+maxMemory/(1024*1024)+"MB");
            System.out.println("JVM总内存	"+totalMemory+"b	"+totalMemory/((double)1024*1024)+"MB");
            System.out.println(Math.round(maxMemory/totalMemory));
    
        }
    }
    OOM解决方案:1.尝试扩大堆内存看结果,2.分析内存,看一下那个地方出现了问题(专业工具)
    运行时指令:-Xms1024m -Xms1024m -XX:+PrintGCDetails

    打印结果如下:

     计算可以得出:305664+699392=1,005,056K=~981(此时说明元空间并没有占用堆的物理内存)

    GC常用算法:

    • 引用计数法

    • 复制算法

     

    •  标记清除算法

     总结:

    JVM在进行GC时,并不是对着三个区域统一回收。大部分时候,回收都是新生代

    1. 新生代
    2. 幸存区
    3. 老年区

    GC两种类:

    1. 轻GC(普通的GC)
    2. 重GC(全局GC)

    这几个题心里必须有数:

    1. JVM的内存模型和分区~详细到每个区放什么?
    2. 堆里面的分区有哪些?说他们的特点?
    3. GC的算法有哪些?标记清除法、标记压缩、复制算法、引用计数器,怎么用的?
    4. 轻GC和重GC分别在什么时候发生?

    算法总结:

    1. 内存效率:复制算法>标记清除算法>标记压缩算法
    2. 内存整齐度:复制算法=标记压缩算法>标记压缩算法
    3. 内存利用率:标记压缩算法=标记清除算法>复制算法

    (优解)分代收集算法:

    • 年轻代:

        存活率低=====使用复制算法

    • 老年代:

        区域大,存活率高========使用标记清除(内存碎片不多)+标记压缩算法

  • 相关阅读:
    tile38 复制配置
    The Guardian’s Migration from MongoDB to PostgreSQL on Amazon RDS
    tile38 一款开源的geo 数据库
    sqler sql 转rest api 的docker 镜像构建(续)使用源码编译
    sqler sql 转rest api javascript 试用
    sqler sql 转rest api redis 接口使用
    sqler sql 转rest api 的docker image
    sqler sql 转rest api 的工具试用
    apache geode 试用
    benthos v1 的一些新功能
  • 原文地址:https://www.cnblogs.com/five-five/p/13792945.html
Copyright © 2011-2022 走看看