JVM学习---JAVA内存
一、JAVA运行时数据区域:JAVA中的运行时内存区域有的随着虚拟机进程的启动而存在,有的区域则是依赖用户线程的启动和结束而建立和销毁的。包括以下的几个区域。

图. JAVA虚拟机运行时数据区
1.程序计数器:线程私有的内存。作用是当前线程所执行的字节码的行号指示器。多线程是通过线程轮流切换并分配处理器执行时间的方式实现,通过程序计数器为线程切换后能恢复到正确的执行位置。每条线程都需要有一个独立的程序计数器,各线程之间的计数器互不影响,独立存储。
2.JAVA虚拟机栈:线程私有的内存。作用是描述JAVA方法执行的内存模型,每个方法被执行的时候都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每个方法的调用直到执行完成的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
局部变量表:存放了编译器可知的各种基本数据类型(int、boolean、long、float等)、对象引用(reference类型,可能是一个指针或是句柄)和returnAddress类型。
可能抛出StackOverFlowError异常、OutOfMemoryError异常。
3.本地方法栈(Native Method Stacks):为虚拟机使用到的Native方法服务。
可能抛出StackOverFlowError异常、OutOfMemoryError异常。
4.JAVA堆:存放对象实例。Java堆是垃圾收集器管理的主要区域。
可能抛出OutOfMemoryError异常。
5.方法区:用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
可能抛出OutOfMemoryError异常。
5.1运行时常量池:是方法区的一部分。用于存放编译期生成的各种字面量和符号引用。
可能抛出OutOfMemoryError异常。
二、对象访问
Object obj = new Object();
对于上述代码,至少会涉及到Java栈、Java堆、方法区三个内存区域。
Object obj存储在Java栈的变量表,作为一个reference类型数据。new Object()存储在Java堆中,形成一块实例数据。在Java堆中还必须包含能查找到此对象类型数据的地址信息,这些类型数据存储到方法区中。
Java堆中对象访问的方式有两种:使用句柄和直接指针。
(1)使用句柄访问方式:优点是reference中存放了稳定的句柄地址,在对象被移动是只会改变句柄中的实例数据指针,而reference本身不需要被修改

(2)直接指针访问:优点是速度更快,能够节省一次指针定位的时间开销。HotSpot虚拟机采用这种方式进行对象访问。

参考资料:深入理解JAVA虚拟机
http://chenzhou123520.iteye.com/blog/1585224
http://blog.csdn.net/java2000_wl/article/details/8015105
JVM学习---JAVA内存的更多相关文章
- jvm(12)-java内存模型与线程
[0]README 0.1)本文部分文字描述转自“深入理解jvm”,旨在学习“java内存模型与线程” 的基础知识: [1]概述 1)并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律称为计 ...
- 《深入理解 Java 虚拟机》学习 -- Java 内存模型
<深入理解 Java 虚拟机>学习 -- Java 内存模型 1. 区别 这里要和 JVM 内存模型区分开来: JVM 内存模型是指 JVM 内存分区 Java 内存模型(JMM)是指一种 ...
- JVM学习笔记——内存结构篇
JVM学习笔记--内存结构篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存结构部分 我们会分为以下几部分进行介绍: JVM整体介绍 程序计数器 虚拟机栈 本地方法栈 堆 方法 ...
- JVM学习笔记——内存模型篇
JVM学习笔记--内存模型篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存模型部分 我们会分为以下几部分进行介绍: 内存模型 乐观锁与悲观锁 synchronized优化 内 ...
- JVM之Java内存区域
JVM之Java内存区域 世界上并没有完美的程序,但我们并不因此而沮丧,因为写程序本来就是一个不断追求完美的过程. 一.JAVA内存区域 谈及JAVA虚拟机运行时数据区域就不得不祭出这张经典的图了: ...
- 学习jvm(一)--java内存区域
前言 通过学习深入理解java虚拟机的教程,以及自己在网上的查询的资料,做一个对jvm学习过程中的小总结. 本文章内容首先讲解java的内存分布区域,之后讲内存的分配原则以及内存的监控工具.再下来会着 ...
- JVM之---Java内存分配参数(第四篇)
1.内存分配参数---大纲 Ø如何设置堆内存 Ø如何设置栈内存 Ø如何设置方法区 Ø如何设置对的分配比率 Ø设置参数打印堆栈: ØJava程序的两种模式:Server&Client 2.设置堆 ...
- JVM之--Java内存结构(第一篇)
最近在和同事朋友聊天的时候,发现一个很让人思考的问题,很多人总觉得JVM将java和操作系统隔离开来,导致很多人不用熟悉操作系统,甚至不用了解JVM本身即可完全掌握Java这一门技术,其实个人的观点是 ...
- JVM学习--(二)内存模型、可见性、指令重排序
我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...
随机推荐
- Python笔记(一)
我是一名211高校软件工程大三学生,由于前段时间一直在找实习公司.笔试面试了很多公司,虽然有一定的基础,但是还是被某些公司面试官像虐狗一样的虐了.最后找到了一个口碑比较好的外企,主攻信息安全方面.这段 ...
- 关于mysql下hibernate实体类字段与数据库关键字冲突的问题
好久没写了,都忘记博客了,趁着现在还在公司,写的东西是经过验证的,不是在家凭记忆力写的,正确率有保障,就说说最近遇到的一件事情吧. 以前一直用的oracle数据库,这次项目我负责的模块所在的系统是用的 ...
- find 忽略文件夹选项-prune的说明
注意:因为习惯在当前路径查找时候,常忽略./ 的指定,但读者不要因此而完全忘记find的格式. 查找时忽略指定目录,是要使用-prune选项,但实际上最重要的还是要和path配合.-prune的意义是 ...
- ShowModal在FireMonkey移动应用程序对话框
This is the only code that changes between the first and second code snippets: dlg.ShowModal(procedu ...
- 剑指Offer30 从1到n整数出现1的个数
/************************************************************************* > File Name: 30_NumerO ...
- hdu 3909 数独扩展
思路:做法与9*9的一样.只不过是变量. #include<set> #include<map> #include<cmath> #include<queue ...
- 分页控件(PageControl)的相关属性说明
UIPageControl *pageControl = [[UIPageControl alloc] init]; pageControl.center = CGPointMake(w * ); p ...
- JavaScript--基本包装类型(13)
// JS为了便于操作基本类型,提供了3个特殊的引用类型:Boolean/Number和String; 一 基本包装类型概述 // 实际上,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装 ...
- 【转载】MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用
http://blog.csdn.net/xukai871105/article/details/39252653 0 前言 MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联 ...
- JavaScript之动态背景登陆表单
<!doctype html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...