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. 内存利用率:标记压缩算法=标记清除算法>复制算法

    (优解)分代收集算法:

    • 年轻代:

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

    • 老年代:

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

  • 相关阅读:
    php array function
    scrum敏捷开发重点介绍
    PHP文件操作
    正则
    PHP面向对象
    PHP数组
    PHP函数参数
    PHP运算符优先级
    PHP判断变量类型和类型转换的三种方式
    PHP变量的传值和引用
  • 原文地址:https://www.cnblogs.com/five-five/p/13792945.html
Copyright © 2011-2022 走看看