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. python __import__动态模块

    1.只限解释器内部自己使用. 条件:test.lianx_2.py中的代码: class a(object): def __init__(self,name): self.name=name def ...

  2. HTTP的响应码?

    响应头对浏览器来说很重要,它说明了响应的真正含义.例如200表示响应成功了,302表示重定向,这说明浏览器需要再发一个新的请求. l 200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览 ...

  3. 月薪20k+的测试工程师都会这项技能!

    一说到测试,很多人认为就是在一直"点点点"找bug的重复性工作,这是早期手工测试给人的刻板印象,随着测试行业的发展,"会代码"越来越成为测试工程师的一个标签. ...

  4. 重大改革!Python将被加入高考科目!

    未来大学生将分为两种:一种是编程好的人,另一种是编程超好的人. Python 将被纳入高考科目 近期,浙江省信息技术课程改革方案出台,Python 确定进入浙江省信息技术高考,从2018年起浙江省信息 ...

  5. 对javascript EventLoop事件循环机制不一样的理解

    前置知识点: 浏览器原理,浏览器内核5种线程及协作,JS引擎单线程设计推荐阅读: 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理 [FE]浏览器渲染引擎「内核」 js异步编程,Promise ...

  6. 「NOIP 2017」列队

    题目大意:给定一个 $n times m$ 的方阵,初始时第 $i$ 行第 $j$ 列的人的编号为 $(i-1) times m + j$,$q$ 次给出 $x,y$,让第 $x$ 行 $y$ 列的人 ...

  7. springboot+jwt实现token登陆权限认证

    一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程:对小项目而已是个 ...

  8. Visual studio2019配置OPENCV 时属性管理器中没有Microsoft.Cpp.x64.user的解决办法

    方法一:重新下载Visual studio2017,再次打开2019就会出现Microsoft.Cpp.x64.user,感觉有些麻烦,也占电脑空间,推荐方法二. 方法二:与方法一原理相同,下载201 ...

  9. 给你的Kubernetes集群建一个只读账户(防止高管。。。后)

    给你的Kubernetes集群建一个只读账户 需求:我们知道搭完k8s集群会创建一个默认的管理员kubernetes-admin用户该用户拥有所以权限,有一天开发或测试的同学需要登录到k8s集群了解业 ...

  10. 上周 GitHub 热点速览 vol.09:手撕 LeetCode 一日 star 破两千

    作者:HelloGitHub-小鱼干 摘要(用于 公众号/博客园等地方):上周 GitHub 趋势榜相较上上周就如同前故事一般,跌到不行,无论是新晋开源小项,还是坚挺老项目,Star 增长量都不如之前 ...