1)JVM体系概述

JVM体系结构概览

JVM参数调优及相关参数

JVM的参数类型

  • 标配参数:java-version;  java -help
  • X参数:-Xint 解释执行; -Xcomp 第一次使用就编译; -Xmixed 混合模式(先编译再执行)
  • XX参数:
    • Boolean类型:-XX:(+|-)属性

      • + 或者-某个属性值; +表示开启; -表示关闭
      • eg: -XX:+PrintGCDetails
    • kv设值类型:-XX:key=value
      • 说明:键值对赋值
      • eg: -XX:MetaspaceSize=128m;  -XX:MaxTenuringThreshold=15
    • 两个经典参数:-Xms 和 -Xmx
      • -Xms: 等价于-XX:InitialHeapSize
      • -Xmx:等价于-XX:MaxHeapSize

如果查看一个正在运行的java程序,是否开启jvm参数是否开启?具体值是多少?

jps -l
jinfo -flag PrintGCDetails 进程编号
jinfo -flag MetaspaceSize 进程编号
jinfo -flags 进程编号(所有配置:JVM配置 + 命令行中人工配置)

-XX:+PrintFlagsInitialJVM默认值

    • 主要查看初始默认
    • eg: java -XX:+PrintFlagsInitial
    • 符号:= 初始未更新过的值;=:由人为或JVM修改的值
  • -XX:+PrintFlagsFinal
    • 主要查看修改更新的内容
    • eg: java +PrintFlagsFinal -version
  • -XX:+PrintCommandLineFlags
    • 运行java命令的同时打印出参数
    • eg: java -XX:+PrintCommandLineFlags -version

JVM常用的基本参数

  • -Xms:

    • 初始大小内存,默认谓物理内存的1/64
    • 等价于:-XX:InitialHeapSize
  • -Xmx:
    • 最大分配内存,默认谓物理内存的1/4
    • 等价于:-XX:MaxHeapSize
  • -Xss:
    • 设置单个线程栈的大小,一般默认为512k ~ 1024k
    • 等价于:-XX:ThreadStackSize
  • -Xmn:
    • 设置年轻化大小
  • -XX:MetaspaceSize
    • 设置元空间大小:元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于,元空间并不在虚拟仙中,而是使用本地内存。因此默认情况下,元空间的大小仅受本地内存限制
    • -Xms 10m -Xmx 10m -XX:MetaspaceSize=1024M -XX:+PrintFlagsFinal
  • -XX:+PrintGCDetails
    • 输出GC的详细收集日志信息
    • GC
    • FULL GC

  • -XX:SurvivorRatio

    • 设置新生代中eden和s0/s1空间的比例,SurvivorRatio值就是设置eden区的比例占多少,s0/s1相同, 使用java -XX:+PrintGCDetails查看
    • 默认:-XX:SurvivorRatio=8, Eden:s0:s1=8:1:1
    • 假如:-XX:SurvivorRatio=4, 则Eden:s0:s1=4:1:1
  • -XX:NewRatio
    • 配置年轻代与老年代在堆结构的占比,NewRatio值就是设置老年代的占比,剩下的1给新生代,使用java -XX:+PrintGCDetails查看
    • 默认:-XX:NewRatio=2 新生代占1, 老年代占2,年轻代占整个堆的1/3
    • 假如:-XX:NewRatio=4 新生化占1, 老年化占4,年轻代占整个堆的1/5
  • -XX:MaxTenuringThreshold
    • 设置垃圾的最大年龄:即新生代经过多少次GC才进入老年代

另外一张图参考:

2) Java8以后的JVM

3)GC作用域

4)常见的垃圾回收算法

  • 引用计数
  • 复制
  • 标记清除
  • 标记整理

识别某个对象是否是可回收的两种方法

  • 引用计数法
  • 枚举根节点做可达性分析(根搜索路径)

GC roots 或是tacking GC的“根集合”就是一组必须活跃的引用

基本思路:通过一系列名为“GC Roots”的对象作为起始点,从这个被称为GC Roots的对象开始向下搜索,如果一个对象到GC Roots没有任何引用链相连时,则说明此对象不可用。也即给定一个集合的引用作为根出发,通过引用关系遍历对象图,能被遍历到的(可到达的)对象就被判定为存活;没有被遍历到的就自然被判定为死亡。

GC Roots对象

  • 虚拟机栈(栈帧中的局部变量区,也叫做局部变量表)中引用的对象。
  • 方法区中的类静态属性中引用的对象。
  • 方法区中常量引用的对象。
  • 本地方法栈中JNI(Native方法)引用的对象。

Full GC

JAVA系列-JVM的更多相关文章

  1. Java系列笔记(4) - JVM监控与调优

    目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之.通过学习,我觉得JVM ...

  2. Java系列笔记(4) - JVM监控与调优【转】

    Java系列笔记(4) - JVM监控与调优[转]   目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在 ...

  3. Java虚拟机JVM学习05 类加载器的父委托机制

    Java虚拟机JVM学习05 类加载器的父委托机制 类加载器 类加载器用来把类加载到Java虚拟机中. 类加载器的类型 有两种类型的类加载器: 1.JVM自带的加载器: 根类加载器(Bootstrap ...

  4. Java虚拟机JVM学习04 类的初始化

    Java虚拟机JVM学习04 类的初始化 类的初始化 在初始化阶段,Java虚拟机执行类的初始化语句,为类的静态变量赋予初始值. 在程序中,静态变量的初始化有两种途径: 1.在静态变量的声明处进行初始 ...

  5. Java虚拟机JVM学习03 连接过程:验证、准备、解析

    Java虚拟机JVM学习03 连接过程:验证.准备.解析 类被加载后,就进入连接阶段. 连接就是将已经读入到内存的类的二进制数据合并到虚拟机的运行时环境中去. 连接阶段三个步骤:验证.准备和解析. 类 ...

  6. Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

  7. Java虚拟机JVM学习01 流程概述

    Java虚拟机JVM学习01 流程概述 Java虚拟机与程序的生命周期 一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这 ...

  8. Java系列笔记(3) - Java 内存区域和GC机制

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  9. Java系列笔记(1) - Java 类加载与初始化

    目录 类加载器 动态加载 链接 初始化 示例 类加载器 在了解Java的机制之前,需要先了解类在JVM(Java虚拟机)中是如何加载的,这对后面理解java其它机制将有重要作用. 每个类编译后产生一个 ...

随机推荐

  1. IT培训的背后,是“韭菜”的躺赚梦!

    作者:九歌 本文转自公众号:Hack 本文只谈"骗局",不谈其他,绝不引战,如有错误,希望指出我会及时改正 导语 为什么要写这篇文章呢,近些年培训这个话题也比较火,很多在看这篇文章 ...

  2. (转载)Eclipse中使用SVN

    为了方便个人使用,转载过来的,如需查阅,请前往原文地址:http://www.cnblogs.com/wvqusrtg/p/4993849.html 1.在Eclipse里下载Subclipse插件 ...

  3. Geohash介绍

    Geohash介绍 Geohash是一种地址编码,能把二维的经纬度编码成字符串,某一区域范围内的经纬度是一致的,其中有编码长度控制区域的范围 精度参考 使用场景 实时LBS应用 LBS应用中,搜索某某 ...

  4. GNS3(1)——OSPF多区域配置

    GNS3(1)——OSPF多区域配置 RIP适用于中小网络,比较简单.没有系统内外.系统分区,边界等概念,用到不是分类的路由. OSPF适用于较大规模网络.它把自治系统分成若干个区域,通过系列内外路由 ...

  5. HTML笔记02

    网页中的颜色有三种表示方法 颜色单词:blue.green.red.yellow 10进制表示:rgb(255,0,0).rgb(0,255,0).rgb(0,0,255) 16进制表示:#ff000 ...

  6. [开源福利] Arithmetic Generator

    Arithmetic Generator Built with ❤︎ by Simon Ma ✨ A powerful arithmetic generator

  7. 一文看懂js中元素偏移量(offsetLeft,offsetTop,offsetWidth,offsetHeight)

    偏移量(offset dimension) 偏移量:包括元素在屏幕上占用的所有可见空间,元素的可见大小有其高度,宽度决定,包括所有内边距,滚动条和边框大小(注意,不包括外边距). 以下4个属性可以获取 ...

  8. TensorFlow Serving实现多模型部署以及不同版本模型的调用

    前提:要实现多模型部署,首先要了解并且熟练实现单模型部署,可以借助官网文档,使用Docker实现部署. 1. 首先准备两个你需要部署的模型,统一的放在multiModel/文件夹下(文件夹名字可以任意 ...

  9. 报错: raise ImproperlyConfigured('mysqlclient 1.3.13 or newer is required; you have %s.' % Database.__version__)

    Django2.0同步Mysql数据库时出现的问题 执行 python manage.py makemigrations 报错 # 报错位置 File "G:\python\lib\site ...

  10. angular -——组件样式修改不成功

    angular组件样式修改不成功! 自己定义的css可以成功 组件的不行 style在模板字符串里 直接没有 class 是显示的 但是样式不生效 加上面 即可,为什么?我也不太清楚.有知道答案的请回 ...