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. Servlet+JSP 对外访问路径配置

    servlet类似 servlet配置为: <servlet>    <servlet-name>Demo01_OutWrite</servlet-name>    ...

  2. Leetcode刷题记录 旋转矩阵

    https://leetcode-cn.com/problems/spiral-matrix/submissions/ class Solution(object): def spiralOrder( ...

  3. Django学习之路04

    视图层 小白必会三板斧 HttpResponse render redirect django视图函数必须要给返回一个HttpResponse对象(render和redirect内部返回的也是一个Ht ...

  4. NSURLSession与NSURLConnection区别

    1. 使用现状      NSURLSession是NSURLConnection 的替代者,在2013年苹果全球开发者大会(WWDC2013)随ios7一起发布,是对NSURLConnection进 ...

  5. ActiveMQ学习总结(一)

    自己写的网上商城项目中使用了ActiveMQ,虽然相比于RabbitMQ,kafka,RocketMQ等相比,ActiveMQ可能性能方面不是最好的选择,不过消息队列其实原理区别不大,这里对学过的关于 ...

  6. 苹果会放弃iPhone吗?

    ​苹果会放弃iPhone吗?一般来讲,这是一个相当白痴的问题,苹果放弃iPhone的概率比唐僧放弃取经的概率要低20倍.前段时间回老家,正在学习英语的小侄子问我:"叔叔,苹果用英语怎么说呀? ...

  7. http客户端如何写

    使用wireshark协助,设置网卡本地,设置过滤器:http && (ip.src == 192.168.1.80 && ip.dst == 192.168.1.81 ...

  8. 网络地址转换NAT与端口地址转换PAT

    网络地址转换NAT与端口地址转换PAT 一.网络地址转换 NAT (Network Address Translation) 1.1.网络地址转换简介 需要在专用网(内网)连接到因特网的路由器上安装 ...

  9. 批量复制及执行命令shell脚本

    平时在处理一个或几个机器运行环境时,一个机器一个机器处理也能接受,但是如果是一批机器,几十或几百台,要是一台一台去安装环境,光是输入同一的命令,估计你自己都想吐,所有聪明的人会想一些偷懒的办法,确实可 ...

  10. swoole(2)swoole进程结构

    一:进程基本概念 系统中正在运行的一个程序,程序一旦运行就是进程 一个进程可以拥有多个线程 核心内容分为两部分:内存(进程创建时从系统分配的,它所创建的变量都会存储在这一块内存中).上下文环境 二:s ...