JVM内存模型剖析

news2024/11/27 6:22:15

JDK体系结构在这里插入图片描述

JDK:JDK提供了编译、运行Java程序所需的各种资源和工具;包括Java编译器,Java运行时环境:JRE;开发工具包括编译工具(javac.exe)打包工具(jar.exe)等。
JRE: 即JAVA运行时环境,JVM就是包括在JRE中,以及常用的JAVA类库等;
SDK: SDK是基于JDK进行扩展的,是解决企业级开发的工具包。如JSP、JDBC、EJB等就是由SDK提供的 ;

Java语言的跨平台特性

在这里插入图片描述
在多平台上都有自己的JDK编译器,当运行时在各自的虚拟机中运行。

JVM整体结构及内存模型

在这里插入图片描述


public class Math {

	public static User user = new User();
		
    public Math() {
    }

    public int compute() {
        int a = 1;
        int b = 2;
        int c = (a + b) * 10;
        return c;
    }

    public static void main(String[] args) {
        Math math = new Math();
        math.compute();
    }
}

new出来的对象一般放在堆里,有时放在栈上。栈内存区域(线程栈),只要有一个线程开始运行我们的主方法,Java虚拟机会在我们的线程栈分配独立的空间,用来存储运行过程中的局部变量。栈内部结构比较复杂:
栈帧:当main方法运行,会分配一个专属的内存栈,用来放main方法的局部变量。compute方法执行,又会分配一个栈帧空间,放compute方法内部的变量,一个方法对应独立的栈帧内存区域,栈帧把不同方法内存隔离,栈帧和程序的调用顺序一致,后分配的空间先释放掉。一个方法分配一个新的内存栈帧空间。栈帧内存空间除了存局部变量,还有操作数栈,动态链接,方法出口。(局部变量不是栈结构,操作数栈是)
        程序计数器:每个线程独有,放程序运行代码的内存位置,也叫行号,指定了运行代码的内存位置。
        Math.class最终是加载到方法区,字节码执行引擎执行方法区的Math,当其他线程抢占了,恢复时恢复到程序计数器的位置,将操作数栈的数据取出,执行iadd,结果重新压回操作数栈,继续执行,将10压入操作数栈,将操作数栈数据取出,执行imul,得到30,压回操作数栈,是操作数存储值的地方,是做计算的临时的中转内存空间。
        动态链接:把符号引用转变为直接引用,在程序运行过程中,compute是常量池里的符号,运行到时解析这个符号,找这个符号对应的代码,将符号引用转换为符号对应的代码的在内存里的直接地址,时符号的直接引用代码。
        方法出口,方法执行完后返回,要返回哪个位置放在方法出口中
        main栈帧局部变量表,new的Math对象放在堆里,局部变量math在局部变量表中,存放math在堆中的内存地址。
        方法区:常量池放到方法区,运行时常量池放到方法区。
组成:常量+静态变量+类信息,静态变量如果是对象,放在堆里,user变量指向它。
        本地方法栈:native本地方法,C++实现,如果需要调用到本地方法,分配内存空间,线程栈里也有本地方法栈,堆和方法区市所有线程共享的区域,栈、本地方法栈、程序计数器是每一个线程独有的。
        堆:包含老年代,年轻代,年轻代包含Eden区,Survivor区,默认年轻代占1/3,老年代占2/3,Eden区和Survivor区比例为8:1:1,当Eden区放满后触发minor gc(由字节码执行引擎执行)。
        gc root根节点:包括线程栈的本地变量、静态变量、本地方法栈的变量等等。做垃圾回收时,非垃圾对象赋到S0(Survivor0),Eden区的其他对象即为垃圾对象直接干掉,一个对象经历过一次gc还存活,它的分代年龄会+1,分代年龄存在对象头;第二次出发minor gc不但回收Eden区,还回收S0区,S0以及Eden还存活的对象放到S1,分代年龄+1,下次gc再移到S0,经历了15次gc的对象放入老年代,如果老年代满了触发FullGC,回收堆和方法区,再放满则触发OOM。
        STW:停止整个世界,Full GC STW的时间长Eden区STW的时间短,几乎察觉不到。为什么要STW?GC过程中找到的对象,但这个对象随程序执行结束变为垃圾对象,之前认为是非垃圾对象,至少在找对象的过程中STW。方法区(元空间)用的直接内存,当方法区满了(默认25M),会触发FullGC。初始大小会自动调小,所以-XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M,方法区一定要设置。

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

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

相关文章

小程序样例2:简单图片分类查看

基本功能: 1、根据分类展示图片,点击类目切换图片: 2、点击分类编辑,编辑分类显示: 3、点击某个分类,控制主页该分类显示和不显示: 类目2置灰后,主页不再显示 4、点击分类跳转到具…

大数据开发之kafka(完整版)

第 1 章:Kafka概述 1.1 定义 Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。 发布/订阅:消息的发布者不会将消息直接发送给特定的订阅者,而是将发布的消息分为不同的类别,订阅者只…

Linux系统安装Samba服务器

在实际开发中,我们经常会有跨系统之间文件传递的需求,Samba 便是能够在 Windows 和 Linux 之间传递文件的服务,功能也是非常强大和好用,本篇文章将介绍如何在 Linux 系统上安装 Samba 服务,以 CentOS7 系统为例。 一、…

Java强软弱虚四大引用

文章目录 一、强引用二、软引用三、弱引用四、虚引用 提示:以下是本篇文章正文内容,下面案例可供参考 一、强引用 在Java中,强引用(Strong Reference)是最常见的引用类型。当我们创建一个对象并将其赋值给一个变量时…

Spring Boot整合Spring Security:构建安全的Web应用

文章目录 1. 添加依赖2. 配置Spring Security3. 创建用户服务4. 控制器和视图5. 运行应用 Spring Security是一个强大的身份验证和访问控制框架,用于保护Spring应用程序。它提供了全面的安全服务,包括身份验证、授权、攻击防护等。本文将介绍如何在Spr…

让uniapp小程序支持多色图标icon:iconfont-tools-cli

前景: uniapp开发小程序项目时,对于iconfont多色图标无法直接支持;若将多色icon下载引入项目则必须关注包体,若将图标放在oss或者哪里管理,加载又是一个问题,因此大多采用iconfont-tools工具,但…

原码,补码的除法

目录 一.原码的除法 (1)恢复余数法 重点看这 (2)不恢复余数法(加减交替法) 重点看这 二. 补码除法运算 重点看这 我们已经学习了如何进行原码,补码的乘法: http://t.csdnimg…

【代码整理】基于COCO格式的pytorch Dataset类实现

import模块 import numpy as np import torch from functools import partial from PIL import Image from torch.utils.data.dataset import Dataset from torch.utils.data import DataLoader import random import albumentations as A from pycocotools.coco import COCO …

Spring MVC精解:技术内幕与最佳实践

第1章:引言 大家好,我是小黑,咱们今天来聊聊Spring MVC,它是Spring的一个模块,专门用来构建Web应用程序。提供了一种轻量级的方式来构建动态网页。就像小黑我刚开始接触Java时候一样,可能对这些听起来很高…

GitHub 一周热点汇总第6期(2024/01/14-01/20)

GitHub一周热点汇总第6期 (2024/01/14-01/20) ,梳理每周热门的GitHub项目,这一周的热门项目中AI的比重难得的变低了,终于不像一个AI热门项目汇总了,一起来看看都有哪些项目吧。 #1Maybe 项目名称:Maybe - 个人理财应…

4496 蓝桥杯 求函数零点 简单

4496 蓝桥杯 求函数零点 简单 //C风格解法1&#xff0c;通过率100% #include <bits/stdc.h> // int a, b; 一定会自动初始化为 0int main(){int a 2, b 3; // 定义a&#xff0c;b&#xff0c;不会自动初始化&#xff0c;最好自己定义时初始化// windows环境下a值固定&…

Broadcom交换芯片56620架构

文章目录 架构1.系统逻辑视图2.逻辑芯片视图3.芯片框图4.MIIM&#xff08;Medium Independent Interface Management&#xff09;5.交换结构6.CAP 架构 1.系统逻辑视图 Ingress Chip作用&#xff1a; 解析报文128字节的头部&#xff08;MMU&#xff08;Memory Management Uni…

html5实现好看的年会邀请函源码模板

文章目录 1.设计来源1.1 邀请函主界面1.2 诚挚邀请界面1.3 关于我们界面1.4 董事长致词界面1.5 公司合作方界面1.6 活动流程界面1.7 加盟支持界面1.8 加盟流程界面1.9 加盟申请界面1.10 活动信息界面 2.效果和源码2.1 动态效果2.2 源码目录结构 源码下载 作者&#xff1a;xcLei…

dpwwn:03

靶场下载 https://download.vulnhub.com/dpwwn/dpwwn-03.zip 信息收集 # nmap -sn 192.168.1.0/24 -oN live.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-17 21:18 CST Stats: 0:00:00 elapsed; 0 hosts completed (0 up), 255 undergoing ARP Ping Sc…

力扣:494. 目标和(动态规划)(01背包)

题目&#xff1a; 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前添加…

【设计模式】什么是外观模式并给出例子!

什么是外观模式&#xff1f; 外观模式是一种结构型设计模式&#xff0c;主要用于为复杂系统、库或框架提供一种简化的接口。这种模式通过定义一个包含单个方法的高级接口&#xff0c;来隐藏系统的复杂性&#xff0c;使得对外的API变得简洁并易于使用。 为什么要使用外观模式&a…

Leetcode的AC指南 —— 栈与队列:225.用队列实现栈

摘要&#xff1a; **Leetcode的AC指南 —— 栈与队列&#xff1a;225.用队列实现栈 **。题目介绍&#xff1a;请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 …

【flutter】完全自定义样式模态对话框

示例完成结果展示&#xff1a; 示例组件代码&#xff1a; context&#xff1a;上下文 title&#xff1a;提示标题&#xff0c;null时不显示 content&#xff1a;提示内容&#xff0c;null时不显示 cancelText&#xff1a;取消按钮文字&#xff0c;null时不显示取消按钮 confirm…

Canny边缘检测 双阈值检测理解

问题引入 我们用一个实际例子来引入问题 import cv2 import numpy as npimgcv2.imread("test.png",cv2.IMREAD_GRAYSCALE) # 修改图像大小 show cv2.resize(img,(500,500))v1cv2.Canny(show,120,250) v2cv2.Canny(show,50,100)# 连接图像 res np.hstack((v1,v2)…

MSPM0L1306例程学习-UART部分(2)

MSPM0L1306例程学习系列 1.背景介绍 写在前边的话&#xff1a; 这个系列比较简单&#xff0c;主要是围绕TI官网给出的SDK例程进行讲解和注释。并没有针对模块的具体使用方法进行描述。所有的例程均来自MSPM0 SDK的安装包&#xff0c;具体可到官网下载并安装: https://www.ti…