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程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途.其中有些区域随着虚拟机进程的启动而存在,而有些区 ...
随机推荐
- ubuntu wine卸载程序并删除图标
卸载ubuntu 下用wine安装的程序,可以用wine uninstaller命令,打开 添加/删除程序界面,进行删除程序操作:
- 二分图最大匹配(匈牙利算法Dfs模板)
#include<iostream> #include<cstdio> #include<cstring> #define maxn 2020 using name ...
- 初识Ajax技术
Ajax:(Asynchronous JavaScript And Xml)是一种整合了JavaScript.XML.CSS等现有技术 Ajax工作流程: 纯javaScript的Ajax请求 ...
- editplus双击单词语法高亮显示设置
view=>Word Highlighting
- 用Global.asax实现伪静态.
在Global.asax文件里添加Application_BeginRequest事件处理.添加如下代码: 1 protected void Application_BeginRequest(Obje ...
- iOS开发中EXC_BAD_ACCESS的另类原因
今天偶然学习iOS开发的时候碰到一个EXC_BAD_ACCESS的异常,经查资料得到的解释是由于访问了已经被回收了堆内存对象导致的,参考: http://code.tutsplus.com/tutor ...
- JavaScript typeof, null, 和 undefined
typeof 操作符 你可以使用 typeof 操作符来检测变量的数据类型. 实例 typeof "John" // 返回 string typeof ...
- [转]Delphi中进行延时的4种方法
1.挂起,不占CPU sleep 2.不挂起,占cpu procedure Delay(msecs:integer); var FirstTickCount:longint; begin FirstT ...
- Action class [userAction] not found
今天在做SSI框架整合的时候报了一个这样的错误:Action class [userAction] not found - action - file:F:\workspace\.metadata\. ...
- Solution(项目部署):The server does not support version 3.0 of the J2EE Web module specification
1.错误: 在eclipse中使用run->run on server的时候,选择tomcat6会报错误:The server does not support version 3.0 of t ...