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

JVM是什么?

JVM是java虚拟机栈,用于运行java执行字节码文件的。是java实现跨平台的核心机制,因为它的目的是使用相同的字节码文件,在不同的操作系统运行的结果相同。

一、java内存模型

在JDK1.8之前,它是分为线程共享和线程私有的,在线程共享的部分分为堆区方法区;在线程私有的部分分为jvm虚拟机栈程序计数器本地方法栈。在1.8之后,它是将方法区换为元空间

jvm虚拟机栈:是由一个个的栈帧组成,每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息。每一次方法调用结束后,都会有一个对应的栈帧被压入虚拟机栈,调用完后,代表该方法的栈帧会从虚拟机中弹出。

本地方法栈:native关键字修饰本地方法被执行时,在本地方法中也会创建一个栈帧,用于存放native本地方法的局部变量表、操作数栈、动态链接、方法出入口信息。

程序计数器:1、字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制;

2、在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候,能够知道当前线程的运行位置;

元空间:用于存放类信息、常量、静态变量、JIT即时编译器编译后的机器代码等数据。JDK1.6

时,方法区是一片连续的堆空间,经常出现OutOfMemory的异常;JDK1.7后将字符串常量池、静态变量转移到堆区;JDK1.8正式移除方法区,用元空间代替,并且是在本地内存。

堆: 又称GC堆;JVM管理的内存中最大的一块区域,被所有线程共享的一块内存区域。堆区中存放对象实例。堆区经常用分代划分,新生代和老年代。目的是更好的回收内存,更快的分配内存。

二、Java垃圾回收机制

分配策略:大对象、长期存活的对象优先进入老年代;而对象的创建优先zaiEden分配;

对象分配的过程:创建一个对象,判断它在Eden区是否可以放的下,如果放不下,则执行的是YGC,执行完YGC在判断这个对象是否能放的下,如果放不下,将它放入老生区,如果老生区放不下,那么执行FGC,如果执行完FGC还是放不下,则执行OOM(内存溢出)。

如何判断一个对象可以被GC回收:引用计数算法、根可达性算法

垃圾收集算法:标记-清除、标记-整理、标记-复制

垃圾收集器:

Serial收集器(新生代、标记-复制)       

Serial Old收集器(老年代、标记-整理) 

PerNew收集器(新生代 标记-复制,老年代 标记-整理)

Parallel Scavenge收集器(新生代,标记-复制)

Parallel Old收集器(老年代,标记-整理)

CMS收集器(老年代,标记-清除)初始标记、并发标记、重新标记、并发清除;(占用CPU,产生大量空间碎片)

G1收集器(老年代,局部性收集思想) 初始标记、并发标记、最终标记、筛选回收 (空间整合、可预测的停顿)

三、类加载机制

什么情况下需要类加载?
当一个类第一次被运行的时候(new关键字创建对象时、getstatic访问静态成员变量时、putstatic给静态成员赋值时、invokestatic调用类的静态方法时)

类的生命周期:

一、加载(通过类的完全限定名来获取这个类的二进制字节流;将该字节流表示的静态存储结构转换为元空间运行时的存储结构,在内存中生成一个代表该类的Class对象,作为元空间中该类各种数据的访问入口)

二、验证(Class字节流包含的信息是否符合当前虚拟机的要求)

三、准备(为类变量分配内存并设置初值)

四、解析(将字符串的符号替换为直接引用的过程)

、初始化(初始化类变量和其他资源)

3.1 双亲委派模型

启动类加载器(java.util.* ,java.io.*, java.lang.*等基础类库)

扩展类加载器(是由javax扩展类库提供的)

应用程序类加载器

一个类加载器首先将类加载请求转发到父类,只有当父类无法完成时才尝试自己完成。

作用:使Java类随着它的类加载器一起具有一种带有优先级的层次关系,从而使基础类得到统一;实现热加载;

3.2 对象创建的过程

一、类加载检查;

二、内存分配

三、初始化零值;

四、设置对象头;

五、执行init()方法。

  

相关文章:

  • 基于ssm广东东莞大益球队管理系统-计算机毕业设计源码+LW文档
  • 对抗生成网络GAN系列——AnoGAN原理及缺陷检测实战
  • 动态卷积条件卷积
  • 元宇宙发展演变及安全风险研究
  • 数据结构线性表之顺序表的实现
  • 基于CNN的字符型验证码识别系统设计开发[完整源码实战]
  • 【轻敲stl的大门】函数模板和类模板
  • 网络安全红队常用的攻击方法及路径
  • IMX6ULL学习笔记(10)——通过TFTP烧录Linux内核
  • 【C++】STL —— String类不会怎么办? 看文档(万字详解)
  • Spring中@Autowired注解实现原理
  • 干货!手把手教你穿透内网
  • 人家网站都免费了,你还用Python去爬?
  • 2023年上半年软考中、高级 了解一下
  • Android 13 新特性及适配指南
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 3.7、@ResponseBody 和 @RestController
  • 30秒的PHP代码片段(1)数组 - Array
  • avalon2.2的VM生成过程
  • C语言笔记(第一章:C语言编程)
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • Java 内存分配及垃圾回收机制初探
  • JAVA 学习IO流
  • Linux下的乱码问题
  • Logstash 参考指南(目录)
  • Odoo domain写法及运用
  • Redis的resp协议
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • vagrant 添加本地 box 安装 laravel homestead
  • vue中实现单选
  • 阿里云Kubernetes容器服务上体验Knative
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从零开始的无人驾驶 1
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 简单数学运算程序(不定期更新)
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 软件开发学习的5大技巧,你知道吗?
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • C# - 为值类型重定义相等性
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​学习一下,什么是预包装食品?​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #pragam once 和 #ifndef 预编译头
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (一) springboot详细介绍
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)http协议
  • (转载)OpenStack Hacker养成指南
  • ******IT公司面试题汇总+优秀技术博客汇总
  • .Net Redis的秒杀Dome和异步执行
  • .NET 回调、接口回调、 委托