java堆内存 数据结构_JAVA内存区域

首先解释下内存溢出和内存泄露之间的区别,为后面的学习做些铺垫:

1、内存溢出和内存泄露的区别和联系

内存溢出 out of memory:是指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出

内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。

memory leak会最终会导致out of memory!

2、JVM中的堆栈和数据结构中堆栈的区别

在数据结构中,堆是完全二叉树,堆中个元素是有序的。而栈是一种特殊的线性表,具有先进后出,只允许在一端(栈顶)插入、删除的特点。

在jvm虚拟机中的堆栈对应内存的不同区域,笼统的说堆是用于存放对象的内存块,栈是用于执行程序的内存块。

下面切入正题

运行时数据区域

Java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域有各自的用途,以及创建和销毁的时间。有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。java虚拟机所管理的内存将会包含以下几个运行时数据区域

1、线程独有的内存区域有如下几块:

(1)、程序计数器:是一块较小的内存空间,它可以看作是当前线程所执行字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来取下一条需要执行的字节码的指令。由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说就是一个核)都只会执行一条线程中的指令。因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程计数器互不影响,独立存储,我们称这类内存为区域为“线程私有”的内存。

此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。 (2)、java虚拟机栈:它的生命周期与线程相同。虚拟机栈描述的是java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行完成的过程,就对应着栈帧在虚拟机中入栈到出栈的过程。

(3)、本地方法栈:与虚拟机栈发挥的作用是非常相似的,他们之间的区别不过是虚拟机栈为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的Native方法服务。

2、线程间共享的内存区域有如下几块:

(1)、java堆:对于大多数java应用来说,java堆是java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都是在这里分配的。Java堆是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”(Garbage Collected Heap)。

(2)、方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码数据。虽然java虚拟机规范把方法区描述为堆的一个逻辑部分,但它却有一个别名叫做Non-Heap(非堆),目的是与java堆区分开来。

(3)、运行时常量池:是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口、等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池存放。既然运行时常量池是方法区的一部分,再染收到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError异常。

3、直接内存

直接内存并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。但是这部分内存也被频繁地使用,而且也可能导致内存溢出问题。JDK1.4中新增加了NIO(参考https://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html),引入了一种基于通道(channel)与缓冲区(buffer)的I/O方式,它可以使用Native函数库直接分配堆外内存,然后通过一个存储在Java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。这样能在一些场景中显著提高性能,因为避免了在Java堆和Native堆中来回复制数据。显然,本机直接内存的分配不会受到Java堆大小的限制,但是,既然是内存,肯定还是会受到本机总内存(包括RAM、SWAP区)大小以及处理器寻址空间的限制。

分类: JAVA虚拟机

标签: JVM, JAVA, JAVA虚拟机, OOM

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

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

相关文章

java jsp的指令_[javaEE] jsp的指令

jsp的指令:jsp的指令(directive)是为jsp引擎而设计的,他们并不直接产生任何可见输出,而是告诉引擎如何处理jsp页面中的其他部分页面头部的page指令pageEncoding"utf-8"%>配置错误页面:web.xml500/500.jsp404/404.jsp…

JAVA不能满屏_java – 全屏幕视频,不拉伸视频

像这样,你可以自己设置视频的属性。使用SurfaceView(给你更多的视图控制),将其设置为fill_parent以匹配整个屏幕android:orientation"vertical"android:layout_width"match_parent"android:layout_height"fill_parent">…

java异常标记_java.lang.RuntimeException:错误:0D0680A8:asn1编码例程:ASN1_CHECK_TLEN:错误的标记...

我收到此错误(在标题中).我不确定为什么,请帮忙.代码如下:public static String decryptRSA(Context mContext, byte[] message) throws Exception {InputStream in mContext.getResources().openRawResource(R.raw.publicrsakey);X509EncodedKeySpec x509EncodedK…

正版我的世界怎么下载java_mcjava正版下载-mc我的世界java安卓正式版极速下载v1.0.1 - 趣趣手游网...

mc我的世界java安卓正式版带你体验最为精彩的多人联机对战玩法,游戏专为java系列打造,在游戏的部分特性上有着各种的提升,以及各种专属的表达,比基岩版能多一些不同的玩法,在这里有着各种不同的玩法以及模式等待你的加…

java原子整数_多线程(四、原子类-AtomicInteger)

案例10个线程并发累加一个整数,每个线程累加1000,保证线程安全Unsafe类,来源于sun.misc包。该类封装了许多类似指针操作,可以直接进行内存管理、操纵对象、阻塞/唤醒线程等操作。package com.jane;import java.util.ArrayList;imp…

java 新建菜单选项_请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxM..._考试资料网...

请完成下列Java程序:创建一个下拉式菜单,菜单项包括3个CheckboxMenultem(复选框),一条分割线和一个Exit项。要求打开或关闭复选框时,确定是哪个被切换,是开还是关,并输出它的状态;选择Exit项能够…

adurnio 单片机_单片机20~200A大电流检测电路设计 用AD实现 带原理图,源代码,proteus仿真文件...

//------------------------------51单片机头文件#include//各数字的数码管段码(共阴)unsigned char code DSY_CODE[]{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //数码管显示数组{0,1,2,3,4,5,6,7,8,9}sbit CLKP3^3; //时钟信号sbit STP3^6; //启动信号,由…

java 极客_Java极客思维

​开篇介绍大家好,公众号【Java极客思维】近期会整理一些Java高频面试题分享给小伙伴,也希望看到的小伙伴在找工作过程中能够用得到!本章节主要针对Java一些消息中间件高频面试题进行分享。通知:公众号【Java极客思维】正在送书福…

java拼三级魔方_魔方秘籍(详细解法)《三阶》

魔方根据视频理解:上 下 左 右先将白面变好:(1).变一个白十字(如图所示)(2).转好以后检查十字的四个角的颜色(蓝绿红橙)与旁边面上的中心块的颜色是否相同。(有两个相同的时,如果它们相邻,就一个放在后面,一个放在左面…

php怎么实现点卡充值,利用自动发卡程序的点卡充值传奇脚本

首先:自动售卡 玩家购买到卡密 在游戏输入卡密领取元宝下面是NPC脚本:[main]!这里是点卡充值平台!\\\ \ \\[InPutString18]#IFCHECKCODELIST ..\QuestDiary\卡号列表\5.txt#actCLEARCODELIST ..\QuestDiary\卡号列表\5.txtGAMEGOL…

php转换ofd文件格式,一种OFD格式文档支持脚本的方法与流程

本发明涉及电子文档格式的处理技术,特别涉及一种OFD格式文档支持脚本的方法。背景技术:OFD是一种版式文档格式,全称为开放式版式文档(Open Fixed-layout Document),是国家版式文档格式规范。版式文档是电子文件应用的一个重要门类…

php成品代码,PHP代码

日期当日date(Y-m-d")date(Y-m-d 00:00:00)取日期:年 月 日date("Y", strtotime($startday))date("m", strtotime($startday))date("d", strtotime($startday))上月 下月$last_mont_first_date date(Y-m-01 00:00:00,strtotime…

tp框架中引入php文件,Laravel框架及ThinkPHP框架超级简单的公共文件引入(保留变量)...

为什么要把两个框架放在一起来说呢?额。。。因为TP5.1.x与Laravel实在是太像了,本文主要讲述关于大家顶部及底部文件引入的问题。但是如果顶部和尾部只是单纯的html代码还好说,但是里面通常有变量赋值和循环遍历以及判断等逻辑,这样就带来了比…

pHp30充电宝能用快充吗,65W快充 30分钟充满电 是时候淘汰充电宝了吗?

在过去的一年里,手机快充技术有了新的突破,OPPO推出了65W快充。无独有偶,联想拯救者电竞手机的预热宣传中,号称搭载90W快充。有评测称,使用65W快充,30分钟可以充满一块4000mAh容量的电池,使用90…

php+mockjs,mockjs的常用方法分享

本文主要和大家分享mockjs的常用方法,结合文字和代码和大家讲解,希望能帮助到大家。一.mock.mock()根据数据模板生成模拟数据。更关键的是,我们发起Ajax请求的时候要能够接收到这些数据。这就是Mock.mock()的作用啦!Mock.mock( ru…

php 截取音频文件后缀名,使用PHP从音频流中提取音轨信息

这是一个PHP功能,让您从流媒体URL中提取MP3元数据(StreamTitle)。通常,流服务器icy-metaint在响应中放置一个标题,告诉我们在流中发送元数据的频率。该函数检查该响应头,如果存在,它将用它替换interval参数。否则&…

matlab画圆柱,Matlab 画三维圆柱体

主要学习了画空间圆柱体和空间长方形的绘制方法。有两个surface property:FaceColor和EdgeColor’;先讲FaceColor’,它指定了surface画出曲面的颜色,可以是[r,g,b]的一个向量,分别表示了红绿蓝的颜色配比;也可以是inte…

matlab类间散度矩阵,协方差矩阵和散布矩阵(散度矩阵)的意义

在机器学习模式识别相关算法中,经常需要求样本的协方差矩阵C和散布矩阵S。如在PCA主成分分析中,就需要计算样本的散度矩阵,而有的教材资料是计算协方差矩阵。实质上协方差矩阵和散度矩阵的意义就是一样的,散布矩阵(散度矩阵)前乘以…

把树分成森林 matlab,20170106RF_Matlab 随机森林指的是利用多棵树对样本进行训练并预测的一种分类器,包括两个方面:数据的随 269万源代码下载- www.pudn.com...

文件名称: 20170106RF_Matlab下载 收藏√ [5 4 3 2 1 ]开发工具: matlab文件大小: 441 KB上传时间: 2017-01-06下载次数: 0提 供 者: yanxiu详细说明:随机森林指的是利用多棵树对样本进行训练并预测的一种分类器,包括两个方面:数据的随…

inur new.php id,Cmsez(随易)全站系统 0day

程序名称:Cmsez Web Content Manage System v2.0.0文件:comments.php viewimg.php代码:---------------//commentsinclude "mainfile.php";$artnew article();//设定$confirmyes;//yes:需要管理员认证后才能显示,no:直接显示$membe…