首页 > 其他分享 >浅聊JVM--基础版

浅聊JVM--基础版

时间:2023-05-07 18:11:35浏览次数:40  
标签:Java JVM 浅聊 -- 永久 GC 内存 jvm

浅聊JVM--基础版

一、来源


jvm共有三种

  • Sun公司: HotSpot使用最多
  • BEA:JRockit
  • IBM:J9VM

​ 今天我们主要了解的是Sun公司的HotSpot(关于HotSpot的爱恨情仇这里就不做过多解释了。)我们以前测试jdk是否安装成功,java的环境变量是否配置成功会使用java -version命令来检查。有一个细节大家可以看一下,cmd输入java -version回车后,可以查看jvm。上图

​ 大家可以看到,我们目前使用大都是Sun公司的产品。那么jvm处于什么位置呢?其实jvm是在操作系统之上,和硬件并无直接联系。

面试题:jvm、jdk、jre的区别?

二、概述


​ JVM是Java Virtual Machine的缩写,通俗来说也就是运行Java代码的容器。当项目启动时,会根据jvm相关配置参数,在计算机的内存中开启一片空间用于运行jvm,之后Java相关代码就会被加载进jvm中运行。那么为什么Java代码可以实现“一次编译,到处运行”的机制应该就与jvm有关了吧。

Java作为一种高级语言,要让计算机执行Java程序,也得需要经过编码-->编译-->运行步骤。但是Java编译程序并不能将Java源代码直接编译为计算机能识别的0/1指令,而是编译为字节码文件(.class)这时候就需要jvm将字节码文件翻译为与平台有关的0/1指令。所以有了jvm,Java程序就达到了“一次编译到处运行”的目的。所以其跨平台好的根本原因就是因为jvm的存在。

​ 它的内存空间包括方法区、堆、方法栈、本地方法栈、PC寄存器。(以上5块又成为运行时数据区)。我们刚才也提到,Java源代码经过Java编译程序。能够产生相应的.class文件,也就是字节码文件。字节码文件经过jvm中的解释器,再次编译成特定机器上的机器码指令。上图:

关于类加载器是如何工作的,大家可以参考文章:

[Java 类加载和类加载器 - 掘金 (juejin.cn)](https://juejin.cn/post/7226665757882236986)

面试题:什么是双亲委派原则?

面试题:JNI(Java Native Interface)Java本地方法接口中Native关键字的作用?

我们今天主要浅聊一下PC寄存器、方法区、栈、堆

三、PC寄存器


​ 程序计数器(Program Count Register):每个线程都有一个程序计数器,它是线程私有,是用来存储指向下一条指令的地址,也就是即将来执行的指令代码。在执行引擎读取下一条指令,是一个非常小的内存空间。(关于程序计数器更多的细节或者是在循环、判断等条件下PC是如何跳转的,大家可以参考《计算机组成原理》类资料了解更多底层原理。)

四、方法区


​ 方法区(Method Area):只是 JVM 规范中定义的一个概念,用于存储被 JVM 加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。具体放在哪里,不同的实现可以放在不同的地方。HotSpot VM把 GC 分代收集扩展至方法区,即使用 Java 堆的永久代来实现方法区。(关于什么是永久代,请向下看)

面试题:一张白纸,画出对象实例化过程的内存图?

五、栈


​ 栈(Stack):里面放的是8大基本数据类型+对象引用+实例的方法。栈内存里,主管程序的运行,生命周期和线程同步,线程结束,栈内存也就释放了,栈内存结束,程序也就结束了。

​ 我们都知道在Java中,程序员不需要显示的去释放一个对象的内存的,而是由虚拟机自行回收垃圾,那么垃圾回收的过程不会涉及到栈(也就是说栈不存在垃圾回收的情况)

栈基于后进先出的特性,当执行完成后,会被弹出栈。

为什么main()是先执行,最后结束?(因为一开始是main()方法最先入栈,最后弹出,结束执行)

栈溢出的问题(StackOverflow)

看下一面一段程序:

jvm中的栈为:

六、堆


​ 堆:(Heap)运行时数据区,是被线程共享的一块内存区域,创建的对象和数组都保存在 Java 堆内存中,也是垃圾收集器进行 垃圾收集的最重要的内存区域。堆内存细分为3个区域:

  • 新生区(伊甸园去)--->Young/New(Eden Space)
  • 养老区(Old)
  • 永久区(Perm)

新生区又可以分为伊甸园区(Eden Space)、幸存0区、幸存1区,(幸存0区又可以称为SurvivorFrom区、幸存1区可以称为SurvivorTo区。From区和To区是可以来回动态交换的,具体什么原因,大家可以查阅资料)

伊甸园区:所有的对象都是在伊甸园区new出来的。

幸存者(0、1)区:在伊甸园区里经过一次轻GC后活下来的进入幸存(0、1)区,被清理掉的就死亡掉。(关于GC是如何进行垃圾回收的,大家可以自行查阅资料,这里只是简单了解)

养老区:在经过多次的轻GC处理后,幸存(0,1)区也都满了,会触发重GC来进行清理伊甸园区和幸存(0,1)区,那么进入养老区的就是重GC也未杀死的。若养老区也满了,就相当于内存已满,报OOM错误(java.lang.OutOfMemoryError:Java heap sapce)

听闻:99%的对象都是临时对象,能进入养老区的不多,所以OOM的错误也很少见。

面试题:工作中,遇到OOM了,你是怎么排查的?

1、尝试扩大堆内存空间,如果还满,可能有垃圾代码存在

2、分析内存,使用专业工具看哪里出了问题

[面试官:工作中遇到过 OOM 吗?你是怎么排查的? - 知乎 (zhihu.com)](https://zhuanlan.zhihu.com/p/165981061)

扩大内存空间参数:

(具体的参数设置大家自己查阅)

例如:

永久区:这个区域常驻内存,用来存放JDK自身携带的Class对象,Interface元数据,存储的是java运行时的一些环境或类信息,该区域不存在垃圾回收GC。关闭虚拟机就会释放这个内存。

关于永久区的更新换代:

jdk1.6之前:永久代,常量池在方法区

jdk1.7:永久代,但是慢慢退化了(去永久代)常量池在堆中

jdk1.8之后:无永久代,常量池在元空间

方法区又称非堆,本质还是堆,只是为了区分概念。

OK,结束!!!

资料参考:

狂神说Java

JVM入门笔记

标签:Java,JVM,浅聊,--,永久,GC,内存,jvm
From: https://www.cnblogs.com/kuangsun125/p/17379715.html

相关文章

  • ubuntu 更换系统软件源 和 pip源
    一、更换系统软件源1、备份:sudocp/etc/apt/sources.list/etc/apt/sources.list.bak2、修改:sudogedit/etc/apt/sources.list#阿里云源debhttp://mirrors.aliyun.com/ubuntu/focalmainrestricteduniversemultiversedeb-srchttp://mirrors.aliyun.com/ubun......
  • .NET 6学习笔记(8)生成自签证书
    上一篇我们通过导出IISExpress的自签证书,供ASP.NETCore程序启用HTTPS。本篇我们讨论如何生成自签证书。自签证书的生成,有多种方式。比如OpenSSL或PowerShell都可以通过命令生成证书。对于.NET程序,也有System.Security.Cryptography.X509Certificates命名空间下,对应的C#类来实现......
  • 圆形百分比进度条效果
    一、前言前段时间我有个页面需要该效果,就在网上看了下,实现方式有好几种,我找了一种比较好实现的给大家一步步讲解。先放效果图:参考别人的链接:HTML+CSS实现环形比例图效果二、整体思路1.设置一个浅灰色的圆当背景,里面只有两个子元素,一个在右侧的浅蓝色半圆,一个小一点的白色......
  • 实验五
    task1#include<stdio.h>#defineN4intmain(){ intx[N]={1,9,8,4}; inti; int*p; for(i=0;i<N;i++) printf("%d",x[i]); printf("\n"); for(p=x;p<x+N;p++) printf("%d",*p); printf(&q......
  • 计算机科学速成科听课随笔5
    计算机网络计算机近距离构成的小型网络叫做局域网,简称LAN,小到一间屋子里的几个机子,大到一个校园里的电脑都在一个局域网中最成功的局域网叫做以太网以太网的最简单形式就是用一根电线,将所有电脑连在一起,将所有数据以电线为载体,电信号的形式发送,由于电线是共享的,所以只要发送......
  • Mybatis-Plus 简介及入门案例
    Mybatis简介MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。官网地址:https://www.baomidou.com/特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本CURD,性能基本......
  • 【C#】数组深拷贝
    数组是引用类型,元素保存在堆上,栈上保存的是地址。1.Buffer.BlockCopyint[]arrold=newint[100000];int[]arrnew=newint[100000];//foreach不能修改遍历集合的元素内容for(inti=0;i<arrold.Length;++i){arrold[i]=i;}Stopwatchsw=newStopwatch(......
  • Git实战
    1.Git简介1.1什么是GitGit是一个分布式的版本控制软件。软件,类似于QQ、office等安装到电脑上才能使用的工具;版本控制,类似于毕业论文,需要反复修改和保留原历史数据;分布式文件夹拷贝本地版本控制集中式版本控制分布式版本控制1.2为什么要做版本控制要保留之前的......
  • 科学哲学导论
    一规律、解释与概率一、规律的价值与语言全称规律和统计规律,所有冰都是冷的vs婴儿有一半是男孩。单称规律:关于单一事实的描述。全称规律:对于任意x,如果P则Q。观察个别事实,经验概括,经验规律。理论规律,不可观察,如磁场规律。不涉及规律就无法解释。事实解释是伪装的规律解释,省略......
  • 无界AI绘画基础教程,和Midjourney以及Stable Diffusion哪个更好用?
    本教程收集于:AIGC从入门到精通教程汇总简单的总结Midjourney,StableDiffusion,无界AI的区别?Midjourney,收费,上手容易,做出来高精度的图需要自己掌握好咒语。咒语写不好,像是抽奖。里面的模型基本都是大模型,小模型太少,需要一些辅助机器人或者辅助操作保持画风的一致。StableDiffus......