农产品网站建设的主要工作西安网站建设 分类信息

当前位置: 首页 > news >正文

农产品网站建设的主要工作,西安网站建设 分类信息,山西网站制作方案,做网站就是做app文章目录 1. JVM简介2. 类加载简介3. 类加载的过程4. 双亲委派5. GC垃圾回收6. JVM的回收方式7. 分代回收 1. JVM简介 JVM#xff08;Java虚拟机#xff09;是一个名字为Java的进程,是用于执行Java程序的虚拟机。 JVM会从操作系统中申请一大块内存空间,又把这个内存空间划分… 文章目录 1. JVM简介2. 类加载简介3. 类加载的过程4. 双亲委派5. GC垃圾回收6. JVM的回收方式7. 分代回收 1. JVM简介 JVMJava虚拟机是一个名字为Java的进程,是用于执行Java程序的虚拟机。 JVM会从操作系统中申请一大块内存空间,又把这个内存空间划分成为几个小的区域 区域的划分: 堆方法区栈(Java虚拟栈和本地方法栈)程序计数器运行时常量池 代码中的局部变量是放在栈上的,成员变量放在堆上,静态变量放在方法区中,程序计数器放的是下一个要执行的指令地址 一个JVM进行中,堆和方法区只有一份,单栈和程序计数器,每个线程都有自己的一份 补充: 方法区的概念是jdk1.8之前的叫法,而jdk1.8之后没有方法区了,而多了个元数据区. 方法区是JVM申请内存中划分出的一个区域,而元数据区时是用的本地内存

  1. 类加载简介 类加载是JVM将类的字节码加载到内存中并进行验证、准备和解析的过程。也就是源代码(.java)文件编译成字节码文件(.class) 3. 类加载的过程 类加载的过程大致分为以下几步: 加载加载 验证准备解析 初始化 加载加载是将类的字节码文件加载到内存中的过程。 验证验证是确保类的字节码符合Java虚拟机规范的过程。 准备: 给类中的静态变量分配内存空间 解析: 初始化字符串常量,把符号引用(占位符)替换成直接引用(内存地址) 初始化初始化是执行类的初始化代码的过程。 什么时候进行类加载呢? 使用到一个类的时候,就触发类加载(类不一定是程序已启动就加载了,第一次使用时才加载),有点类似于懒汉模式
  2. 双亲委派 双亲委派是Java类加载器的一种机制用于保证类的加载安全和避免重复加载。 在讲双亲委派之前,先来了解类加载器 Java类加载器主要有以下几种类型 启动类加载器Bootstrap Class Loader它是JVM的内置类加载器负责加载Java标准库中的类扩展类加载器Extension Class Loader它是Java平台提供的标准类加载器之一用于加载Java扩展库如javax包中的类和Java虚拟机的扩展部分。应用程序类加载器Application Class Loader也称为系统类加载器System Class Loader它是加载应用程序类的默认加载器。应用程序类加载器加载应用程序类路径上的类即开发人员编写的类和第三方类库。 上述三个类加载器存在父子关系,启动类加载器是扩展类加载器的父类,扩展类加载器是应用程序类加载器的父类 进入类加载的时候,输入的内容是全限定类名,加载的时候从Application Class Loder开始. 即当一个类加载器收到加载类的请求时它会先委派给父类加载器只有在父加载器找不到该类的情况下才会自己加载。如果一直找到最下面的Application Class Loder也没有找到,就会抛出一个类没找到这样的异常 按照这个顺序的加载最大的好处就是如果子定义的类和Java标准库的类冲突了,此时仍然保留类加载可以加载到标准库中的类 5. GC垃圾回收 GC垃圾回收是Java虚拟机JVM自动管理内存的过程。它通过自动识别和回收不再使用的对象释放内存资源并提供了内存管理的机制使开发人员无需手动进行内存释放。 在学习C语言时,有个关键字叫 malloc(动态内存申请),它的内存释放时机是不确定的,需要使用的free进行释放.如果不进行free,这个内存就会一直持续到程序结束. 如果忘记释放,就可能会造成内存泄漏 而在Java中当对象不再被引用时它们变成了垃圾。垃圾回收器负责扫描程序的内存找出这些不再被引用的对象并将它们的内存空间回收以便后续的对象可以使用。 GC垃圾回收机制基本上可以把内存泄漏问题解决的差不多,但GC也并不是完美的,GC有个STW(stop the world)问题 STW指的是垃圾回收过程中应用程序的执行被暂停停止的情况。在STW期间所有的应用线程都会被挂起直到垃圾回收完成。 STW问题可能会对应用程序的性能和响应时间产生影响特别是在大型内存或高并发场景下。应用程序的执行会被中断可能导致暂停时间较长从而影响系统的实时性和用户体验。 GC垃圾回收主要会受到是哪些内容呢? 答案是堆,且GC中回收内存,不是以字节为单位进行回收的,而是以对象为单位回收. GC怎么判断某个对象是否是垃圾呢? 假设有一个对象,如果已经没有任何引用能够指向它了,说明对象自然就无法再被使用了 两种典型的判定对象是否存在引用的方法: 引用计数(不是JVM采取的办法) 引用计数的优点: 简单,容易实现,执行效率比较高引用计数的却嗲: 空间利用率低,可能会出现循环引用的情况 可达性分析(JVM采取的办法) 在Java中GC通过根对象作为起点查找所有与根对象直接或间接相连的对象这些对象被称为可达对象它们是程序中仍然被引用的对象。与根对象没有引用链相连的对象被认为是不可达的它们将被垃圾回收器标记为可回收的对象。 6. JVM的回收方式 共有以下几种方式: 标记清除: 标记-清除是最基本的垃圾回收算法。它分为两个阶段标记阶段和清除阶段。在标记阶段垃圾回收器标记所有可达的对象将其标记为存活对象。在清除阶段垃圾回收器清除未被标记的对象释放它们占用的内存空间。复制算法:将内存分为两个区域一次只使用其中一个区域。在对象存活后将其复制到未使用的区域中然后清除旧区域中的所有对象。复制算法适用于对象存活率较低的场景因为需要较大的内存空间来进行复制。标记整理: 标记-整理算法结合了标记-清除和复制算法的特点。它首先标记所有可达对象然后将存活对象向一端移动并清除未移动的内存空间。标记-整理算法适用于对象存活率较高的场景。
  3. 分代回收 上述三种方式,虽然都可以实现GC回收,但都会存在一些问题. 因此在使用时,就需要根据不同的场景,采取不同的策略. 所以有引入的一个新的垃圾回收机制-“分代回收” 分代回收:分代算法是基于对象生命周期的假设将内存分为不同的代一般分为新生代和老年代。新生代中的对象生命周期短暂采用复制算法进行回收而老年代中的对象生命周期较长采用标记-清除或标记-整理算法进行回收。分代算法适用于大部分应用程序因为对象的生命周期通常是不同的。 新生代的对象被GC扫描的概率低,老年代的对象被GC的扫描率低. 新生代只有熬过多次GC的扫描,没有被回收,才会进入老年代 注: 如果对象是一个特别大的对象,会直接进入老年代 文章到这就结束了,感谢您的观看!