JVM学习---JAVA内存

原创 2013年12月04日 13:26:12

一、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异常。

 

二、对象访问 

1
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内存模型与线程(2)

Java与线程并发不一定要依赖多线程(如PHP中很常见的多进程并发),但是在Java里面谈论并发,大多数都与线程脱不开关系。线程的实现线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资...

【Java】深入理解JVM学习笔记(三) —— GC收集器和内存分配

判断对象是否存活引用计数算法 很多判断对象是否存活的方式就是引用计数算法:给对象添加一个引用计数器,每当一个地方引用它,计数器+1;引用失效,计数器-1。 任何时刻计数器为0的对象是不可能再被使...

JVM内存模型(深入理解Java虚拟机学习笔记)

Java虚拟机(Java virtualmachine)实现了Java语言最重要的特征:即平台无关性。 平台无关性原理:.Java文件经过Java Compiler编译成为.Class文件。编译...

Java学习笔记-JVM内存管理

一、Java内存区域 Java虚拟机把运行时数据区划分为几个不同的区域。 线程私有的,即每一条线程都会有自己独立的内存空间,有以下几个部分: 程序计数器虚拟机栈本地方法栈 所有线程共享的内存空间...

【Java虚拟机】之一Java运行数据区域

概述:     对于从事java程序开发的人来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题,由虚拟机管理内...

JVM学习笔记一:Java内存区域

在虚拟机自动内存管理机制的帮助下,java程序员不需要去关心每一个对象的内存回收,不容易出现内存泄露和内存溢出问题,由虚拟机管理内存,看起来不需要程序员知道jvm是如何分配和回收内存的。但是不明白jv...

JVM学习-java内存区域与异常

java是一门跨硬件平台的面向对象高级编程语言,java程序运行在java虚拟机上(JVM),由JVM管理内存,这点是和C++最大区别;虽然内存有JVM管理,但是我们也必须要理解JVM是如何管理内存的...

深入理解Java虚拟机学习笔记-1.JVM内存模型

JVM内存模型1.内存模型结构图 名称 特征 作用 配置参数 异常 程序计数器 占用内存小,线程私有, 生命周期与线程相同 大致为字节码行号指示器 无 无 虚...
  • cnwuhao
  • cnwuhao
  • 2017年07月27日 20:00
  • 197

jvm学习笔记一(java内存区域)

一.运行时数据区域 1.程序计数器 线程私有的一块区域,用来指引虚拟机下条应该执行的指令。 这块区域是虚拟机规范中唯一一块没有规定任何OutOfMemoryError区域。 2.jav...

学习JVM(Java内存管理和OOM)

学习JVM首先要关注虚拟机运行时的内存分布和内存管理,这样在遇到OOM时才能调试相应的参数获得解决办法。 一、内存区域: 以上图为概要,一一介绍各个内存区域: 1、  程序计数器: 是一块较小的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM学习---JAVA内存
举报原因:
原因补充:

(最多只允许输入30个字)