java内存模型 堆栈_Java内存模型分析

2023-11-17

一、Java内存的构成

先上一个官方java document里的图:

82e42d1ced5acf9eeab180f26a288ef8.gif

由上图可知,整块区域分为Young Generation、Tenured Generation、Permanent Generation。

详细解释一下Young区:

Young区又分为:Eden、Survivor Space。

Survivor Space又分为 To Survivor、 From Survivor,如下图所示:

0b4f07b4cf1be5a430288558784dedef.png

Java内存分为 堆内存(heap)和 Permanent区。

1、Java堆内存(heap):

–是 JVM 用于分配 Java 对象的内存,包含活动对象和不可用对象

–堆大小通常是在服务器启动时使用 java 命令中的 –Xms(最小) –Xmx(最大)标志来定义。

2、Permanent区:

–指内存的永久保存区域

–是Sun JDK和HP JDK用来加载类(class)和Meta信息的专门的内存区

–这个区域不归属Java堆内存(heap)范围

–Class在被Loader时就会被放到此,如果Java应用很大,例如类(class)很多,那么建议增大这个区域的大小来满足加载这些类的内存需求

–通过–XX:PermSize=***M –XX:MaxPermSize=***M调整

这里还有一个本地内存的概念:

·本地内存(native memory):

–是 JVM 用于其内部操作的本地内存(非Java内存)

–JNI 代码和第三方本地模块(例如,本地 JDBC 驱动程序)也使用本地内存

–最大本地内存大小取决于以下因素:操作系统进程内存大小限制、已经指定用于 Java 堆的内存

也就是说,整个物理机的内存可以说由以下部分构成:

物理内存 = Java 内存 + 本地内存 + 操作系统保留的内存

二、垃圾回收(Garbage Collection,GC)

1、为什么要垃圾回收

–JVM自动检测和释放不再使用的内存。

–Java 运行时JVM会执行 GC,这样程序员不再需要显式释放对象。

2、垃圾回收(GC)的分类

–Minor GC

–Full GC

3、垃圾回收(GC)的产生过程

1)新生成的对象在Eden区完成内存分配

2)当Eden区满了,再创建对象,会因为申请不到空间,触发minorGC,进行young(eden+1survivor)区的

垃圾回收。(为什么是eden+1survivor:两个survivor中始终有一个survivor是空的,空的那个被标记成To

Survivor)

3)minorGC时,Eden不能被回收的对象被放入到空的survivor(也就是放到To

Survivor,同时Eden肯定会被清空),另一个survivor(From

Survivor)里不能被GC回收的对象也会被放入这个survivor(To

Survivor),始终保证一个survivor是空的。(MinorGC完成之后,To Survivor 和 From

Survivor的标记互换)

4)当做第3步的时候,如果发现存放对象的那个survivor满了,则这些对象被copy到old区,或者survivor区没有满,但是有些对象已经足够Old(通过XX:MaxTenuringThreshold参数来设置),也被放入Old区

5)当Old区被放满的之后,进行完整的垃圾回收,即 Full GC

6)Full GC时,整理的是Old Generation里的对象,把存活的对象放入到Permanent Generation里。

4、垃圾回收的回收器

–串行(–XX:+UseSerialGC )

Out of Box算法,年轻代串行复制,年老代串行标记整理,主要用于桌面应用

–并行(–XX:+UseParallelGC )

年轻代暂停应用程序,多个垃圾收集线程并行的复制收集,年老代暂停应用程序,与串行收集器一样,单垃圾收集线程标记整理。JDK 6.0启用该算法后,默认启用了-XX:+UseParallelOldGC,性能大为提高

–并发(Concurrent Low Pause Collector)( –XX:+UseConcMarkSweepGC )

启用该参数,默认启用了-XX:+UseParNewGC;简单的说,并发是指用户线程与垃圾收集线程并发,程序在继续运行,而垃圾收集程序运行于其他CPU上。

三、Java内存的调优参数

-Xmx1024m:

设置JVM最大可用内存为1024M。

-Xms1024m:

设置JVM促使内存为1024M。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。

-Xmn512m:

设置年轻代大小为512M。(持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。)

-Xss128k:

设置每个线程的堆栈大小。这个值可以根据应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成。

-XX:NewRatio=4

设置年轻代(包括Eden和两个Survivor区)与年老代的比值(总的大小是Xms的值)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5。

举个例子,-Xms 设置为 1024m,-Xmx 也设置为 1024m的情况下:

·年轻代 = 1024M/5 = 204.8M

·年老代 = 1024M/5*4 = 819.2M

如果-Xms和-Xmx的值设置的不一样,可以添加 -XX:MinHeapFreeRatio= 和

-XX:MaxHeapFreeRatio= 参数,使内存的大小能够在 大于 -Xms 和 小于 -Xmx

之间的范围内自动调整,所以内存中会有Virtual的空间(我是这样理解的,不是太清楚,这里需要大家指教)

By default, the virtual machine grows or shrinks the heap at

each collection to try to keep the proportion of free space to live

objects at each collection within a specific range. This target range is

set as a percentage by the parameters

-XX:MinHeapFreeRatio= and

-XX:MaxHeapFreeRatio=, and the total size is bounded

below by -Xms and above by -Xmx .

-XX:SurvivorRatio=4:

设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

-XX:MaxPermSize=16m:

设置持久代大小为16m。

-XX:MaxTenuringThreshold=0:

设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效

率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

总结如下图:

181c858e3ef989e580706180120cf386.gif

四、内存分配中会出现的错误

关于内存最常见的错误应该是这两个:

— 内存溢出 Out Of Memory(OOM)

— 内存泄露 Memory Leak (ML)

1、内存溢出

内存溢出发生在这种状况下:Java内存完成Minor GC 之后想要把还存活的对象放到 Old区 里,但是这时Old区 已经满了,同时 Permanent区也已经放不下存活的对象。这时就会产生 OOM 错误。

2、内存泄露

在Java中,内存泄漏就是存在一些被分配的对

象,这些对象有下面两个特点,首先,这些对象是有被引用的,即在有向树形图中,存在树枝通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用

这些对象。如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。

找到一个例子:

“这里引用

一个常看到的例子,在下面的代码中,循环申请Object对象,并将所申请的对象放入一个Vector中,如果仅仅释放对象本身,但因为Vector仍然

引用该对象,所以这个对象对GC来说是不可回收的。因此,如果对象加入到Vector后,还必须从Vector中删除,最简单的方法就是将Vector对

象设置为null。

Vector v =newVector(10);

for(inti =1; i <100; i++)

{

Object o =newObject();

v.add(o);

o =null;

}//此时,所有的Object对象都没有被释放,因为变量v引用这些对象。

实际上这些对象已经是无用的,但还被引用,GC就无能为力了(事实上GC认为它还有用),这一点是导致内存泄漏最重要的原因。”

3、补充一个:PermGen space Error

因为 GC 不会在主程序运行期对PermGen space进行清理,所以如果应用中有很CLASS需要Load的话,就很可能出现PermGen space错误。

另外如果WEB APP下使用了大量的第三方jar, 其大小超过了 jvm 默认的大小那么也会产生此错误信息了。

五、总结

上面4点的内容可以跟下面这个图来进行融合:

938468e21b38d9a8da0b29fc551d77a6.png

======================= 全文完 =================

喜欢 (0)or分享 (0)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java内存模型 堆栈_Java内存模型分析 的相关文章

  • 信息安全建设之开源安全产品

    对于中小企业来说 有很多免费且开源的路由器和防火墙解决方案 甚至可以作为企业的选择 这类产品中 很多都提供局域网服务 如VPN服务 热点网关和通过强制网络门户以共享无线网络 当我们在考虑安全解决方案的时候 最便于操作的肯定是商业产品 最经济
  • [整理][LaTex]小技巧之——首行缩进

    0 简介 在LaTex编辑时 有时会遇到这样一个有关于首行缩进的问题 在汉语环境的编辑下 习惯上每段会进行一个两个字的缩进 但是在默认编辑模式下 一个章节下的首段是没有首行缩进的 本文的目的主要是解决中文情况下首段缩进的情况 1 默认情况
  • Java入门 (超详细)JDK(1.8)下载与安装及环境变量的配置教程

    第一步 下载JDK 8 Oracle官网下载地址 https www oracle com java technologies javase javase8u211 later archive downloads html 进入官网JDK
  • 鸿蒙是一个怎么样的操作系统,真的是安卓套壳吗?

    从鸿蒙项目正式推出以来 就一直有各自声音 有看好的 认为鸿蒙的出现将会成为一个智能终端设备操作系统的框架和平台 促进万物互联产业的繁荣发展 也有的人在唱衰 觉得鸿蒙发展不起来 甚至认为鸿蒙只是安卓的换皮 套壳 那事实是怎么样的 鸿蒙与安卓之
  • 微信群发图文消息步骤说明

    前段时间学习微信接口开发 心得与大家分享 第一步 调用 上传下载多媒体接口 上传图片 接收微信服务器返回结果 解析获取返回的url的值 等待备用 第二步 调用 上传图文消息素材 接口 截图中红色方框标记的thumb media id的值替换
  • WireShark常用过滤规则

    一 地址过滤 对源地址及目的地址过滤 ip src 192 168 0 1 ip dst 192 168 0 1 对源地址或者目的地址过滤 ip addr 192 168 0 1 排除某个地址数据包过滤 ip addr 192 168 0
  • Linux中使用pip安装库时出现Aborted (core dumped)问题解决方案

    作者 陈玓玏 在Linux中安装上pip后 通过pip install安装python库时出现这个问题 root DZG0370 mnt c Windows System32 pip3 install pandas Downloading
  • Inno Setup 如何让生成的setup.exe文件有管理员权限

    首先 在 Setup 段 PrivilegesRequired admin 然后 找到INNO安装目录下的SetupLdr e32文件 将程序中的Manifest更改一下 用reshacker这类工具改 这样运行程序的时候 Windows
  • php use not allowed,PHP Curl - Received HTTP/0.9 when not allowed

    问题 I stumbled over a weird behavior when I try to send a post HTTP 2 0 request to apples push service http2ch curl init
  • 哈工大操作系统实验二:系统调用的实现

    实验链接 文章目录 前言 做实验前一定要先拍个快照 操作系统实验环境的搭建请看如下链接 Ubuntu系统 Linux0 11环境搭建 一 实验内容 二 基础知识 三 实验步骤 注 因为实验一已经修改过启动文件 但此次实验需要完整的启动文件
  • 小白如何做好项目管理?看这里

    作为项目管理新手 你刚被安排负责一个重要的新项目 这是你的第一个项目 是一个重大的挑战 以下这些方法可以帮你有个好的开始 成功管理你的第一个项目 一 学习和培养能力 能力发展首先要突破不知道没有能力 认识项目管理是一个职业方向 通过了解项目
  • MySql Community Downloads 社区版下载地址

    https dev mysql com downloads mysql
  • Servlet+JSP+JavaBean开发模式(MVC)介绍

    好伤心 写登陆注册之前看见一篇很好的博文 没有收藏 然后找不到了 前几天在知乎上看见一个问题 什么时候感觉最无力 前两天一直想回答 尝试过google到的所有solve case 结果bug依然在 今天想回答 明明遇见过 就是找不到那篇文的
  • 深度学习 卷积神经网络即插即用的小插件

    卷积神经网络即插即用的小插件 前言 卷积神经网络设计技巧 小插件 STN ASPP Non local SE CBAM DCN v1 v2 BlurPool RFB ASFF 代码实现 前言 本篇博客主要介绍卷积神经网络中的即插即用的模块
  • Python日志库logging总结(最全的版本)

    转自 https cloud tencent com developer article 1354396 1 日志级别 Python 标准库 logging 用作记录日志 默认分为六种日志级别 括号为级别对应的数值 NOTSET 0 DEB
  • (前端)HTML之表格

    表格标签 table 的基本语法 table 表格容器tr 列td 单元格th 粗体caption 标题列 例子 table width 400 border 1 cellspacing 2 cellpadding 2 align left
  • python中两种getter和setter方法

    当给属性赋值的时候 使用实例 属性 属性值的方式显然把属性暴露出来了 并且也无法对属性值进行限制检查 java中提供了setter和getter方法 那么python是如何做的呢 在绑定属性时 如果我们直接把属性暴露出去 虽然写起来很简单
  • 【指针内功修炼】函数指针 + 函数指针数组 + 回调函数(二)

    文章目录 1 函数指针 2 函数指针数组 函数指针数组的用途 3 指向函数指针数组的指针 4 回调函数 冒泡排序 qsort 排序 qsort 排序整型数组 qsort 排序结构体 模拟实现 qsort 1 函数指针 函数指针 顾名思义 就
  • List转换为String

    public static void main String args List

随机推荐

  • JBOSS实践一:安装

    因为工作关系 需要接受一套基于JBOSS容器的应用 首先从JBOSS环境搭建开始 JBOSS环境可以在一台机器上运行 也可以在一台机器上部署多套JBOSS 一 目标 1 在一台机器上部署JBOSS 4 2 2 GA 原系统运行于此 2 在一
  • Ubuntu18.04安装pcl(过程/坑记录式教程)

    Ubuntu18 04安装pcl 1 下载pcl 2 安装依赖项 3 编译 4 安装 5 网上教程说要安装QT5和VTK 但按照本文的 本文记录了安装时出现的问题 出错的安装命令也记录了 建议浏览一遍再参考 不要错用了错误的指令 1 下载p
  • background属性介绍

    background属性在CSS中有较多的应用 主要用来设置背景颜色 图片 background属性可以分开写 也可以合并 建议合并减少代码量 1 background color 设置背景颜色 设置的背景颜色会填充元素的内容 内边距和边框
  • 【SpringBoot笔记39】SpringBoot + SockJS + Stomp实现WebSocket通信(建立连接、发送消息、订阅消息、断开连接)

    这篇文章 主要介绍SpringBoot SockJS Stomp实现WebSocket通信 建立连接 发送消息 订阅消息 断开连接 目录 一 WebSocket通信 1 1 前端环境 1 2 后端环境 1 3 添加WebSocket配置
  • 传统程序优化与终身程序优化

    传统程序优化示例一 cpu示例 3个方面浅谈程序优化 每一个程序员都有一个大梦想当初在学校实验室的时候 常常写一个算法 让程序跑着四处去晃荡一下回来 结果也就出来了 可工作后 算法效率似乎重要多了 毕竟得真枪实弹放到产品中 卖给客户的 很多
  • uni-app,文本实现展开、收起全文

    效果 思路 1 根据文本显示的布局中 每行大致能显示的文字个数 实例是大致每行26个文字 2 首先加载页面时 根据文字总长度判断是否超出自定义行数 来处理相应的数据 多余自定义行数 截取对应的文字个数做显示 代码与讲解 1 设置参数 scr
  • 【Docker】Docker快速入门,常用网址与常用命令

    目录 一 docker常用网址 建议收藏 docker官方公开库 Docker Hub docker官方网站 Home Docker docker菜鸟联盟教程 Docker 教程 菜鸟教程 二 docker常用命令 一 镜像使用 1 镜像操
  • Mastering Debugging in Visual Studio 2010 - A Beginner's Guide

    Mastering Debugging in Visual Studio 2010 A Beginner s Guide http www codeproject com Articles 79508 Mastering Debugging
  • 非常好用的自动化运维工具------ansible

    目录 一 ansible 简介 1 ansible 是什么 2 ansible 特点 3 ansible 架构图 二 ansible的配置部署 1 使用 yum 安装epel源和ansible 2 修改ansible的仓库文件 3 配置公私
  • 一图看懂 Unity函数执行顺序/Unit脚本生命周期

    温故而知新 有些函数过久了忘了调用顺序 发个文记一下 下边有对各个函数的解释 第一个场景加载 这些函数在场景开始时被调用 场景中的每个对象一次 Awake 这个函数总是在任何 Start 函数之前调用 也只是在一个预制件被实例化 如果游戏对
  • 二叉树交换左右子树的三种实现方式

    二叉树交换左右子树的三种实现方式 顺序存储结构 链式存储结构 顺序存储结构 交换左右子树实际上就是同层之间交换位置 在顺序存储结构下 先确定树的深度 再划分层 每个层内做交换即可 链式存储结构 递归实现很简单 非递归可以借助栈或队列辅助实现
  • 区块链数据库

    大家好 这里是链客区块链技术问答社区 链客 有问必答 区块链是互联网未来十年中举足轻重的技术 区块链 Blockchain 或者说分布式账本 DLT Distributed Ledger Technology 最早是起源于比特币的一个重要概
  • ruoyi框架时间范围range增加今日,近7日,近30日时间选择

    原先layui时间控件是不支持今日 近7日 近30日选择的 网上的解决方法是直接在引用的js中修改代码 这是一种方法 但是对于不能修改源代码的童鞋来说是不行的 所以一下解决方法诞生了 直接添加这三个按钮并和时间控件 laydate 有友好的
  • 【数字图像处理】图像形态学算法C语言实现(图像卷积,膨胀,腐蚀,开运算,闭运算,顶帽,黑帽,雕版,锐化)

    文章目录 一 图像卷积 1 图像卷积 2 数字信号处理中的卷积 3 数字图像处理中的卷积 二 图像卷积实现各种形态学运算 腐蚀 膨胀 形态学梯度 开运算 闭运算 顶帽 黑帽 雕版 锐化 li conv c main c 三 效果展示 原图
  • SPI转can芯片CSM300详解以及Linux驱动移植调试笔记

    更多嵌入式Linux干货 请关注 一口Linux 一 CSM300概述 CSM300 A 系列是一款可以支持 SPI UART 接口的CAN模块 1 简介 CSM300 A 系列隔离 SPI UART 转 CAN 模块是集成微处理器 CAN
  • Linux常用命令合集(二)

    file命令 该命令用于判断接在file命令后的文件的基本数据 因为在Linux下文件的类型并不是以后缀为分的 所以这个命令对我们来说就很有用了 gt file rumenz txt 查看rumenz txt的文件类型 rumenz txt
  • “泰迪杯”挑战赛 - 通过聚类方法对航空客运的客户进行细分

    目 录 挖掘目标 分析方法与过程 2 1 总体流程 2 2 具体步骤 步骤一 数据预处理 步骤二 群体聚类 步骤三 行为特征聚类 2 3 结果分析 第一类 第二类 第三类 结论 参考文献 1 挖掘目标 本次建模目标是在航空公司的海量会员数据
  • 分享几个好用的WP插件,让你的网站牛逼起来

    1 WP Rocket WPRocket缓存插件是目前最高效灵活的WordPress静态缓存插件 它可以优化你的JSCSS文件结构 减少多次请求 达到优化速度的目的 它还集成了图像延迟加载 对于想要最极致加速的用户来说是一个不错的选择 通过
  • Type Script 之 类型

    Type Script 中的类型有很多 常见的类型有 undefined null boolean number bigint string symbol void object unknown never any 其中基本类型有 void
  • java内存模型 堆栈_Java内存模型分析

    一 Java内存的构成 先上一个官方java document里的图 由上图可知 整块区域分为Young Generation Tenured Generation Permanent Generation 详细解释一下Young区 You