JVM 学习

这里写目录标题

  • 说一说JVM的内存区域
  • JVM 内存模型
  • volatile的使用及其原理
  • Java中类加载过程是什么样的?
  • 方法区内存溢出怎么处理?
  • 谈谈动态年龄判断
  • 哪些是 GC Roots?
  • 强引用、软引用、弱引用、虚引用是什么,有什么区别?
  • 工作中常用的 JVM 配置参数有哪些?
  • 谈谈对 OOM 的认识
  • 谈谈你知道的垃圾回收算法
  • JIT 是什么?
  • 谈谈双亲委派模型 列举一些你知道的打破双亲委派机制的例子。为什么要打破?
  • 说一下垃圾分代收集的过程
  • 如何找到死锁的线程?
  • 描述一下什么情况下,对象会从年轻代进入老年代
  • safepoint 是什么?
  • MinorGC、MajorGC、FullGC 什么时候发生?
  • 生产环境 CPU 占用过高,你如何解决?
  • 生产环境服务器变慢,如何诊断处理?

说一说JVM的内存区域

Java虚拟机(JVM)的内存可以划分为以下几个区域,每个区域有不同的作用和用途:

  1. 程序计数器(Program Counter Register):
    程序计数器是JVM中的一块较小的内存区域,它是当前线程所执行的字节码指令的行号指示器。在多线程环境下,每个线程都有一个独立的程序计数器,保证线程切换后能够恢复到正确的执行位置。由于程序计数器只记录线程执行的位置,并不存储其他信息,所以它是线程私有的。

  2. Java虚拟机栈(Java Virtual Machine Stacks):
    Java虚拟机栈也称为Java栈,用于存储Java方法的局部变量、操作数栈、动态链接和方法返回地址等。每个方法执行时都会在栈上创建一个栈帧,栈帧包含了该方法的局部变量和操作数栈等信息。栈帧随着方法的调用和返回而出栈和入栈,是线程私有的。

  3. 本地方法栈(Native Method Stack):
    本地方法栈类似于Java虚拟机栈,但它为本地方法(Native Method)服务。本地方法是用C、C++等语言编写的方法,它们与Java代码进行交互。本地方法栈也是线程私有的。

  4. Java堆(Java Heap):
    Java堆是Java虚拟机所管理的内存中最大的一块,用于存储对象实例和数组。在Java堆中创建的对象可以被所有线程访问。堆内存在JVM启动时就被分配,所有的对象实例都在堆上进行分配和回收。Java堆是垃圾回收器的主要工作区域,垃圾回收器通过对Java堆进行垃圾回收来回收不再使用的对象。

  5. 方法区(Method Area):
    方法区用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区是所有线程共享的,它在JVM启动时被分配,并且随着时间的推移动态扩展。Java 8及之前版本中,方法区是永久代(Permanent Generation)的实现;而Java 8之后,永久代被元空间(Metaspace)所取代,元空间位于本地内存中,不再在堆中。

  6. 运行时常量池(Runtime Constant Pool):
    运行时常量池是方法区的一部分,用于存储编译器生成的常量以及运行时产生的常量。它包含了类和接口中的常量、字符串字面量和符号引用等信息。

除了以上几个主要的内存区域,JVM还可以划分出一些特殊的内存区域,如直接内存(Direct Memory)。直接内存并不是JVM管理的,而是通过Java NIO库与本地代码直接交互的。

JVM 内存模型

Java虚拟机规范中定义的"内存模型",它是为了解决多线程并发访问共享内存时可能出现的可见性、有序性和原子性等问题而设计的。

Java虚拟机内存模型规定了所有线程共享的主内存和每个线程私有的工作内存之间的关系和操作。主内存是所有线程共享的内存区域,用于存储Java对象实例和类的数据。每个线程都有自己的工作内存,用于存储主内存中的共享变量的副本。

Java虚拟机内存模型通过一些规则来保证多线程并发访问共享内存时的正确性和一致性:

  1. 原子性(Atomicity): 内存操作是原子的,不可被中断,要么全部执行成功,要么全部不执行。

  2. 可见性(Visibility): 当一个线程修改了共享变量的值,其他线程能够立即看到这个修改。

  3. 有序性(Ordering): 内存操作会按照代码的顺序执行,但在不影响单线程执行结果的前提下,可能会被重排序。

  4. volatile关键字: 使用volatile关键字可以保证共享变量的可见性和有序性,但不能保证原子性。

  5. synchronized关键字: 使用synchronized关键字可以保证共享变量的原子性、可见性和有序性,但可能会引起线程的阻塞和唤醒。

  6. 锁机制: Java提供了锁机制,如ReentrantLock、ReadWriteLock等,用于保护共享资源,实现对共享变量的互斥访问。

Java虚拟机内存模型规定了这些操作的具体语义,以及volatile和synchronized等关键字的语义。这样,开发者可以通过使用合适的同步机制来确保多线程程序的正确性,并充分利用硬件和操作系统的特性,实现高效的并发编程。Java虚拟机内存模型在多线程编程中起到了重要的规范作用,确保了多线程程序的正确性和可靠性。

volatile的使用及其原理

volatile是Java关键字之一,用于修饰变量,主要用于保证变量的可见性和禁止指令重排序。使用volatile关键字修饰的变量,对于多线程环境中的读写操作,会有以下特性:

  1. 可见性(Visibility): 当一个线程修改了一个volatile变量的值,其他线程可以立即看到这个修改,即保证了可见性。这是因为volatile变量会直接从主内存中读取最新的值,而不是使用线程的本地缓存。

  2. 禁止指令重排序: 在Java虚拟机中,为了提高性能,会对指令进行重排序。但对volatile变量的读写操作会在指令重排序时添加特殊的内存屏障,使得变量的读写操作不会被重排序,保证了操作的有序性。

volatile的原理是使用内存屏障(Memory Barrier)来实现可见性和禁止指令重排序。内存屏障是一种CPU指令,它能够强制刷新处理器缓存,保证处理器缓存中的数据与主内存中的数据一致。在读取volatile变量时,会插入读屏障,确保读取的是最新的值。在写入volatile变量时,会插入写屏障,确保写入的值对其他线程可见。读屏障和写屏障都会阻止指令重排序,保证操作的有序性。

需要注意的是,虽然volatile能够保证可见性和有序性,但不能保证原子性。多个线程同时对volatile变量进行写操作可能会导致写操作的覆盖,因此如果需要保证原子性,仍然需要使用其他同步机制,如synchronized关键字或java.util.concurrent.atomic包中的原子类。

volatile关键字适用于以下场景:

  • 一个变量被多个线程共享,并且其中一个线程对变量的修改需要立即对其他线程可见。
  • 对变量的写操作不依赖于当前值,或者能够确保只有单线程对变量进行写操作。

总结起来,volatile关键字是一种轻量级的同步机制,用于保证可见性和有序性,并且适用于特定的多线程编程场景。

Java中类加载过程是什么样的?

Java中的类加载过程是将Java字节码文件(.class文件)加载到内存中,并在Java虚拟机中创建一个Class对象,表示该类的结构和信息。类加载过程可以分为以下几个步骤:

  1. 加载(Loading):
    类加载的第一个阶段是加载,它是指将类的字节码文件从磁盘读取到内存中,并创建一个对应的Class对象。在这个阶段,会对字节码进行校验,以确保字节码的格式正确并符合Java虚拟机规范。

  2. 连接(Linking):
    连接阶段又分为三个步骤:验证(Verification)、准备(Preparation)和解析(Resolution)。

    • 验证:对加载的字节码进行验证,确保它满足Java虚拟机规范和安全要求。
    • 准备:为类的静态变量(类变量)分配内存,并设置默认初始值。
    • 解析:将类的符号引用转换为直接引用,例如将方法的符号引用转换为实际的方法入口地址。
  3. 初始化&#

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

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

相关文章

解决在mybatis中使用class属性绑定映射文件出现的异常问题~

如下所示&#xff0c;当我在XML文件中通过class属性配置其mapper文件时&#xff0c;出现下述错误 <mappers><mapper class"mappers.userMapper"/> </mappers>错误描述&#xff1a; 解决方法如下所示&#xff1a;在pom.xml文件中添加下述代码 <…

网络安全进阶学习第十一课——MySQL手工注入(2)

文章目录 一、UA注入1、原理2、靶场演示&#xff1a;1&#xff09;一旦页面出现如下现状&#xff0c;就可以使用UA注入2&#xff09;BP抓包3&#xff09;修改User-Agent 二、referer注入1、原理2、靶场演示&#xff1a;1&#xff09;使用BP抓包2&#xff09;修改Referer 三、DN…

计算机视觉的延伸整理

计算机视觉是一门涉及数字图像处理、模式识别和机器学习等技术的交叉学科&#xff0c;旨在将计算机技术应用于对视觉信息的理解和处理。其主要研究内容包括图像和视频处理、目标检测和跟踪、三维重建、人脸识别、自动驾驶等。计算机视觉已经被广泛应用于医学影像分析、安防监控…

C#IEnumberable<>

在C#中&#xff0c;IEnumerable<>是一个泛型接口&#xff0c;用于表示一个可枚举的集合。它定义了一个用于遍历集合元素的枚举器&#xff08;enumerator&#xff09;。通过实现IEnumerable<>接口&#xff0c;我们可以使用foreach语句或LINQ查询等方式来迭代访问集合…

element-ui 图片上传 及 quillEditor富文本(图片视频上传)

<template><div class"card" style"overflow: hidden; padding-bottom: 10px"><div style"padding: 20px 20px 0 20px"><span class"title_top"><span class"top_icon"></span>基本信息…

SQL基础复习与进阶

SQL进阶 文章目录 SQL进阶关键字复习ALLANYEXISTS 内置函数ROUND&#xff08;四舍五入&#xff09;TRUNCATE&#xff08;截断函数&#xff09;SEILING&#xff08;向上取整&#xff09;FLOOR&#xff08;向下取整&#xff09;ABS&#xff08;获取绝对值&#xff09;RAND&#x…

RPC原理与Go RPC详解

文章目录 RPC原理与Go RPC什么是RPC本地调用RPC调用HTTP调用RESTful API net/rpc基础RPC示例基于TCP协议的RPC使用JSON协议的RPCPython调用RPC RPC原理 RPC原理与Go RPC 什么是RPC RPC&#xff08;Remote Procedure Call&#xff09;&#xff0c;即远程过程调用。它允许像调用…

React Native元素旋转一定的角度

mMeArrowIcon: {fontSize: 30, color: #999, transform: [{rotate: 180deg}]},<Icon name"arrow" style{styles.mMeArrowIcon}></Icon>参考链接&#xff1a; https://reactnative.cn/docs/transforms https://chat.xutongbao.top/

ID生成方案总结

分布式ID生成方案 UUID数据库自增号段模式Redis实现雪花算法&#xff08;SnowFlake&#xff09;百度Uidgenerator美团Leaf滴滴TinyID 本文重点介绍能够ID自增的Leaf和TinyID 号段模式 这种模式也是现在生成分布式ID的一种方法&#xff0c;实现思路是会从数据库获取一个号段…

MikTex+TexStudio踩坑记

首先&#xff0c;去这两个的官网&#xff0c;下载安装&#xff0c;都没问题。 第二&#xff0c;记得以管理员方式运行程序&#xff0c;可能会少很多麻烦 第三&#xff0c;编译的时候&#xff0c;命令行提示错误&#xff1a; So far, no MiKTeX administrator has checked fo…

AcWing 24:机器人的运动范围 ← BFS、DFS

【题目来源】https://www.acwing.com/problem/content/description/22/【题目描述】 地上有一个 m 行和 n 列的方格&#xff0c;横纵坐标范围分别是 0∼m−1 和 0∼n−1。 一个机器人从坐标 (0,0) 的格子开始移动&#xff0c;每一次只能向左&#xff0c;右&#xff0c;上&#…

【雕爷学编程】Arduino动手做(182)---DRV8833双路电机驱动模块2

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

【LangChain】Prompts之Prompt templates

Prompts 编程模型的新方法是通过提示(prompts)。 prompts是指模型的输入。该输入通常由多个组件构成。 LangChain 提供了多个类和函数&#xff0c;使构建和使用prompts变得容易。 Prompt templates(提示模板): 参数化模型输入Example selectors(选择器示例): 动态选择要包含在…

EventBus 开源库学习(一)

一、概念 EventBus是一款在 Android 开发中使用的发布-订阅事件总线框架&#xff0c;基于观察者模式&#xff0c;将事件的接收者和发送者解耦&#xff0c;简化了组件之间的通信&#xff0c;使用简单、效率高、体积小。 一句话&#xff1a;用于Android组件间通信的。 二、原理…

TypeScript最新语法总结

注意注意&#xff01;&#xff01;&#xff01;本文介绍的是最新的TypeScript4的重要语法 第一部分&#xff1a;TypeScript的简介 TypeScript 是由微软开发的一款开源的编程语言&#xff0c;TypeScript 是 Javascript 的超集&#xff0c;遵循最新的 ES6、ES5 规范&#xff0c…

做好“关键基础设施提供商”角色,亚马逊云科技加快生成式AI落地

一场关于生产力的革命已在酝酿之中。全球管理咨询公司麦肯锡在最近的报告《生成式人工智能的经济潜力&#xff1a;下一波生产力浪潮》中指出&#xff0c;生成式AI每年可能为全球经济增加2.6万亿到4.4万亿美元的价值。在几天前的亚马逊云科技纽约峰会中&#xff0c;「生成式AI」…

动手学深度学习(二)线性神经网络

推荐课程&#xff1a;跟李沐学AI的个人空间-跟李沐学AI个人主页-哔哩哔哩视频 回归任务是指对连续变量进行预测的任务。 一、线性回归 线性回归模型是一种常用的统计学习方法&#xff0c;用于分析自变量与因变量之间的关系。它通过建立一个关于自变量和因变量的线性方程&…

分布式协议与算法——拜占庭将军问题

拜占庭将军问题 背景&#xff1a;以战国时期为背景 战国时期&#xff0c;齐、楚、燕、韩、赵、魏、秦七雄并立&#xff0c;后来秦国的势力不断强大起来&#xff0c;成了东方六国的共同威胁。于是&#xff0c;这六个国家决定联合&#xff0c;全力抗秦&#xff0c;免得被秦国各个…

JVM面试突击1

JVM面试突击 JDK&#xff0c;JRE以及JVM的关系 我们的编译器到底干了什么事&#xff1f; 仅仅是将我们的 .java 文件转换成了 .class 文件&#xff0c;实际上就是文件格式的转换&#xff0c;对等信息转换。 类加载机制是什么&#xff1f; 所谓类加载机制就是 虚拟机把Class文…

C语言阶段性测试题

大家好&#xff0c;我是深鱼~ 【前言】&#xff1a;本部分是C语言初阶学完阶段性测试题&#xff0c;最后一道编程题有一定的难度&#xff0c;需要多去揣摩&#xff0c;代码敲多了&#xff0c;自然就感觉不难了&#xff0c;加油&#xff0c;铁汁们&#xff01;&#xff01;&…