首页 > 其他分享 >JVM(一)

JVM(一)

时间:2023-06-17 16:11:34浏览次数:37  
标签:标记 对象 回收 GC 垃圾 JVM 加载

一、JVM介绍

1、运行 Java 字节码的虚拟机。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。

2、负责程序运行时的内存管理。提供了垃圾自动回收机制,无需程序员手动释放内存

3、提供类加载机制,将字节码文件转为机器码

4、提供异常处理机制

 

 在字节码转变为机器码这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行

 

三、编译型&解释型语言

1、编译型语言:编译器一次性把源代码转变为机器码。执行速度快,开发效率低。例如c++,c

2、解释型语言:解释器一句一句将源代码翻译成机器码,执行速度慢,开发效率高,例如python,PHP

 

四、Java内存区域

五大区域:堆、方法区、虚拟机栈、本地方法栈以及程序计数器

1、堆和方法区是线程共享的。

1)堆存放的是对象,也是GC垃圾回收的区域。分为三部分:新生代、老年代、永久代。而新生代又分为eden、s0、s1三部分。

大部分情况下,新对象会先在eden区分配内存,在一次垃圾回收后,如果该对象还存活则会进入s0或者s1,并且对象的年龄加1,当年龄超过15,则会晋升到老年代

 2)方法区:存放静态变量、常量以及类信息

2、程序计数器、栈是线程独有的

1)程序计数器:记录下一条要执行的指令

2)栈:由一个个栈帧组成,栈帧存放的是局部变量以及动态链接、操作数栈

 

五、对象创建过程

第一步:类加载检查,若未加载则先进行类加载过程

第二步:分配内存,有两种方式:指针碰撞和空闲链表

第三步:初始化零值

第四步:设置对象头,表示该对象是哪个类,以及类的元信息等

第五步:执行初始化方法,这样一个对象才算生产出来了

 

六、类加载过程

1、加载:加载 Java 类的字节码( .class 文件)到 JVM 中,并生成一个class对象。主要是通过类加载器完成的,具体使用哪个类加载器是由双亲委派模型决定的。

2、连接:分为验证、准备。解析三步。验证就是验证class文件的合法性和安全性;准备是为类的静态变量分配内存并设置初始值;解析是将常量池的符号引用替换为直接引用的过程。

3、初始化

 

七、类加载器

作用:加载 Java 类的字节码( .class 文件)到 JVM 中,并生成一个class对象。

JVM 中内置了三个重要的 ClassLoader

  1. BootstrapClassLoader(启动类加载器):最顶层的加载类,由 C++实现,通常表示为 null,并且没有父级,主要用来加载 JDK 内部的核心类库( %JAVA_HOME%/lib目录下的 rt.jarresources.jarcharsets.jar等 jar 包和类)以及被 -Xbootclasspath参数指定的路径下的所有类。
  2. ExtensionClassLoader(扩展类加载器):主要负责加载 %JRE_HOME%/lib/ext 目录下的 jar 包和类以及被 java.ext.dirs 系统变量所指定的路径下的所有类。
  3. AppClassLoader(应用程序类加载器):面向我们用户的加载器,负责加载当前应用 classpath 下的所有 jar 包和类。

除了这三种类加载器之外,用户还可以加入自定义的类加载器来进行拓展。

双亲委派模型的过程:当要加载一个类时,他首先不会自己去加载,而是将加载的请求委派给父类,自底向上查找并判断类是否被加载,如果未加载则自顶向下尝试加载类

 

八、垃圾回收

1、GC分类

部分收集 (Partial GC):

  • 新生代收集(Minor GC / Young GC):只对新生代进行垃圾收集;
  • 老年代收集(Major GC / Old GC):只对老年代进行垃圾收集。需要注意的是 Major GC 在有的语境中也用于指代整堆收集;
  • 混合收集(Mixed GC):对整个新生代和部分老年代进行垃圾收集。

整堆收集 (Full GC):收集整个 Java 堆和方法区

 

2、对象死亡判断方法

1、引用计数法

给对象中添加一个引用计数器,当有一个地方引用它,计数器加一,引用失效则减一,计数器为0时则回收

2、可达性分析

根据一系列GC roots作为起点,从这些节点开始往下搜索,节点走过的路径称为引用链,当一个对象到GC roots没有任何引用链则说明此对象要回收

GC roots有哪些:

  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 本地方法栈(Native 方法)中引用的对象
  • 方法区中类静态属性引用的对象
  • 方法区中常量引用的对象
  • 所有被同步锁持有的对象

 

3、垃圾清除算法

1)标记-清除算法:分为标记清除两个阶段,首先标记所有不需要回收的对象,然后再标记完成后统一回收没有被标记的对象。会产生大量的内存碎片

2)标记-复制算法:将内存分为两块,每次只使用其中的一块。当一块内存使用完后,把还存活的对象移到另一块,然后再把这块内存清空

3)标记-整理算法:分为标记和整理两阶段,首先标记所有不需要回收的对象,再把这些对象往一端移动,然后清理掉边界外的内存。适合老年代

4)分代收集算法:新生代选择标记-复制算法,老年代选择标记-清除或者标记整理算法

 

4、垃圾收集器

1)serial串行收集器:单线程收集器,在垃圾回收过程中其他线程必须暂停。新生代采用标记-复制算法,老年代采用标记-整理算法。

2)CMS收集器:并发收集器,使得垃圾回收线程和用户线程可以同时工作。CMS 收集器是一种 “标记-清除”算法实现的,具体过程如下:

第一步:初始标记,暂停其他线程,记录与root相连的对象

第二步:并发标记,同时开启垃圾回收线程和用户线程,不断更新可达的对象

第三步:重新标记,修正标记记录

第四步:并发清除,回收未被标记的对象

 

标签:标记,对象,回收,GC,垃圾,JVM,加载
From: https://www.cnblogs.com/coooookie/p/17487602.html

相关文章

  • JAVA JVM 层面的锁
    JVM锁1、JAVA为了实现在多线程环境灰姑娘下的线程安全,提供了诸如synchronized,ReentrantLock等工具类来解决我们在多线程环境下的线程安全问题。synchronized锁1、上面是synchronized锁synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:修饰一个代......
  • 2、【java程序运行监控byteman】使用示例(运行中方法耗时监控、javaagent监控、jvm监控
    (文章目录)本文介绍了byteman的其他几种应用场景及示例,比如javaagent、监控jvm、bmjava命令、如何查看运行的规则、检查规则的正确性、检查规则是否在运行中等。本文分为2个部分,即运行中方法耗时监控和其他示例。一、统计方法耗时(程序运行中)该类是实时显示控制台输入的结果以......
  • JVM性能调优
     一、JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为:New(年轻代)Tenured(年老代)永久代(Perm) 其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配,Perm不属于堆内存,有虚拟机直接分配,但可以通过-XX:PermSize-XX:MaxPermSize 等参......
  • jvm垃圾回收及内存模型
    1、了解垃圾回收之前,必须先了解内存模型 2、垃圾回收区域  a、首先要标记垃圾,找出垃圾   b、Java垃圾回收(一)_java垃圾回收_头发慢点掉的小马的博客-CSDN博客 垃圾回收器   方法区不需要连续的内存,可以选择固定大小或者可扩展。并且还可以选择不实现......
  • java开发C语言编译器:jvm的return指令以及局部变量的操作
    jvm运行字节码时,代码的运行必须围绕两种数据结构,一种是堆栈,一种是队列,如果jvm执行某条指令时,该指令需要对数据进行操作,那么被操作的数据在指令执行前,必须要压倒堆栈上。如果堆栈上的数据需要暂时保持起来时,它就会被加载到局部变量队列上。java代码中,每个方法里面的局部变量包括函数......
  • java开发C语言编译器:JVM 的基本操作指令介绍及其程序运行原理
    更详细的讲解和代码调试演示过程,请参看视频用java开发C语言编译器更详细的讲解和代码调试演示过程,请参看视频如何进入google,算法面试技能全面提升指南如果你对机器学习感兴趣,请参看一下链接:机器学习:神经网络导论更详细的讲解和代码调试演示过程,请参看视频LinuxkernelHacker,......
  • 常见的JVM调优方法有哪些?可以具体到调整哪个参数,调成什么值?
    调优工具console,jProfile,VisualVM Dump线程详细信息:查看线程内部运行情况死锁检查查看堆内类、对象信息查看:数量、类型等线程监控线程信息监控:系统线程数量。线程状态监控:各个线程都处在什么样的状态下热点分析CPU热点:检查系统哪些方法占用的大量CPU时间内存热点:检查哪些对......
  • JVM
    JVM请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新?什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?JVM的常用调优参数有哪些?内存快照如何抓取,怎么分析Dump文件?知道吗?阅读JVM中,类加载器你的认识?1.JVM的位置2.JVM的体系结构3.类加载器作用:......
  • JVM 数据存储介绍及性能优化
    JVM内存模式介绍Java虚拟机内存模型是Java程序运行的基础。为了能使Java应用程序正常运行,JVM虚拟机将其内存数据分为程序计数器、虚拟机栈、本地方法栈、Java堆和方法区等部分。程序计数器(ProgramCounterRegister)程序计数器(ProgramCounterRegister)是一块很小内......
  • Runtime - 运行时环境类(JVM)和大数值运算(BigInteger、BigDecimal)
    Runtime代表Java程序的运行时环境,可以通过getRuntime方法获取当前运行时。应用程序不能自己创建Runtime对象,可以通过Runtime的静态方法getRuntime()获得Runtime对象。Runtime类可以访问jvm的相关信息1、处理器数量runtime.availableProcessors()2、内存信息"获取最大内存数"--》......