栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

JVM探究简单入门知识详解

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JVM探究简单入门知识详解

1.JVM探究(面试)
  • 请你谈谈你对JVM的理解?java8虚拟机和之前的变化更新?
  • 什么是OOM,什么是栈溢出StackOverFlowError?怎么分析?
  • JVM的常用调优参数
  • 内存快照如何抓取,怎么分析Dump文件?知道吗?
  • 谈谈JVm中,类加载器你的认识?
1.JVMD的位置

2.JVM的体系结构


3.类加载器

1.虚拟机自带的加载器

2.启动类(根)加载器

3.扩展类加载器
4.应用程序加载器

4.双亲委派机制
  • 启动类加载器(Bootstrap Class Loader)
  • 扩展类加载器(Extension Class Loader)
  • 应用类加载器(Application Class Loader)

APP–>EXC–>BOOT

1.类加载器收到类加载请求

2.将这个请求向上委托给父类加载器区完成,一直向上委托,直到启动加载器

3.启动加载器检查是否能够加载这个类,能加载就使用当前加载器,否则,抛出异常,通知子类加载器

4.重复步骤 null :java 调用不到 C,C++

5.沙箱安全机制
  • 类装载器(loader class)

    • 防止恶意代码去干扰善意代码 //双亲委派机制
  • 字节码校验器(bytecode verifier) :确保遵循java语言

  • 安全管理器

6.Native
  • native:凡是带了native的关键字 说明java的作用范围达不到了,回去调用底层C语言的库
  • 会进入本地方法栈
  • 调用本地方法接口 JNI
  • JNI作用:扩展java的使用,融合不同的编程语言为java所用! 最初:C C++
  • java之前要想立足 必须调用C C++的程序
  • 它在内存区域专门开辟了一块标记区域:Native Methon Stack 登记 native方法
  • 最终执行的时候,加载本地库中的方法通过JNI
    • java程序驱动打印机 ,管理系统,在企业级应用少见
7.PC寄存器

程序计数器:Program Counter Register

每一个线程都有一个程序计数器,是线程私有的,就是一个指针,指向方法区的方法字节码(用来存储指向像一条指令的地址,也将要执行的指令代码),在执行引擎读取下一条指令,是一个非常小的内存空间,几乎可以忽略不计

8.方法区

Methon Area方法区

方法区是所有线程共享的,所有字段和字节码,以及一些特殊的方法,比如构造函数,接口代码页在此定义,简单的说,所有定义的方法信息都保存在该区域,此区域属于共享区间

静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中、但是 实例变量存在堆内存中、和方法区无关

static final Class 常量池 // java内存基础章节

9.栈

栈:数据结构

程序=数据结构+算法:持续学习~

程序=框架+业务逻辑 必须要的

栈:先进后出 后进后出

队列:先进先出(FIFO:First Input First Output)

栈:栈内存 主管程序的运行 生命周期和线程同步

线程结束,栈内存也就释放 对于栈来说 不存在垃圾回收

一旦结束 栈就Over

栈:8大类型 +对象引用+实例方法

栈满了:StackOverflowError

栈+堆+方法区:交互关系 具体博客:(22条消息) Java对象在内存中实例化的过程_Tony__Jaa的博客-CSDN博客_画出一个对象实例化过程在内存中

栈运行原理:正在执行的方法一定在栈的顶部 执行完就抛弃 直到全部执行完成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KRk7Xt5C-1656671526706)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624111214467.png)]

10.三种JVM
  • Sun公司 HotSpot
  • BEA JRockit 最快的JVM 不适合学习 适合其他
  • IBM J9 vm
11.堆

Heap 一个JVM只有一个堆内存 堆内存是可以调节的

类加载器读取了类文件后,一般会把什么东西放到堆中?类,方法,常量,变量保存我们所有引用类型的真实对象

堆内存分为三个区域:

  • 新生区(伊甸园)Eden
  • 养老区
  • 永久区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xLBn7DjK-1656671526707)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624113643822.png)]

Heap满了:OutOfMemoryError (OOM)

JDK8以后永久区改成了元空间

GC回收主要在伊甸园区 养老区

12.新生区 老年区
  • 类:诞生和成长的地方
  • 伊甸园区:所有的对象都是在这New出来的
  • 幸存者区
    • 幸存者0区
    • 幸存者1区

经过研究99%的对象都是临时对象

13.永久区

用来存放jdk自身携带的Class对象 interface元数据 存储是java运行的一些环境 不存在垃圾回收 关闭虚拟机会释放这个区域

一个启动类 加载了大量的jar包 Tomca部署了大量的应用 大量动态生成的反射类 不断被加载

直到内存满了 就会出现 OOM

  • jdk1.6 之前:永久代,常量池是在方法区;
  • jdk1.7:永久代,慢慢的退化了,常量池在堆中
  • jdk1.8之后 :无永久代 常量池在元空间
//返回虚拟机试图使用最大内存
long max=Runtime.getRuntime().maxMemory(); 
//返回jvm的初始化总内存
long total=Runtime.getRuntime().totalMemory();


System.out.println("max="+max+"字节/t"+(max/(double)1024/1024)+"MB")
System.out.println("mtotal="+max+"字节/t"+(total/(double)1024/1024)+"MB")
//默认情况下  :分配的总内存是电脑内存的1/4 而初始化的内存是1/64

出现OOM调优:尝试扩大堆内存

-Xms1024m -Xmx1024m -XX:PrintGCDetails (JVM设置里面填写)

一个项目中出现了OOM

  • 测试工具 内存快照分析工具 MAT Jprofiler.

MAT Jprofiler作用

  • 分析Dump内存文件 快速定位内存泄漏
  • 获得堆中的数据
  • 获得大的对象

Jprofier 下载:Download and installation help (softonic.com)

14.堆内存调优

-Xms 设置初始化内存分配大小

-Xmx 设置最大分配内存

-XX +PrintGCDetails 打印GC垃圾回收信息

-Xms1m -Xx8m -XX:HeapDumpOnOutOfMeoryError 打印堆溢出的问题

15.GC
  • 新生代
  • 幸存区(from ,to)
  • 老年区

GC两种类 :轻GC(普通的GC) 重GC (全局GC)

1.GC题目(面试题目)
  • JVM的内存模型和分区 详细到每个区放什么?

  • 堆里面的分区有哪些?Eden,from to 老年区他们的特点

  • GC的算法有哪些,标记清除法,标记压缩,复制算法,引用计数器,怎么用的

    引用计数法

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SM3qbMT2-1656671526708)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624142219348.png)]

2.复制算法

年轻代的GC 主要用的复制算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5GCescVa-1656671526710)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624143646153.png)]

  • 好处:没有内存碎片
  • 坏处:浪费了一个内存空间 to区保证是空的

复制算法最佳使用场景:对对象较低的时候;新生区

1.每次GC都会将Eden活的对象转移到幸存区中;一旦Eden区被Gc后,就是空的!

2.谁空谁是to 幸存0和1区一直在改变

3.当一个对象经历了15次GC都没有被消除 就进老年区

4.-XXMaxTenuring Theshold=15 通过这个设置进入老年区的时间

3.标记清楚算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G3P3RX4M-1656671526711)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624144307332.png)]

  • 优点:不需要额外的空间

  • 缺点:两次扫描 严重浪费时间 会产生内存碎片 hash

4.标记压缩

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L8OqdY9l-1656671526712)(C:Users王硕AppDataRoamingTyporatypora-user-imagesimage-20220624144740646.png)]

16.JMM

17.总结

内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度)

内存整齐度:复制算法=标记压缩法>标记清楚法

内存利用率:标记压缩算法=标记清楚算法>复制算法

没有最好的算法 只有最合适的算法

年轻代:

  • 存活率低
  • 复制算法!

老年代:

  • 区域大 :存活率
  • 标记清楚(内存碎片不是很多)+标记压缩混合 实现

面试题多看 书看《深入理解JVM》

16JMM

Java Memory Model java 内存模型

JMM:抽象的概念

  • 可以去下面的这个blog进行深层次的探究JVM

(22条消息) 详解什么是JMM!_阿里官方架构师的博客-CSDN博客_jmm

17.来源

1.狂神视频学习
2.如果错误请指出改正
3.本人刚刚入门有些知识不是很专业望理解

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1004336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号