JAVA - 内存管理

目录

内存管理是什么

JVM内存区域组成

程序计数器PC

java虚拟机栈

本地方法栈

JAVA堆

方法区

常量池 

运行时常量池


内存管理是什么

Java的内存管理就是对象的分配和释放问题

分配 :内存的分配由程序完成的,程序员通过关键字new 为每个对象申请内存空间 (基本类型除外),所有的对象都在堆中分配空间

释放 :对象的释放由垃圾回收机制决定和执行

GC需要监控每个对象的运行状态,包括对象的申请、引用、被引用、赋值等

JVM内存区域组成

从逻辑上可将JVM内存分为5个部分,主要分为被所有线程共享的内存区域和仅被当前线程独占的内存区域

线程共享的内存区域包括堆和方法区

线程独占的内存区域包括虚拟机栈,本地方法栈,程序计数器

写程序时,需要判断当前数据读写的是存在于哪类内存区域,如果存在的是线程共享的内存区域,那么就要考虑是否存在线程安全问题,如果存在线程独占的内存区域,就没关系

程序计数器PC

线程私有的内存区域

每个线程都有自己的一个程序计数器,来表示当前线程执行的字节码行号

字节码解释器工作时通过改变程序计数器的值来选取下一条需要执行的字节码指令

如果线程执行的是一个Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址;如果线程执行的是一个Native方法,计数器的值为空

 

java虚拟机栈

线程私有的内存区域

栈以帧为单位保存线程的状态,JVM对栈只进行两种操作:以帧为单位的压栈和出栈操作 

每个方法执行的同时会创建一个栈帧,栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息,每个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程

栈帧中存放的局部变量有8种基本数据类型,以及引用类型(对象的内存地址)

当线程请求的栈的深度超出了虚拟机栈允许的深度时,会抛出StackOverFlow的错误

当Java虚拟机动态扩展到无法申请足够内存时会抛出OutOfMemory的错误

public void funcA() {
	int n = 3;
	funcB(n);
}
	
public void funcB(int n) {
	System.out.println("");
}

以上代码运行时,程序会先调用funcA方法,将funcA方法封装成"栈帧”入栈,由于funcA方法中调用了funcB,将funcB方法封装成"栈帧”入栈

先执行B中的逻辑,等于funcB栈帧出栈操作

然后执行A方法,等于funcA栈帧出栈操作 

本地方法栈

线程私有的内存区域

本地方法栈与虚拟机栈的区别:

虚拟机栈为虚拟机执行Java方法服务(也就是字节码),而本地方法栈为虚拟机使用到的Native方法服务

(Native方法:非java语言实现的函数,往往是由C/C++编写的,和操作系统相关性比较强的底层函数)

Java虚拟机规范对这个区域规定了两种异常情况:StackOverflowError 和 OutOfMemoryError异常

JAVA堆

每个Java应用都唯一对应一个JVM实例,每一个实例唯一对应一个堆。

应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程共享

Java堆属于线程共享区域,所有的线程共享这一块内存区域

Java堆的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存

Java堆是垃圾回收器管理的主要区域,从内存回收的角度看,由于现在收集器基本都采用分代收集算法,所以Java堆可以细分为:新生代、老生代

当Java虚拟机动态扩展到无法申请足够内存时会抛出OutOfMemory的错误

Java堆内存的OOM异常:

内存泄露:指程序中一些对象不会被GC所回收,它始终占用内存

内存溢出:程序运行过程中无法申请到足够的内存而导致的一种错误

方法区

线程共享区域

用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据

Java编译器是javac.exe把Java源文件编译成Java类文件,类加载的第一个阶段叫做“加载”,在这个阶段内,虚拟机将会读取被编译的Class文件生成Class对象,Class对象存储了一些类型信息,这些信息就是存储在方法区内

当方法区无法满足内存分配的需求时,将抛出OutOfMemoryError异常

常量池 

常量池用于存放编译期生成的各种字节码和符号引用

类和类之间是有调用关系的,怎么记录这些调用关系呢,可以通过类似指针的方式,在类A的字节码中留下一个指针,指向想要调用的类B的字节码,这里指针就起到了“链接”的作用

在类加载中,在虚拟机加载字节码的时候,首先加载的就是一些静态的“符号引用”,然后在类加载的“链接”阶段或者说程序运行时将符号引用转化为直接引用

这些符号引用信息就存储在常量池中

运行时常量池

运行时常量池属于方法区的一部分

运行时常量池存储着两大类数据:

1、编译期间产生的字节码中定义的静态信息,比如:

        --字节码生成的Class对象(比如常量池)

        --由字节码生成的字面量(编写代码中所定义的常量自变量)

2、运行期间产生的信息

        --运行时会将一部分符号引用转换为直接引用,将直接引用保存在运行时常量池

        --常见的字符串常量池

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【iOS】内存管理五大区

参考博客:iOS内存管理学习第一篇-内存五大区 3.1 OC特性之 内存五大区域 1. 简述 程序要想执行,第一步就需要 被加载到内存中 内存五大区域: 栈区,堆区,静态区,常量区,代码段. 栈区(stack)由编译器自动分配并释放,存放…

React 安装 报错“Modal不能用作jsx组件”

提示 :‘Modal’ cannot be used as a JSX component. 原因:可能导致是类似antd组件报错 要确认react ts 版本是否适配 解决方法: 第一步:查看代码中的 package.json 文件 查看 typescript 与 types/react 第二步:查…

Shuffle简单理解

map的结果本身是无序的,但是map输出的结果有序 mapper和reduce是不同的机器,进行了网络传输,所以存在数据拷贝 第二次排序,是将每个reduce对应的task进行排序,然后再进入reduce maptask运行结束,每个mask块…

详解Windows安装分布式版本控制系统git

文章目录 前言下载安装相关链接 前言 git是一个分布式版本控制软件,最初由Linux创作者Linus Torvalds创作,并于2015年以GPL许可协议发布。git易于学习,占用空间小,性能却快如闪电,可以快速、 高效的管理从小到大的项目…

Java设计模式-责任链(Chain of Responsibility)模式

介绍 Java责任链(Chain of Responsibility)设计模式是指很多处理对象构成一个链,链中前一个对象指向后一个对象。请求在链中传递,一个请求可以被一个或者多个对象处理。调用方(即客户端)不知道请求会被链中…

DT灯光基础(辉光 雾 阴影 渲染选项)

点光源 不能宣染,换个版本。不能正常预览 聚光灯 t 手柄 挡光版 平行光阴影 光线追踪阴影 没有看见阴影 灯光使用贴图 环境光 不进行渲染物体 不渲染阴影 接收阴影 不反射 可以看到反射 没有反射了 灯光链接 取消灯照 灯光雾 辉光 变化不明显

瑞芯微|如何让拥有双网口的Linux设备实现数据包转发?

本文主要讲解如何,解决基于3568实现双网口互通问题。 一、组网 如下图所示: rk3568自带2个千兆以太口,对应网卡名称为:eth0、eth1pc1和pc2分别连接这2个网口pc1与eth0连接,网段:192.168.30.0pc2与eth1连…

PostgreSQL 的就业前景如何?

PostgreSQL的就业前景非常广阔,它是一种功能强大、可靠且开源的关系型数据库管理系统。以下是说明PostgreSQL就业前景的几个关键点: 1.高需求:随着企业和组织对数据存储和管理的需求不断增长,对数据库专业人员的需求也在持续上升…

喜讯!旭帆科技成功入驻“科大硅谷”!

2023年7月,安徽旭帆信息科技有限公司(以下简称“旭帆科技”)成功入驻“科大硅谷”,成为合肥城市发展新引擎、科创生态集群企业队伍中的一员。 “科大硅谷”项目建设总投资约75.82亿,共计17.37平方公里,是聚…

idea手动导入了包但编译运行还是报找不到xxx.jar包的问题

1、先把jar包放目录下并add as libary 2、在pom.xml中加入 <!--添加的本地的外部jar包依赖--><dependency><!--groupId、artifactId、version为自定义&#xff0c;groupId与artifactId但是不能重名--><groupId>JNative</groupId><artifactId…

如何设计光场2.0(聚焦型光场相机)系统参数

1. 系统参数设计 目前的硬件系统的现状&#xff1a;主透镜50mm&#xff0c;MLA&#xff1a;15*15&#xff0c;d0.5mm&#xff0c;f15mm&#xff0c;s4.8um 开普勒型光场系统&#xff1a; 首先我们需要确定系统的M&#xff0c;M参数表示单个位置的点能被多少个小微透镜成像&am…

分享一个唯美雪花界面

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>雪</title><meta name"viewport" content"widthdevice-width, initial-scale1&…

【3-D深度学习:肺肿瘤分割】创建和训练 V-Net 神经网络,并从 3D 医学图像中对肺肿瘤进行语义分割研究(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f308;4 Matlab代码实现 &#x1f4a5;1 概述 使用3D深度学习进行肺肿瘤分割是一种有前景的研究方向。V-Net是一种常用的3D神经网络&#xff0c;特别适用于医学图像分割任务。下面是一个基本…

【Web安全】小白怎么快速挖到第一个漏洞,src漏洞挖掘经验分享,绝对干货!

src漏洞挖掘经验分享 – 掌控安全以恒 一、公益src 公益src是一个白帽子提交随机发现的漏洞的品台&#xff0c;我们可以把我们随机发现或者是主动寻找到的漏洞在漏洞盒子进行提交。 在挖掘src的时候不能越红线&#xff0c;一般情况下遇到SQL注入 只获取数据库名字以证明漏洞的…

android JSBridge的加载时机问题

https://github.com/lzyzsd/JsBridge 也算是比较悠久和使用了。 可供参考的android和IOS&#xff0c;以及前端的使用 https://segmentfault.com/a/1190000018208609 遇到的问题&#xff1a; 比如&#xff1a; 从前端在加载WebView的时候&#xff0c;执行了某些动作&#xff0c…

qiankun:react18主应用 + 微应用 react18 + vue3

一&#xff1a;主应用 搭建react项目 npx create-react-app react-qiankun-main安装Antd npm install antd –save在 index.js中引入 import { ConfigProvider } from "antd"; import zhCN from "antd/locale/zh_CN"; import "antd/dist/reset.css…

【C++】将类对象转换成基本数据类型

2023年7月19日&#xff0c;周三晚上&#xff1a; 今天晚上看源码的时候&#xff0c;突然在某个类里面看到了“operator bool() const;”&#xff0c;我完全想不起来这是啥意思了&#xff0c;于是今晚重新学习了一下 目录 类型转换函数的定义类型转换函数的作用 类型转换函数的…

Redis(三)存储原理与数据模型(hash冲突、渐进式rehash)

Redis系列文章 Redis&#xff08;一&#xff09;原理及基本命令&#xff08;柔性数组&#xff09; Redis&#xff08;二&#xff09;网络协议和异步方式&#xff08;乐观锁&悲观锁&#xff09; Redis&#xff08;三&#xff09;存储原理与数据模型&#xff08;hash冲突、渐…

超牛逼黑客帝国代码雨,装X必用

html 1.用法 在电脑桌面新建一个文本文档&#xff0c;然后将代码复制到文本文档里&#xff0c;再将后缀改为".html"。 2.效果图 <!DOCTYPE html> <html> <head><title>黑客帝国代码雨</title> </head><body> <can…

C++编程(四) —— OOP

文章目录 前言一、this指针二、构造和析构三、深拷贝浅拷贝浅拷贝深拷贝 编程实践 前言 什么是OOP思想&#xff1f; OOP语言的四大特征&#xff1a; 抽象&#xff0c;封装/隐藏&#xff0c;继承&#xff0c;多态 一、this指针 this指针》类》很多对象 一套成员方法是如何处…