JVM之--Java内存结构(第一篇)
最近在和同事朋友聊天的时候,发现一个很让人思考的问题,很多人总觉得JVM将java和操作系统隔离开来,导致很多人不用熟悉操作系统,甚至不用了解JVM本身即可完全掌握Java这一门技术,其实个人的观点是,Java由于有了JVM才使这门语言简单上手,同时也正是因为Java有了JVM才使的Java这门技术很难深入了解。
在C/C++中我们可以很方便的new内存,delete内存,在内存的使用中我们拥有至高的权利,而Java则不行,JVM这一扇大门死死的堵住了内存的操作细节,你无法直接操作内存,所以你能做的就是百分之百的信任JVM给你带来的各种便利都是非常科学和合理的,但是有时候事实并非如此,JVM也不能百分之百的根据你的程序去猜想你所需要的内存资源更谈不上分布情况了,那么JVM能做的就是以他自认为比较合理的方式去为申请,划分内存。
举个最简单的例子,你了解OutOfMemoryError么?笼统来说它就是内存不足引起的,可是他到底是那一块内存溢出所导致的呢?我们只有掌握和了解了JVM的内存划分,才能真的掌握关于内存出现问题的诊断,甚至可以很方便的调优,起到事半功倍的效果,当然也就会让你不再抱怨JVM。
在本文中,我们将重点介绍如下内容:
- Java的内存划分
- 各个内存的详解
- 创建一个对象后的内存分布情况。
第一、Java内存划分
JVM在运行java程序的时候会把内存划分为如下的几部分,如下图所示:
1.1 程序计数器:
首先来说说程序计数器,程序计数器是一个比较小的内存空间,他的作用是什么呢?回想一下CPU的总线结构吧,CPU有三个总线,数据总线,控制总线,地址总线,RAM和CPU交互的时候其实就是逐条的通过一些命令字透过控制总线发送命令,并且将数据通过数据总线进行来回交互,Java在运行时期,其实也是内存在和cpu来回往返的发送各种命令字,并且交换数据,我们的java代码会通过java编译器最终转换成一些底层的命令字(class文件->本地方法将class文件解析转换成标准的命令字)既然是一堆命令字相关的东西,也就存在先运行什么?调用哪个方法,获取那个数据,进行如何的操作等等,在程序计数器中存放的就是这些东西。
我们知道cpu执行的执行时间和分配是由cpu随机或者根据某种cpu的算法规则轮流切换执行某个命令字的,在某一个时刻,他始终只能执行一条命令字,在执行完毕某个命令字之后也需要能够确保回到下一个执行命令字位置的正确性,因此java将这一块内存设计成了私有的,也就是说一个执行的线程都会有一个自己私有的/独享的程序计数器内存空间,该内存空间非常小,另外如果调用的是一个native的方法,则内存计数器不会分配内存空间,并且此内存空间不会出现OutofMemoryError的情况,也是唯一一个。
1.2 虚拟机栈:
1.3 本地方法栈
1.4 堆
堆在java内存单元中占据着比较大的比重,也是最大的一部分内存单元,在虚拟机启动的时候,该部分的内存就会被创建,所有的对象创建,以及数组内存的申请分配都是在该内存单元上发生的。
由于堆内存所占的比重比较大,因此他也就是java垃圾回收器最关注的一块内存,因此该内存单元也被称为GC堆。如果以后您了解了GC机制,您会知道,Java允许内存单元不连续,只要逻辑上是连续的即可,这部分的内存也是可以进行扩展的,在启动虚拟机时我们可以通过-Xmx,-Xms进行控制,当堆中的内存再也申请不到的时候就会抛出内存溢出的异常,另外该内存空间是线程共享的,我们经常使用到的锁其实就是在这部分内存中活动。
1.5 方法区
1.6 运行时常量池
1.7 直接内存
2、对象访问
JVM之--Java内存结构(第一篇)的更多相关文章
- 【Java 之 JVM】Java内存结构概述
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWl3dXpoaWxpbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- jvm(1)---java内存结构
jvm主要由三个子系统构成:类加载子系统,运行时数据区,执行引擎 运行时数据区主要包括: 1.本地方法栈:登记native方法,执行时加载本地方法库 2.程序计数器:就是一个指针,用来存储指向下一条执 ...
- Java内存结构详解
Java内存结构详解 Java把内存分成:栈内存,堆内存,方法区,本地方法区和寄存器等. 下面分别介绍栈内存,堆内存,方法区各自一些特性: 1.栈内存 (1)一些基本类型的变量和对象的引用变量都是在函 ...
- Java 内存结构备忘录
本文详细描述了 Java 堆内存模型,垃圾回收算法以及处理内存泄露的最佳方案,并辅之以图表,希望能对理解 Java 内存结构有所帮助.原文作者 Sumith Puri,本文系 OneAPM 工程师编译 ...
- Java内存结构、类的初始化、及对象构造过程
概述 网上关于该题目的文章已经很多,我觉得把它们几个关联起来讲可能更好理解一下.与其它语言一样,它在执行我们写的程序前要先分配内存空间,以便于存放代码.数据:程序的执行过程其实依然是代码的执行及数据的 ...
- java内存结构学习的一种打开方式
用Java开发已经四年,中途学了python,Scala,接触这些开发语言后,总感觉Java就像老奶奶裹脚——又臭又长.然,Java虐我千百遍,我待Java如初恋.聊起Java,不得不谈Java的内存 ...
- JVM之Java内存区域
JVM之Java内存区域 世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程. 一.JAVA内存区域 谈及JAVA虚拟机运行时数据区域就不得不祭出这张经典的图了: ...
- JVM之---Java内存分配参数(第四篇)
1.内存分配参数---大纲 Ø如何设置堆内存 Ø如何设置栈内存 Ø如何设置方法区 Ø如何设置对的分配比率 Ø设置参数打印堆栈: ØJava程序的两种模式:Server&Client 2.设置堆 ...
- java内存结构JVM——java内存模型JMM——java对象模型JOM
JVM内存结构 Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存在,而有些区 ...
随机推荐
- Ecstore后台中显示页面display,page,singlepage方法的区别?
dispaly 显示的页面不包含框架的其他页面,只是本身的页面(使用范围:Ecstore的前端.后端). page 显示的页面包含在框架的里面(使用范围:Ecstore的前端.后端). singlep ...
- (转)ThinkPHP自定义模板标签详解
转之--http://www.thinkphp.cn/topic/6258.html 模板标签让网站前台开发更加快速和简单,这让本该由程序猿才能完成的工作,现在只要稍懂得HTM的人也能轻易做到,这也就 ...
- javascript判断值是否undefined
function isUndefined(variable) { return typeof variable == 'undefined' ? true : false; }
- PHP表单提交验证各种方式
<!DOCTYPE unspecified PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www. ...
- 你好,C++(7)第三部分 C++世界众生相 3.2.1 变量的定义与初始化
第3部分 C++世界众生相 在听过了HelloWorld.exe的自我介绍,完成了与C++世界的第一次亲密接触后,大家是不是都急不可待地想要一试身手,开始编写C++程序了呢?程序的两大任务是描述数据和 ...
- 【HAOI2007】理想的正方形
[问题描述] 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [输入] 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行 ...
- 事件的委托处理(Event Delegation)
javascript的事件模型,采用”冒泡”模式,也就是说,子元素的事件会逐级向上”冒泡”,成为父元素的事件. 利用这一点,可以大大简化事件的绑定.比如,有一个表格(table元素),里面有100个格 ...
- 疯狂学习java web5(SSI框架)
其实前面的所有只是铺垫,目的只是为了了解现有工程是怎样的.之前直接上来就看,看了很久依然是云里雾里,所以不得已学习点基础知识,前面的基础只是蜻蜓点水一带而过,希望能起部分作用了. 发现struct2有 ...
- Android学习----Android架构
android分为四个层,从高层到低层分别是应用程序层.应用程序框架层.系统运行库层和linux核心层.蓝色的代表java程序,黄色的代码为运行JAVA程序而实现的虚拟机,绿色部分为C/C++语言编写 ...
- jquery ajax(4).getjson()
.getJSON()实例 .each()实例 $(function(){ $('#send').click(function() { $.getJSON('test.json', function(d ...