关于 JVM

news2024/11/15 8:22:56

1、请你谈谈你对JVM的理解?


        JVM由JVM运行时数据区(图示中蓝色框包含部分)、执行引擎、本地库接口、本地方法库组成。

        JVM运行时数据区,分为方法区、堆、虚拟机栈、本地方法栈和程序计数器。

        1.方法区
         Java 虚拟机规范中定义方法区是堆的一个逻辑部分。方法区存放以下信息:已经被虚拟机加载的类信息,常量,静态变量,即时编译编译器编译后的代码。线程共享的区域。为了与堆区分,方法还有一个别名:Non-Heap(非堆)。

        2.堆
        堆是用来存放对象的内存空间,几乎所有的对象都存储在堆中。这一区域是线程共享,整个 Java 虚拟机只有一个堆,所有的线程都访问同一个堆。

在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。

这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收
 

        3.虚拟机栈
        Java 虚拟机栈是描述 Java 方法运行过程的内存模型。Java 虚拟机栈会为每一个即将运行的 Java 方法创建一块叫做“栈帧”的区域,用于存放该方法运行过程中的一些信息,比如:局部变量表,操作数栈,动态链接,方法出口信息等,方法执行的过程即为栈帧压栈出栈的过程。

        4.本地方法栈
        本地方法栈是为 JVM 运行 Native 方法准备的空间,由于很多 Native 方法都是用 C 语言实现的,所以它通常又叫 C 栈。它与 Java 虚拟机栈实现的功能类似,只不过本地方法栈是描述本地方法运行过程的内存模型。

        5.程序计数器
       程序计数器是一块较小的内存空间,是当前线程正在执行的那条字节码指令的地址。若当前线程正在执行的是一个本地方法,那么此时程序计数器为Undefined。

        这几部分都有相关的JDK自带工具可以分析查看,比如jps, jstack, jmap, jhat, jstat等,还有图形化工具jconsole,jvisualvm,但对于Linux服务器就无能为力了。

2、说一下新生代、老年代、永久代


JVM中的堆一般分为三大部分:新生代、老年代、永久代,其大致的占比如下:

 一、新生代

  新生代主要用来存放新生的对象。一般占据堆空间的1/3。在新生代中,保存着大量的刚刚创建的对象,但是大部分的对象都是朝生夕死,所以在新生代中会频繁的进行 MinorGC,进行垃圾回收,新生代又细分为三个区:Eden区、SurvivorFrom、SurvivorTo区,三个区的默认比例为:8:1:1。

 Eden区:Java新创建的对象绝大部分会分配在Eden区(如果对象太大,则直接分配到老年代)。当Eden区内存不够的时候,就会触发MinorGC(新生代采用的是复制算法),对新生代进行一次垃圾回收。
SurvivorFrom区和To区:在GC开始的时候,对象只会存在于Eden区和名为From的Survivor区,To区是空的,一次MinorGc过后,Eden区和SurvivorFrom区存活的对象会移动到SurvivorTo区中,然后会清空Eden区和SurvivorFrom区,并对存活的对象的年龄+1,如果对象的年龄达到15,则直接分配到老年代。MinorGC完成后,SurvivorFrom区和SurvivorTo区的功能进行互换。下一次MinorGC时,会把SurvivorTo区和Eden区存活的对象放入SurvivorFrom区中,并计算对象存活的年龄。
二、老年代

  老年代主要存放应用中生命周期长的内存对象。老年代比较稳定,不会频繁的进行MajorGC。而在MaiorGC之前才会先进行一次MinorGc,使得新生的对象进入老年代而导致空间不够才会触发。当无法找到足够大的连续空间分配给新创建的较大对象也会提前触发一次MajorGC进行垃圾回收腾出空间。

  在老年代中,MajorGC采用了标记—清除算法:首先扫描一次所有老年代里的对象,标记出存活的对象,然后回收没有标记的对象。MajorGC的耗时比较长。因为要扫描再回收。MajorGC会产生内存碎片,当老年代也没有内存分配给新来的对象的时候,就会抛出OOM(Out of Memory)异常。

三、永久代

  永久代指的是永久保存区域。主要存放 Class 和 Meta(元数据)的信息。Class 在被加载的时候被放入永久区域,它和存放的实例的区域不同,在Java8中,词锋代已经被移除,取而代之的是一个称之为“元数据区”(元空间)的区域。元空间和永久代类似,都是对JVM中规范中方法的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存的限制。类的元数据放入native memory,字符串池和类的静态变量放入java堆中。这样可以加载多少类的元数据就不再由 MaxPermSize 控制,而由系统的实际可用空间来控制。

采用元空间而不用永久代的原因:

① 为了解决永久代的OOM问题,元数据和 class对象存放在永久代中,容易出现性能问题和内存溢出。
② 类及方法的信息等比较难确定其大小,因此对于永久代大小指定比较困难,太小容易出现永久代溢出,太大容易导致老年代溢出(堆内存不变,此消彼长)。
③ 永久代会为GC带来不必要的复杂度,并且回收效率偏低。

3、jvm的类加载机制?


一、jvm类加载机制的5个阶段:
      加载——连接(验证-准备-解析)——初始化——使用——卸载。

二、类加载器

1、jvm提供了三种类加载器:

    BootStrap ClassLoader:负责加载 JAVA_HOME\lib 目录中的,或通过-Xbootclasspath 参数指定路径中的,且被虚拟机认可(按文件名识别,如 rt.jar)的类
    Extension ClassLoader:负责加载 JAVA_HOME\lib\ext 目录中的,或通过 java.ext.dirs 系统变量指定路径中的类库。
    Application ClassLoader:负责加载用户路径(classpath)上的类库。
    JVM 通过双亲委派模型进行类的加载,当然我们也可以通过继承 java.lang.ClassLoader实现自定义的类加载器。

2、双亲委派

当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。

采用双亲委派的一个好处是不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object 对象。


4、JVM调优经验


JVM配置方面
① -Xms 和 -Xmx 的值设置成相等,堆大小默认为-Xms指定的大小,默认空闲堆内存小于40%时,JVM会扩大堆到-Xmx指定的大小;空闲堆内存大于70%时,JVM会减小堆到-Xms指定的大小。如果在Full GC后满足不了内存需求会动态调整,这个阶段比较耗费资源。

② 新生代尽量设置大一些,让对象在新生代多存活一段时间,每次Minor GC 都要尽可能多的收集垃圾对象,防止或延迟对象进入老年代的机会,以减少应用程序发生Full GC的频率。

③ 老年代如果使用 CMS收集器,新生代可以不用太大,因为CMS的并行收集速度也很快,收集过程比较耗时的并发标记和并发清除阶段都可以与用户线程并发执行。

④ 方法区大小的设置,1.6之前的需要考虑系统运行时动态增加的常量、静态变量等,1.7只要差不多能装下启动时和后期动态加载的类信息就行。

代码实现方面
性能出现问题比如程序等待、内存泄漏除了JVM配置可能存在问题,代码实现上也有很大关系:

① 避免创建过大的对象及数组:过大的对象或数组在新生代没有足够空间容纳时会直接进入老年代,如果是短命的大对象,会提前出发Full GC。

② 避免同时加载大量数据,如一次从数据库中取出大量数据,或者一次从Excel中读取大量记录,可以分批读取,用完尽快清空引用。

③ 当集合中有对象的引用,这些对象使用完之后要尽快把集合中的引用清空,这些无用对象尽快回收避免进入老年代。

④ 可以在合适的场景(如实现缓存)采用软引用、弱引用,比如用软引用来为ObjectA分配实例:SoftReference objectA=new SoftReference(); 在发生内存溢出前,会将objectA列入回收范围进行二次回收,如果这次回收还没有足够内存,才会抛出内存溢出的异常。 
避免产生死循环,产生死循环后,循环体内可能重复产生大量实例,导致内存空间被迅速占满。

⑤ 尽量避免长时间等待外部资源(数据库、网络、设备资源等)的情况,缩小对象的生命周期,避免进入老年代,如果不能及时返回结果可以适当采用异步处理的方式等。

5、JDK 中常用的设计模式有哪些?


1、单例模式
作用:保证类只有一个实例。

JDK中体现:Runtime类。

2、静态工厂模式
作用:代替构造函数创建对象,方法名比构造函数清晰。

JDK中体现:Integer.valueOf、Class.forName

3、抽象エ厂
作用:创建某一种类的对象。

JDK中体现:Java.sql包。

4、原型模式
clone();

原型模式的本质是拷贝原型来创建新的对象,拷贝是比new更快的创建对象的方法,当需要大批量创建新对象而且都是同一个类的对象的时候考虑使用原型模式。

一般的克隆只是浅拷贝(对象的hash值不一样,但是对象里面的成员变量的hash值是一样的)。

有些场景需要深拷贝,这时我们就要重写clone方法,以ArrayList为例:

5、适配器模式
作用:使不兼容的接口相容。

JDK中体现:InputStream、OutputStream.

6、装饰器模式
作用:为类添加新的功能,防止类继承带来的类爆炸。

JDK中体现:io类、Collections、List。

7、外观模式
作用:封装一组交互类,一直对外提供接口。

JDK中体现:logging包。

8、享元模式

作用:共享对象、节省内存。

JDK中体现:Integer.valueOf、String常量池。

9、代理模式
作用:

(1)透明调用被代理对象,无须知道复杂实现细节:

(2)增加被代理类的功能;

JDK中体现:动态代理。

10、迭代器模式
作用:将集合的迭代和集合本身分离。

JDK中体现:terator

11、命令模式
作用:封装操作,使接口一致。

JDK中体现:Runable、Callable、ThreadPoolExecutor。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1502725.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑马点评-异步秒杀实现

异步秒杀思路 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤 1、查询优惠卷 2、判断秒杀库存是否足够 3、查询订单 4、校验是…

Draco点云压缩测试

ref:https://github.com/google/dracohttps://codelabs.developers.google.com/codelabs/draco-3d/index.html#6 Draco Draco 是一个用于编码压缩和解压缩 3D 几何网格和点云的库,从而改进 3D 图形的存储和传输该代码支持压缩点、连接信息、纹理坐标、颜…

个人代码分享(底层模板函数和三大模板)2024.3.6

源码:(百度网盘) 链接:https://pan.baidu.com/s/1jdfrQOGCWJaQgSUPEWcfdw?pwd1234 提取码:1234 说明: 从复习到应用所有学到的东西去做真题,笔者对于之前发过的文章里面的代码有着很多改动&…

用msvc编译器的cl.exe将gcc编译器的.s汇编文件转masm编译器的.asm文件

用msvc编译器的cl.exe将gcc编译器的.s汇编文件转masm编译器的.asm文件 cl /nologo /X /II:/code/reactos-master/sdk/include/asm /II:/code/reactos-master/output-VS-amd64-sln/sdk/include/asm -II:/code/reactos-master/sdk/include -II:/code/reactos-master/sdk/include…

051-WEB攻防-前后台功能点文件下载文件读取文件删除目录遍历目录穿越

051-WEB攻防-前后台功能点&文件下载&文件读取&文件删除&目录遍历&目录穿越 #知识点: 1、文件安全-前后台功能点-下载&读取&删除 2、目录安全-前后台功能点-目录遍历&目录穿越 演示案例: ➢文件安全-下载&删除-案例…

Centos 安装 redis【最简单】

Centos7 使⽤ yum 安装 ⾸先安装 scl 源, 再安装 redis (因为 Centos7 yum 提供的软件包只有 3.0 版本的 Redis ,太老了,我们要安装 redis 5 系列的) yum install centos-release-scl-rh yum install rh-redis5-redis 创建符号…

阿里云99计划优惠:云服务器租用价格61元、99元、165元

阿里云99计划还有谁不知道么?阿里云不杀熟,新老用户同享,阿里云服务器99元一年,续费也是99元,续费不涨价家人们,2024年阿里云把云服务器价格打下来了,2核2G、2核4G、4核8G、4核16G、8核16G、8核…

《在“裸奔”时代下如何保护网络隐私》

引言 在信息时代的今天,网络已经成为我们生活中不可或缺的一部分。然而,随着网络的普及和技术的发展,网络安全和隐私保护问题也变得越来越严峻。特别是在这个所谓的“裸奔”时代,我们的个人信息和隐私正面临着前所未有的挑战。因此,保护网络隐私变得尤为重要。 网络安全…

吴恩达deeplearning.ai:机器学习的开发过程与优化方法

以下内容有任何不理解可以翻看我之前的博客哦:吴恩达deeplearning.ai专栏 我想在接下来分析下开发机器学习系统的过程,这样当你自己动手时,能够做出更加正确的判断。 机器学习开发的迭代 Iterative loop of ML development 决定模型架构 第…

flink实战--Flink任务资源自动化优化

背景 在生产环境Flink任务资源是用户在实时平台端进行配置,用户本身对于实时任务具体配置多少资源经验较少,所以存在用户资源配置较多,但实际使用不到的情形。比如一个 Flink 任务实际上 4 个并发能够满足业务处理需求,结果用户配置了 16 个并发,这种情况会导致实时计算资…

【uniapp】uniapp小程序中实现拍照同时打开闪光灯的功能,拍照闪光灯实现

一、需求前提 特殊场景中,需要拍照的同时打开闪光灯,(例如黑暗场景下的设备维护巡检功能)。 起初我是用的uviewui中的u-upload组件自带的拍照功能,但是这个不支持拍照时打开闪光灯,也不支持从通知栏中打开…

哈希表应用

例题 在这里使用一个简化版的问题进行分析:给定N个自然数,值域是,求出这N个自然数中共有多少个不同的自然数。 分析 如果值域是,那么可以利用之前介绍过的计数排序算法解决问题。定义一个的大数组a,每个位置a[x]所对…

vue 使用 PrintJs 实现打印pdf效果

一、print.js介绍 Print.js主要是为了帮助我们直接在应用程序中打印PDF文件,而无需离开界面,并且不使用嵌入。对于用户不需要打开或下载PDF文件的特殊情况,他们只需要打印它们。 例如,当用户请求打印在服务器端生成的报告时&…

Spring web MVC(入门)

1、什么是MVC(一种思想) Model View Controller : Model—模型 View—视图 Controller—控制器 2、Spring MVC是一种实现(我们现在学的是Spring web,Spring mvc过时了) View属于前端问题我们后端人员不必太过于关注…

Java基础 - 8 - 算法、正则表达式、异常

一. 算法 什么是算法? 解决某个实际问题的过程和方法 学习算法的技巧? 先搞清楚算法的流程,再直接去推敲如何写算法 1.1 排序算法 1.1.1 冒泡排序 每次从数组中找出最大值放在数组的后面去 public class demo {public static void main(S…

JVM——执行引擎

文章目录 1、概述2、计算机语言的发展史2.1、机器码2.2、汇编语言2.3、高级语言2.4、字节码 3、Java代码编译和执行过程4、解释器5、JIT编译器5.1、为什么HotSpot VM同时存在JIT编译器和解释器5.2、热点代码探测确定何时JIT5.3、设置执行模式5.4、C1编译器和C2编译器 6、AOT编译…

python实现桶排序

桶排序(Bucket Sort)是一种排序算法,它将待排序的元素分到有限数量的桶(buckets)中,然后分别对每个桶中的元素进行排序,最后按照顺序将所有的桶中的元素依次取出,即可得到有序序列。…

深入了解Kafka中Topic的神奇之处

欢迎来到我的博客,代码的世界里,每一行都是一个故事 深入了解Kafka中Topic的神奇之处 前言Topic的基本概念Kafka Topic 的定义:Kafka Topic 的基本原理:为何 Topic 是 Kafka 消息传递的核心组成部分: 创建和配置Topic创…

FairScale 库测试实验(一)-- 大模型训练基础之模型并行

DDP的分布式训练方法采用数据并行方式,相当于通过增大数据的batch来加快训练。但对于大模型(LLM)来说,DDP已经不适用了。因为LLMs的模型本身太大,一块GPU都放不下怎么可能去复制从而实现数据并行呢。所以LLM的训练采用…

Ansible常用模块详解

Ansible常用模块详解一、Ansible简介1、Ansible是什么?2、Ansible是怎么工作的?3、Ansible的特性 二、Ansible 环境安装部署三、Ansible 命令行模块1、command 模块2、shell 模块3、cron 模块4、user 模块5、group 模块6、copy 模块7、file 模块8、hostn…