Java虚拟机(jvm)常见问题总结

1.电脑怎样认识我们编写的Java代码

  • 首先先了解电脑是二进制的系统,他只认识 01010101
  • 比如我们经常要编写 HelloWord.java 电脑是怎么认识运行的
  • HelloWord.java是我们程序员编写的,我们人可以认识,但是电脑不认识

Java文件编译的过程

1. 程序员编写的.java文件

2. 由javac编译成字节码文件.class(为什么编译成class文件,因为JVM只认识.class文件)

3. 在由JVM编译成电脑认识的文件 (对于电脑系统来说文件代表一切)

 2. 为什么说java是跨平台语言

  • 这个夸平台是中间语言(JVM)实现的跨平台
  • Java有JVM从软件层面屏蔽了底层硬件、指令层面的细节让他兼容各种系统

3. Jdk和Jre和JVM的区别

  • Jdk包括了Jre和Jvm,Jre包括了Jvm
  • Jdk是我们编写代码使用的开发工具包
  • Jre 是Java的运行时环境,他大部分都是 C 和 C++ 语言编写的,他是我们在编译java时所需要的基 础的类库
  • Jvm俗称Java虚拟机,他是java运行环境的一部分,它虚构出来的一台计算机,在通过在实际的计 算机上仿真模拟各种计算机功能来实现Java应用程序
  • 看Java官方的图片,Jdk中包括了Jre,Jre中包括了JVM

 4.  JVM由哪些部分组成,运行流程是什么?

  •  JVM包含两个子系统和两个组件: 两个子系统为Class loader(类装载)、Execution engine(执行引 擎); 两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。
    • Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载class文件到 Runtime data area中的method area。
    • Execution engine(执行引擎):执行classes中的指令。
    • Native Interface(本地接口):与native libraries交互,是其它编程语言交互的接口。
    • Runtime data area(运行时数据区域):这就是我们常说的JVM的内存。
  • 流程 :首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到 内存中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是 JVM 的一 套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎 (Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要 调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。

5.  什么是JVM字节码执行引擎

  • 虚拟机核心的组件就是执行引擎,它负责执行虚拟机的字节码,一般户先进行编译成机器码后执 行。
  • “虚拟机”是一个相对于“物理机”的概念,虚拟机的字节码是不能直接在物理机上运行的,需要JVM 字节码执行引擎- 编译成机器码后才可在物理机上执行。

6. 垃圾收集系统

  • 程序在运行过程中,会产生大量的内存垃圾(一些没有引用指向的内存对象都属于内存垃圾,因为 这些对象已经无法访问,程序用不了它们了,对程序而言它们已经死亡),为了确保程序运行时的 性能,java虚拟机在程序运行的过程中不断地进行自动的垃圾回收(GC)。
  • 垃圾收集系统是Java的核心,也是不可少的,Java有一套自己进行垃圾清理的机制,开发人员无需 手工清理
  • 有一部分原因就是因为Java垃圾回收系统的强大导致Java领先市场

7. 堆栈的区别是什么?

 注意: 静态变量放在方法区,静态的对象还是放在堆。

8. 深拷贝和浅拷贝

  • 浅拷贝(shallowCopy)只是增加了一个指针指向已存在的内存地址,
  • 深拷贝(deepCopy)是增加了一个指针并且申请了一个新的内存,使这个增加的指针指向这个新 的内存,
  • 浅复制:仅仅是指向被复制的内存地址,如果原地址发生改变,那么浅复制出来的对象也会相应的 改变。
  • 深复制:在计算机中开辟一块新的内存地址用于存放复制的对象。

9. Java会存在内存泄漏吗?为什么?

  • 内存泄漏是指不再被使用的对象或者变量一直被占据在内存中。理论上来说,Java是有GC垃圾回 收机制的,也就是说,不再被使用的对象,会被GC自动回收掉,自动从内存中清除。
  • 但是,即使这样,Java也还是存在着内存泄漏的情况,java导致内存泄露的原因很明确:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但 是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景。

10. 新生代、老年代、永久代的区别

  •  在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old )。而新生代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。这样划分的目的是为了使 JVM 能够 更好的管理堆内存中的对象,包括内存的分配以及回收。
  • 新生代中一般保存新出现的对象,所以每次垃圾收集时都发现大批对象死去,只有少量对象存活, 便采用了 复制算法,只需要付出少量存活对象的复制成本就可以完成收集。
  • 老年代中一般保存存活了很久的对象,他们存活率高、没有额外空间对它进行分配担保,就必须采 用“ 标记-清理”或者“标记-整理”算法。
  • 永久代就是JVM的方法区。在这里都是放着一些被虚拟机加载的类信息,静态变量,常量等数据。 这个区中的东西比老年代和新生代更不容易回收。

11. Minor GC、Major GC、Full GC是什么

1. Minor GC是新生代GC,指的是发生在新生代的垃圾收集动作。由于java对象大都是朝生夕死的, 所以Minor GC非常频繁,一般回收速度也比较快。(一般采用复制算法回收垃圾)

2. Major GC是老年代GC,指的是发生在老年代的GC,通常执行Major GC会连着Minor GC一起执 行。Major GC的速度要比Minor GC慢的多。(可采用标记清楚法和标记整理法)

3. Full GC是清理整个堆空间,包括年轻代和老年代

12. Minor GC、Major GC、Full GC区别及触发条件

Minor GC 触发条件一般为

1. eden区满时,触发MinorGC。即申请一个对象时,发现eden区不够用,则触发一次 MinorGC。 2. 新创建的对象大小 > Eden所剩空间时触发Minor GC

Major GC和Full GC 触发条件一般为: Major GC通常是跟full GC是等价的

1. 每次晋升到老年代的对象平均大小>老年代剩余空间

2. MinorGC后存活的对象超过了老年代剩余空间

3. 永久代空间不足

4. 执行System.gc()

5. CMS GC异常

6. 堆内存分配很大的对象

13. 为什么新生代要分Eden和两个 Survivor 区域?

  • 如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代。老年代很快被 填满,触发Major GC.老年代的内存空间远大于新生代,进行一次Full GC消耗的时间比Minor GC 长得多,所以需要分为Eden和Survivor。
  • Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生,Survivor的预筛选 保证,只有经历15次Minor GC还能在新生代中存活的对象,才会被送到老年代。
  • 设置两个Survivor区最大的好处就是解决了碎片化,刚刚新建的对象在Eden中,经历一次Minor GC,Eden中的存活对象就会被移动到第一块survivor space S0,Eden被清空;等Eden区再满 了,就再触发一次Minor GC,Eden和S0中的存活对象又会被复制送入第二块survivor space S1(这个过程非常重要,因为这种复制算法保证了S1中来自S0和Eden两部分的存活对象占用连续 的内存空间,避免了碎片化的发生)

14. Java堆老年代( Old ) 和新生代 ( Young ) 的默认比例?

  • 默认的,新生代 ( Young ) 与老年代 ( Old ) 的比例的值为 1:2 ( 该值可以通过参数 –XX:NewRatio 来指定 ),即:新生代 ( Young ) = 1/3 的堆空间大小。老年代 ( Old ) = 2/3 的堆空间大小。
  • 其中,新生代 ( Young ) 被细分为 Eden 和 两个 Survivor 区域,Edem 和俩个Survivor 区域比例 是 = 8 : 1 : 1 ( 可以通过参数 –XX:SurvivorRatio 来设定 ),
  • 但是JVM 每次只会使用 Eden 和其中的一块 Survivor 区域来为对象服务,所以无论什么时候,总 是有一块 Survivor 区域是空闲着的。

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

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

相关文章

git lab 2.7版本修改密码命令

1.gitlab-rails console -e production Ruby: ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux] GitLab: 14.9.0-jh (51fb4a823f6) EE GitLab Shell: 13.24.0 PostgreSQL: 12.7 2根据用户名修改密码 user User.find_by(username: ‘username’) # 替换’use…

无人驾驶(移动机器人)路径规划之RRT与RRTStar算法及其matlab实现

在自动驾驶与移动机器人路径规划时,必定会用到经典的算法RRT与RRT Star。下面是RRT与RRTStar的matlab实现效果。可以发现RRTStar效果明显改善。 目录 一、效果比较 1.1 RRT算法效果(黑色为障碍物,红色线为最终路径,蓝色三角形为…

C++之STL-vector+模拟实现

目录 一、vector的介绍和基本使用的方法 1.1 介绍 1.2 迭代器 1.3 vector的一些基本使用 1.3.1 构造函数 1.3.2 迭代器 1.3.3 有关容量的接口 1.3.4 增删查改 二、模拟实现vector 2.1 成员变量 2.2 迭代器的实现 2.3 容量接口的实现 2.3.1 size函数实现 2.3.2 capa…

阿斯达年代记三强争霸新手开荒注意事项 搬砖攻略和注意问题分享

阿斯达年代记三强争霸新手开荒注意事项 搬砖攻略和注意问题分享 阿斯达年代三强争霸这款游戏刚开始公测就获得了玩家们的集体关注,这是一款根据影视剧改编的MMORPG游戏,玩家将置身于名为阿斯大陆的奇幻世界,加入阿斯达、亚高、不法者三大势力…

Prompt之美:如何设计提示词让大模型变“聪明”

目录 一. Prompt关键要素 二. Prompt技巧 三. 实战中的Prompt优化 四. 参考文献 一. Prompt关键要素 Prompt是一个简短的文本输入,用于引导AI模型生成特定的回答或执行特定任务。换句话说,Prompt是你与AI模型沟通的方式。一个好的Prompt可以让AI更准…

从现在开始:让AI写代码,你只负责敲tab键

如果你是一名程序员,你一定有过这样的经历:在编写代码的时候,突然遇到了一个棘手的问题,需要花费大量的时间去查找资料、尝试不同的解决方案,甚至有时候还需要去问同事或者在网上寻求帮助。这样的情况不仅会浪费你的时…

用立方样条联合SHAP分析在危险因素鉴定中的作用

用立方样条联合SHAP分析在危险因素鉴定中的作用 1. SHAP分析告诉我们变量之间的关系 SHAP分析计算的SHAP值代表了某变量对于结局指标的贡献,代表了相关性的趋势,SHAP分析中的散点图是对以上关系的可视化,从中我们可以直观看到随着变量值的变…

百度 | 如何白嫖文心一言4.0,偷偷的用!

文心一言4.0 官方价一个月 59.9,贵不贵,很贵啊 现在有个白嫖文心一言4.0的方法 分享给大家 效果比3.0好用 如何使用 这里用到文心智能体平台,也是百度出的,和字节跳动的coze很像 这里打开文心智能体平台,自行百度…

diskMirror docker 使用容器部署 diskMirror 服务器!!!

Welcome to diskMirror-docker 获取项目 这个项目是 diskMirror-spring-boot 镜像版本的项目,您可以使用下面的命令将此项目编译为一个镜像! # 进入到您下载的源码包目录 cd diskMirror-docker# 点击脚本来进行版本的设置以及对应版本的下载 设置 和 编…

JavaEE:File类查询一个文件的路径(举例+源码 )

一、File类概述 Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。File 类中的方法可以对文件路径以及文件名等信息进行查询,也可以对文件进行各项增删改操作,本文主要介绍 File 类的查询方法。 二、代码示例 …

Python入门第10篇(编码)

目录 一、编码是什么? 二、Python中编码 1.读取文件引发的问题 2.其实是Windows的问题 3.试着改改问题 4.各种骚操作 5.终极解决 6.推荐方案 总结 Python系列文章目录 前言 编码存在于所有文件,比较常见的ASCII、utf8、gbk等。最常用的还是ut…

大模型 AI 框架昇思 MindSpore 2.3.RC1 发布,训练、推理性能大幅提升,JIT 编译强化

经过社区开发者们几个月的开发与贡献,现正式发布昇思 MindSpore2.3.RC1 版本,通过多维混合并行以及确定性 CKPT 来实现超大集群的高性能训练,支持大模型训推一体架构,大模型开发训练推理更简、更稳、更高效,并在训推一…

【产品设计】B端产品权限设计~功能权限设计篇

对于B端设计而言,良好的权限设计架构是支持其复杂业务的基础和关键。 一、什么是权限管理 权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源。 简而言之,用户登录系统后&#xff0…

使用 Redux 管理全局状态

Redux 是个状态集中管理框架,状态可以跨组件共享,状态更新后,调用监听器。其实状态可以认为就是个全局对象,为什么要做一个框架来管理呢?如果我们自己使用一个全解字典来管理状态是不是也行?如果不做任何控…

想在游泳健身的同时畅听音乐,随时哈氪漫游这款IP68防水的骨传导耳机

平时健身的过程中,音乐是许多健身爱好者的忠实伴侣。无论是在室内的健身房,还是户外的自然风光中,一副优质的耳机可以极大地提升我们的锻炼体验。现在市面上专为运动设计的耳机选择非常多,我喜欢用骨传导耳机,目前在用…

深入理解多线程编程

title: 深入理解多线程编程 date: 2024/4/25 17:32:02 updated: 2024/4/25 17:32:02 categories: 后端开发 tags:线程同步互斥锁死锁避免竞态条件线程池异步编程性能优化 第一章:多线程基础 1.1 线程概念与原理 线程:在操作系统中,一个程序…

ADB常用命令

大家好,今天给大家分享一些ADB的常用命令,我们作为测试了解ADB命令能给我们带来哪些好处呢? 1、ADB 命令可以帮助测试人员与Android设备进行交互,如安装、卸载应用,获取设备信息等,便于更深入地测试设备功能…

世强硬创获昕感科技授权代理,SiC MOSFET实现超低导通电阻

近日,世强先进(深圳)科技股份有限公司(下称“世强先进”)获北京昕感科技有限责任公司(下称“昕感科技”,英文名:NEXIC)授权代理,为光伏、储能、电网、新能源汽…

C# 给图片添加文字水印

目录 应用场景 开发运行环境 方法说明 方法代码 调用示例 小结 应用场景 在某些应用项目(如电子档案信息管理)中,查看电子图片信息是经常使用到的功能,此时我们就需要给显示在浏览器中的图片添加文字水印版权或提示信息。…

Golang对接Ldap(保姆级教程:概念搭建实战)

Golang对接Ldap(保姆级教程:概念&搭建&实战) 最近项目需要对接客户的LDAP服务,于是趁机好好了解了一下。LDAP实际是一个协议,对应的实现,大家可以理解为一个轻量级数据库。用户查询。比如&#xff…