一篇文章总结JVM

一文总结JVM

java类加载过程

类从被加载到JVM到卸载为止,整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载七个阶段
在这里插入图片描述

类加载器分类

  • 启动类加载器/Bootstrap ClassLoader
    在HotSpot虚拟机中,Bootstrap ClassLoader用C++语言编写并嵌入JVM内部,主要负载加载JAVA_HOME/lib目录中的所有类,或者加载由选项-Xbootcalsspath指定的路径下的类;

  • 拓展类加载器/ExtClassLoader
    负载加载JAVA_HOME/lib/ext目录中的所有类型,或者由参数-Xbootclasspath指定路径中的所有类型;

  • 应用程序类加载器/AppClassLoader
    负责加载用户类路径ClassPath下的所有类型,一般情况下为程序的默认类加载器;
    ExtClassLoader和AppClassLoader的父类都是ClassLoader

  • 自定义加载器
    Java虚拟机规范将所有继承抽象类java.lang.ClassLoader的类加载器,定义为自定义类加载器;

双亲委派

  • 双亲委派模型
    在这里插入图片描述

  • 双亲委派过程
    当一个类加载器收到类加载任务时,立即将任务委派给它的父类(并不是java含义中的父类)加载器去执行,直至委派给最顶层的启动类加载器为止。如果父类加载器无法加载委派给它的类时,将类加载任务退回给它的下一级加载器去执行;
    除了启动类加载器以外,每个类加载器拥有一个父类加载器,用户的自定义类加载器的父类加载器是AppClassLoader;

  • 双亲委派优点

  1. 避免类的重复加载
    双亲委派模型可以保证全限名指定的类,只被加载一次;
  2. 沙箱安全机制
    自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
    双亲委派模型不具有强制性约束,是Java设计者推荐的类加载器实现方式;

打破双亲委派机制

JVM内存模型

  • jvm的主要组成部分
    jvm主要由类装载子系统、执行引擎,运行时数据区组成

在这里插入图片描述


  • 可以理解为由很多个线程栈所组成的内存区域,JVM会给每个单独的线程开辟一个独立的栈空间
  • 栈帧
    栈帧用于存储局部变量、操作数栈,动态链接,方法出口,一个方法对应特定的栈帧内存区域,这也是为什么递归调用场景,如果没有出口将会导致栈内存溢出
  • 本地方法栈
    带有native关键字的方法的方法栈

  • 堆分为年轻代(edem区,S0,S1),老年代
  • 垃圾回收
    minor GC,full GC
  • 元空间
    存放类信息

常用命令

jps

查看进程
在这里插入图片描述

jmap

jmap -histo

  • jmap -histo 25124
    查看25124进程对应的内存信息,实例个数和所占用的内存
    
     num     #instances         #bytes  class name
    ----------------------------------------------
       1:        232314       52764168  [B
       2:        360321       47344648  [C
       3:         25177       31904624  [I
       4:        165861        3980664  java.lang.String
       5:         38558        3393104  java.lang.reflect.Method
       6:         50254        3046304  [Ljava.lang.Object;
       7:        105103        2238208  [Ljava.lang.Class;
       8:         18531        1476256  [S
       9:         16513        1343104  [Ljava.util.HashMap$Node;
      10:         27392        1314816  java.util.HashMap
      11:         34464        1102848  java.util.HashMap$Node
      12:          9614        1075616  java.lang.Class
      13:         29226         935232  java.util.concurrent.ConcurrentHashMap$Node
      14:         38277         918648  java.lang.StringBuilder
      15:         18214         728560  java.util.LinkedHashMap$Entry
      16:         18896         604672  java.lang.ref.WeakReference
      17:          9621         538776  java.util.LinkedHashMap
      18:         10492         450368  [Ljava.lang.reflect.Method;
      19:          6193         445896  java.lang.reflect.Field
      20:           231         379696  [Ljava.util.concurrent.ConcurrentHashMap$Node;
      21:         22519         360304  java.util.HashSet
      22:         14480         347520  java.util.ArrayList
      23:         10298         329536  java.util.ArrayList$Itr
      24:          9050         309152  [Ljava.lang.String;
      25:
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值