【Java进阶营】JVM 内存模型

Java JVM 内存模型详解 JVM内存模型是Java程序运行时的核心架构,分为程序计数器、虚拟机栈、本地方法栈、堆、方法区和直接内存等区域。堆是主要存储对象实例的区域,分为新生代和老年代;方法区存储类信息和常量。JVM采用分代收集算法进行垃圾回收,包括标记-清除、复制和标记-整理等方法。合理的内存配置和垃圾收集器选择(如G1、CMS)对性能优化至关重要。常见内存泄漏场景包括未关闭的连接和静态集合的滥用。建议通过监控GC日志、使用分析工具和合理设置-Xmx等参数进行调优。深入理解JVM内存模型是Java性能优化的基础。 阅读详情

JVM 内存模型JMM(Java Memory Model)

Java 代码:

public class MainTest {

    private int compute() {
        int a = 1;
        int b = 2;
        int c = a * b + 10;

        return c;
    }

    public static void main(String[] args) {

        MainTest mainTest = new MainTest();
        int ret = mainTest.compute();

        System.out.println(ret);
    }
}

idea可以安装jclasslib插件,来查看字节码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NdyiUYXx-1650626855780)(//upload-images.jianshu.io/upload_images/1510669-47b05a50f6339a14.png?imageMogr2/auto-orient/strip|imageView2/2/w/773/format/webp)]

JVM 运行时数据区内存模型:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jyOwnoSh-1650626855784)(//upload-images.jianshu.io/upload_images/1510669-4e55ccc93c96d2bb.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1123/format/webp)]

“绿色区域”:栈、本地方法栈、程序计数器为线程运行时独有的数据区域
“黄色区域”:堆、方法区为所有内存之间共享的内存区域。

线程独有的内存区域

1、程序计数器(Program counter register)

程序计数器内存区域很小,它是当前线程所执行的字节码的行号指示器(LineNumber),字节码解释器通过改变这个计数器的值来选取下一条需要执行的字节码指令。
只有Java的方法这个计数器才有值,如果执行的是一个Native方法,那这个计数器是空的。

JVM的多线程实现:JVM的多线程是通过CPU时间片轮转(即线程轮流切换并分配处理器执行时间)算法来实现的。当一个正在执行的线程因为时间片耗尽被挂起,另一个线程获取到时间片开始执行。
当被挂起的线程重新获取到时间片的时候,它要想从被挂起的地方继续执行,就必须知道它上次执行到哪个位置了,这时候LineNumer就起作用了,在JVM中,通过程序计数器记录某个线程的字节码执行位置
。
程序计数器是具备线程隔离的特性,每个线程工作时都有属于自己的独立计数器。

Java 虚拟机栈(Java Virtual Machine Stacks)

Java 虚拟机栈是线程私有的,生命周期随着线程启动而产生,线程结束而消亡。
Java虚拟机描述的是Java 方法执行的内存模型,用于存储栈帧。线程启动时会创建虚拟机栈,每个方法在执行时会在虚拟机栈中创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法返回地址、附加信息等。
每个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机栈中的入栈到出栈的过程。
内存不需要保证连续的,可以通过-Xss 设置成固定大小,也可以动态扩容和缩容。

局部变量表的容量以变量(Variable Slot)为最小单位,存放8种类型 byte、short、int、float、char、boolean、reference; 注意一下,局部变量表的引用存储的都是局部变量的对象引用,而不是成员变量(getter setter属性)的对象引用。成员变量的对象引用是存储在JAVA 堆(Heap)中),虚拟机栈工作流程如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AB1dGdZv-1650626855785)(//upload-images.jianshu.io/upload_images/1510669-d034429a798405fd.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/409/format/webp)]

本地方法栈

本地方法栈(Native Method Stacks)与Java 虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机为虚拟机执行Java方法(字节码)服务,本地方法栈为Native方法服务
Native 方法则是虚拟机通过JNI直接调用本地C/C++库。在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-83pOq2ae-1650626855785)(//upload-images.jianshu.io/upload_images/1510669-49e0d2e97fc3a8d0.png?imageMogr2/auto-orient/strip|imageView2/2/w/852/format/webp)]

线程共享区域

堆

Java 堆是垃圾收集器管理的主要区域,堆内存分为新生代(Young)和老年代(Old),新生代(Yong)分为Eden、From Survivor、To Survivor,如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4L1Yo5HF-1650626855800)(//upload-images.jianshu.io/upload_images/1510669-e4c7747ec582f9a3.png?imageMogr2/auto-orient/strip|imageView2/2/w/1020/format/webp)]

假如一个电商网站,每日点击上亿次,每个用户平均点击二三十次,那么日活用户=1亿/20=500万,假如付费转化率10%,500万10%=50万订单,正常情况下50订单是在三四小时产生的,平均下来也就几十单,压力是能抗住的。但是在大促的时候,50万订单都是在前几分钟产生,假设每秒1000多单,有三台订单服务器,分配到每台机器大概是300单/每秒,每个订单对象1KB,所以又每秒300KB订单对象生成,下单还涉及到其他对象,比如库存、优惠券、积分等,放大20倍,300KB20/秒对象生成,可能同时还有其他操作,如订单查询等,再放大10倍,那就是300KB2010/秒,每秒产生60MB对象,1秒后都变成垃圾对象。

java -Xms3072M -Xms3072M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar order.jar

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YyI7tnDi-1650626855801)(//upload-images.jianshu.io/upload_images/1510669-ba7dc6d1f2d4a489.png?imageMogr2/auto-orient/strip|imageView2/2/w/1030/format/webp)]

当分配的内存的时候 eden区内存已经被分配完了,当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC,GC期间虚拟机又发现回收对象无法存入Survior空间,所以只好把新生代的对象提前转移到老年代,老年代上的空间足够存放回收对象时,就不会出现Full GC ,执行Minor GC 后,后面分配的对象如果能够存在Eden区的话,还会在Eden区分配内存

可以用如下代码验证

public class GCMainTest{

    public static void main(String[] args) throws InterruptedException{
         byte[] allocation1,allocation2,allocation3,
         allocation4,allocation5,allocation6;

         allocation1=new byte[60000*1024];
         allocation2=new byte[8000*1024];

         allocation3=new byte[1000*1024];
         allocation4=new byte[1000*1024];
         allocation5=new byte[1000*1024];
         allocation6=new byte[1000*1024];
    }
}

java -Xms3072M -Xms3072M -Xmn2048M -Xss1M -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=512M -jar order.jar

加上 -Xmn2048M

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lupDpcPz-1650626855803)(//upload-images.jianshu.io/upload_images/1510669-101775a24879c298.png?imageMogr2/auto-orient/strip|imageView2/2/w/1026/format/webp)]

JVM内存模型与Java线程内存模型的区别 总的来说,JVM内存模型和Java线程内存模型是Java程序运行时的两个重要方面,它们共同构建了一个稳定、高效的Java运行环境。JVM内存模型提供了整体的框架,而Java线程内存模型则在多线程情境下保证了数据的正确性和可见性。它是线程私有的,随着线程的创建而创建,随着线程的销毁而销毁。JVM内存模型主要关注Java程序在运行时的内存组织,而Java线程内存模型关注多线程环境下的数据共享和同步机制。JVM内存模型是整个Java虚拟机的内存结构,而Java线程内存模型则是在多线程环境下对内存的一种抽象。 阅读详情

相关推荐

如何实现VMware虚拟机上的ubuntu与windows主机共享文件夹

windows主机部分   在硬盘上任意位置新建文件夹,此处命名为Share,实际上随意。 接下来右键属性,操作如下系列图所示: 在硬盘上任意位置新建文件夹,此处命名为Share,实际上随意。 成功修改后,显示如下界面: VMware部分 ubuntu在关机状态下,点击“编辑虚拟机设置” 接下来,开启ubuntu系统,在终端输入: ·· vmware-hgfsclient ·· 将会显示如下画面,但是此时你可能找不到 /mnt/hgfs 这个路径,如果找不到该路径,则需要在虚拟

Mr.Sliver的博客 8221

jvm内存结构深度分析

查看上述的jvm参数: -Xms2048M:指最大堆内存 -Xmn1024M:指最小堆内存,一般会将最大和最小设置为相同的值 -XX:MetaspaceSize是指最大元空间,如果不设置的话默认为21M,如果此时加载的class比较多的话,那么会导致full gc,所以一定要设置该参数 有这么一段程序: public class Test1 { public static void main(String[] args) { int a =20 ; ...

u012222011的博客 795

医疗领域BGE-M3模型微调全流程:从数据准备到效果评估

本文详细介绍了医疗领域BGE-M3模型的微调全流程,从数据准备到效果评估。通过医疗数据微调,BGE-M3模型在临床问答、病历检索等场景中表现显著提升,能够准确理解医学术语之间的细微差别。文章还提供了实战练习代码和效果评估指标,帮助开发者快速掌握医疗文本嵌入模型的应用技巧。

weixin_29098367的博客 283

JVM内存模型简介

JVM内存模型简单介绍

weixin_44960490的博客 663

Echarts之风力风速玫瑰图

风力风速玫瑰图前言改进之路代码如下总结导出与导入 前言 今天上班收到任务,我们老大让我研究一下这个“风速风向玫瑰图”,还说这个是百度的雷达图的变异体,于是乎我直接找的雷达图,但是雷达图没有这种柱形的,都是点线,然后我又找了好久,最后突然在echarts官网上面看到了图1-2,才终于有了思路,原来这个图不是雷达图的变异体,而是极坐标系下的堆叠柱状图,于是就开始我的“改进”之路了。 图1-1 改进之路...

qq_38776605的博客 1万+

边表法

边表法是用来绘制填充一个面的,边表法的关键是边表和连接边表的扫描线。 对于边的描述利用边表数据结构,包含边与扫描线的交点x坐标,边的最大y坐标,这样可以知道边加入到哪些扫描线上,便还有一个指针来记录扫描线上其它边。 //边数据结构 #pragma once #ifndef __CAETZ__ #define __CAETZ__ #include "pch.h" #include "CPoin...

weixin_42376458的博客 2104

JVM配置

1、-Xms2048M-Xmx2048M 堆内存:最小1024M,最大1536M。(对象使用的内存) JVM初始分配的内存由-Xms指定,默认是物理内存的1/64 JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4 默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制。 因此服务器一般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。 ...

璃鹿的博客 2017

Unity UI适配核心:Canvas Scaler模式解析与2023版避坑指南

UI适配是游戏与应用开发中的基础挑战,其核心在于确保界面元素在不同屏幕分辨率与设备上保持视觉一致与功能可用。原理上,系统通过坐标转换与缩放计算,将设计稿的布局映射到物理屏幕。技术价值在于提升用户体验的一致性与产品的跨平台兼容性。应用场景广泛覆盖手游、PC端应用及各类交互界面。本文聚焦Unity引擎中的Canvas Scaler组件,深入剖析其Scale With Screen Size等模式的工作原理,并结合锚点设置、安全区域处理等高频搜索热词,提供解决UI错位、拉伸及异形屏适配等常见问题的工程实践方案,帮

weixin_30920597的博客 623

JVM运行参数介绍 -Xms -Xmx -Xmn -Xss

JVM运行参数介绍

荷塘月色 4029

单相全桥逆变器中比例谐振(PR)控制的优化设计与实现

本文深入探讨了比例谐振(PR)控制在单相全桥逆变器中的优化设计与实现。通过对比PID控制,详细阐述了PR控制在50Hz基波频率处实现无静差跟踪和强抗干扰性的原理。文章提供了从理论建模、参数整定(Kp, Kr, ωc)到仿真验证的完整实战流程,并介绍了准比例谐振(QPR)控制以增强频率鲁棒性,以及多谐振点设计以抑制特定谐波等进阶优化方法,最终实现THD从3%降至1%以内的显著性能提升。

weixin_29056781的博客 176

因时机器人-灵巧手配置方案(Ubuntu18.04)

因时机器人-灵巧手配置方案(Ubuntu18.04)

CH_monsy的博客 3855

jvm性能调优学习总结

jvm

得之专栏 1794

大学生作业:80C51存储器数据传输实验:基本指令和数据传送

大学生作业:80C51存储器数据传输实验,报价 200 文章目录实验一、80C51存储器数据传输实验实验目的:实验内容一:基本指令实验内容二:数据传送 实验一、80C51存储器数据传输实验 实验目的: 熟悉软件的集成开发环境 掌握单片机软件设计流程,掌握存储器结构及各窗口之间的联系 掌握内部数据存储器、外部数据存储器的数据传送特点和应用; 实验内容一:基本指令 用三种方法实现将累加器A内容改为20H ORG 0000H LJMP MAIN ORG 0030H MAIN: ;方法一使用寄

weixin_54707168的博客 5115

【Java进阶营】JVM内存模型

一、jvm内存模型 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P42nTjA8-1650623457943)(//upload-images.jianshu.io/upload_images/4469129-fa3f54aecf6ef8a2.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)] 下面说一下大概的一个流程: class文件会被类装载子系统装载。 装载到内存中也就是jvm运行时的

java364104的博客 621

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

JVM内存模型

Java在诞生之初就提出了"Write once,Run Anywhere"的口号,而这些都得益于JVM(Java Vritual Machine),可以提前在不同的运行环境(linux或windows等)上安装JDK之后,就可以让同一份代码在任何地方运行了。而这里的JDK(Java Development Kit)是Java语言、Java虚拟机和Java类库的统称。 一、JDK体系结构与Java跨平台特性 1.1 JDK体系结构 JDK是一个非常庞大的体系,里面包含了JVM、Java SE API(核心类

sermonlizhi的博客 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JVM内存模型和java内存模型

1. JVM内存模型 Java 虚拟机在执⾏ Java 程序的过程中会把它管理的内存划分成若⼲个不同的数据区域。JDK1.8 和之前的版本略有不同,下⾯会介绍到。 首先对于一个进程来说,它包含多个线程,每个线程都有其独立的内存区域,包括:虚拟机栈,本地方法栈和程序计数器。 程序计数器:线程私有 记录当前线程所执行到的字节码的行号。 每个线程都有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存区域。 它是唯一没有OutOfMemoryError情况的内存区域。

m0_45861545的博客 6285

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jvm内存模型和java内存模型

初识java虚拟机,就碰到一系列不懂的问题。我们以前常说java把局部变量放在栈里,new出来的变量放在堆里,然后堆里的数据不定时就给回收了。然后,如果是多线程的话,每个线程自己都有会一个私有的虚拟机栈,运行每个方法时都会创建一个栈帧,栈帧里存储着局部变量啦等信息,方法结束栈帧就出栈。这好像就是我们对java内存模型的第一次理解吧。直至今天,我看了java线程通讯之java内存模型,出现了主内存、...

番茄炒土豆的博客 9446

【Java 开发日记】我们来说一说 JVM 的内存模型

本文系统介绍了JVM内存结构(运行时数据区)的组成及其特性。主要内容包括:程序计数器(线程私有,记录执行位置)、Java虚拟机栈(存储方法调用栈帧)、Java堆(存放对象实例,GC主要区域)、方法区(存储类信息等,JDK8后改为元空间实现)和运行时常量池(存储字面量和符号引用)。此外还介绍了直接内存(NIO使用的堆外内存)。文章对比了各区域的线程共享性、存储内容和可能的内存异常(OOM/SOF),并区分了JVM内存结构与Java内存模型的不同概念。这些知识是理解Java程序运行机制和性能调优的基础。

纵有疾风起 人生不言弃 2154

JVM 内存模型

目录 1.JVM 内存模型是什么? ​1.1 什么是内存模型? 2. JVM 概述 3.JVM 体系结构 4.内存管理 5.碎片回收 6. 图解JVM 6.1 说明:😁😁😁😁😁 7. 将JVM抽象表示: 7.1 说明: 1.JVM 内存模型是什么? JVM是【Java Virtual Machine(Java虚拟机)】的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,...

分享it知识! 5230

「 JVM 」不容忽视的细节:JVM内存模型和Java内存模型

在 Java 中,JVM 内存模型(JVM Memory Model)和Java 内存模型(Java Memory Model, JMM)都是关于内存的关键概念,但它们处于不同层级,解决的问题也不同。JVM 内存模型关注的是运行时的内存结构,将内存划分为方法区、堆、程序计数器、虚拟机栈和本地方法栈。这些内存区域在 JVM 中具有特定的用途,比如方法区存储类信息和常量,堆则是对象实例的主要存放区。程序计数器用于跟踪当前线程的执行进度,虚拟机栈和本地方法栈则用来维护每个线程的方法调用状态和本地方法信息。

frozenpenguin的博客 2736

JVM内存模型与Java内存模型

博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主。

激流丶的博客 2471

JAVA内存模型与JVM内存结构

注意区分Java内存模型(Java Memory Model,简称JMM)与Jvm内存结构,前者与多线程相关,后者与JVM内部存储相关。本文会对两者进行简单介绍。

weixin_43681666的博客 3961

JVM内存模型详解

JDK(Java Development Kit)就是java 开发工具,从图中可以看到,JDK包含JRE,Java基础类库和Java工具,这是给开发者使用的产品。JRE(Java Runtime Environment)Java运行时环境,在运行java程序代码时,提供Java运行的所有环境集合,包括核心类库,JVM实现等,在安装jdk时,安装目录下会有一个jre的目录,jre目录下有一个lib目录和一个bin目录,lib目录中存放的是Java运行是所需要的核心类库,bin中的就是JVM的实现。

wswpomos的博客 4238

CPU内存模型、Java内存模型和JVM内存模型

CPU内存模型、Java内存模型和JVM内存模型

qq_40577332的博客 1583

Java JVM内存模型详解

Java虚拟机(JVM)内存模型是Java程序运行时的核心架构,它定义了程序运行时数据的存储和管理方式。理解JVM内存模型对于编写高性能、稳定的Java应用至关重要。

qq_38566870的博客 1410

Java内存模型与Jvm内存模型

经典问题 Q:说一下 Java(Jvm)的内存模型 A:Java内存模型是Jvm内存模型的抽象(深入理解JAVA虚拟机) JVM内存模型 线程安全--虚拟机栈、本地方法栈、程序计数器 非线程安全--方法区、堆(新生代,老年代)、 Meta Space(Jdk 1.8新增) Java内存模型 工作内存、主内存(对应JVM内存中的一部分) 追根溯源 Jvm内存模型 Java虚拟机运行时数据区 程序计数器:一块较小的内存空间,当前

chzh101011的博客 2753
上一篇: 【Java进阶营】怎么快速学好java
下一篇: 【Java进阶营】Java入门必备“学习路径和书籍”推荐
java364108
博客等级 码龄5年 2粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值