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. js 实现排序算法 -- 希尔排序(Shell Sort)

    原文: 十大经典排序算法(动图演示) 希尔排序 1959年Shell发明,第一个突破O(n2)的排序算法,是简单插入排序的改进版.它与插入排序的不同之处在于,它会优先比较距离较远的元素.希尔排序又叫缩 ...

  2. Memcached笔记——(四)应对高并发攻击

    近半个月过得很痛苦,主要是产品上线后,引来无数机器用户恶意攻击,不停的刷新产品各个服务入口,制造垃圾数据,消耗资源.他们的最好成绩,1秒钟可以并发6次,赶在Database入库前,Cache进行Mis ...

  3. Ionic3学习笔记(六)存储之使用 SQLite

    本文为原创文章,转载请标明出处 目录 安装 CURD操作 1. 安装 命令行输入 ionic cordova plugin add cordova-sqlite-storage npm install ...

  4. Java equals和==的理解

    一.简介 ==: == 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象.比较的是真正意义上的指针操作. 1.比较的是操作符两端的操作数是否是 ...

  5. 我们一起学React Native(一):环境配置

    最近想在项目中实现跨平台,对比一下主流的实现方式,选用了React Native.参考网上的教程,对于一直都是原生移动端开发,对前端的知识不是很了解的,感觉入门不是特别简单.于是打算把学习React ...

  6. JDK_Packages_java_utils

    utils包需要关注的主要有 ​ 集合框架.并发包.函数式编程.观察者模式@see PropertyChangeSupport java.util(集合框架) Contains the collect ...

  7. 从社交到IP 庞大手游玩家大军迈向社群化之路

    庞大手游玩家大军迈向社群化之路" title="从社交到IP 庞大手游玩家大军迈向社群化之路"> 移动互联网及相关智能设备的快速迭进,不仅改变了我们的生活方式,也彻 ...

  8. 简单的java开源图床

    出于自用的目的,又找不到Java写的开源的程序,然后使用开源上传组件bootstrap-fileinput用 Spring Boot 写了一个图床 目前支持:七牛云,阿里云 GitHub: https ...

  9. 关于vue+element-ui项目的分页,返回默认显示第一页的问题解决

    关于vue+element-ui项目的分页,返回默认显示第一页的问题解决     问题描述 当前页面如下: 然后点击页码跳到第3页,然后在第三页点击页面链接跳转到新的页面 然后在新页面点击返回按钮,返 ...

  10. flask 参数校验

    校验参数是否存在,不存在返回400 @app.route('/check',methods=['POST']) def check(): values = request.get_json() req ...