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线程要向另外一个线程进行通信,应该怎么做,我们再 ...
随机推荐
- WPF 之 设置Dialog的父窗体
1.如果弹出窗体(如ChildWindow),调用Show方法,并且设置了其Owner属性: ClassRootWindow { void Foo() { ChildWindow cw = newCh ...
- Linux下mongodb安装
1>设置mongoDB目录 cd /home/apps 附:centOS下创建目录命令 mkdir /home/apps 2>下载mongodb curl -O http:// ...
- Android动画 interpolator的用法
1. <?xml version="1.0" encoding="utf-8"?> 2. <set 3. xmlns:Android=&quo ...
- 淘宝API Nodejs的实现
关于<淘宝API Nodejs的实现>这是个很忧伤的故事~~ 体验了win10,目前来说还是不如意的,一些应用程序的卡顿,发热~~难以忍受了.只好重装了系统,可是可是!!! 前段时间写的n ...
- Daily Query
-- GI Report SELECT A.PLPKLNBR, D.DNDNHNBR, F.DNSAPCPO, C.PPPRODTE, A.GNUPDDTE GI_DATE, B.INHLDCDE, ...
- A的href和onclick
我们在制作网页的时候用得最多的就是 A 标签 超连接 但有时候需要在 A 里同时用到 href 和 onclick属性 下面我们先来分析一下 ,在不同的浏览器下有不同的效果 1 顺序 ie 6 : h ...
- jQuery源码dom ready分析
一.前言 在平时开发web项目时,我们使用jquery框架时,可能经常这样来使用$(document).ready(fn),$(function(){}),这样使用的原因是在浏览器把DOM树渲染好之前 ...
- hdu 3656 DLX
思路:二分枚举建边,用DLX判断是否满足. #include<set> #include<cmath> #include<queue> #include<cs ...
- Eclipse+ADT+Android SDK 搭建安卓开发环境
Eclipse+ADT+Android SDK 搭建安卓开发环境 要求 必备知识 windows 7 基本操作. 运行环境 windows 7(64位); eclipse-jee-luna-SR2 ...
- 解决方案:Default Activity Not Found !
在Android Studio 中按 Ctrl+F11运行工程的时候,突然弹出一个Edit Configuration 对话框,让选择一个默认的Activity,之前默认情况下是直接编译到虚拟机运行的 ...