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内存结构图解

一 真实系统中的概念   JVM(Java Virtual Machine),顾名思义是对真实计算机系统的模拟,正因如此才能屏蔽物理机器的变化,从而实现“一次编译,到处运行”。   相信很多Jav...
  • coffeelifelau
  • coffeelifelau
  • 2016年09月14日 08:44
  • 1713

关于jvm几个关键内存配置参数

请看下面题目: 对于jvm内存配置参数: -Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio=3 其最小内存值和Survior区总大小分别是: a...
  • crazylzxlzx
  • crazylzxlzx
  • 2016年08月15日 12:21
  • 8174

java代码获取jvm和heap的内存参数

转载链接:http://cn-done.iteye.com/blog/2041971     MemoryMXBean memorymbean = ManagementFactory.getMem...
  • MinFrog
  • MinFrog
  • 2017年01月04日 09:35
  • 1955

JVM 运行时内存使用情况监控

java 语言, 开发者不能直接控制程序运行内存, 对象的创建都是由类加载器一步步解析, 执行与生成与内存区域中的; 并且jvm有自己的垃圾回收器对内存区域管理, 回收; 但是我们已经可以通过一些工具...
  • HinstenyHisoka
  • HinstenyHisoka
  • 2017年01月10日 10:53
  • 8003

Java虚拟机详解----JVM内存结构

http://www.cnblogs.com/smyhvae/p/4748392.htm 主要内容如下: JVM启动流程JVM基本结构内存模型编译和解释运行的概念   ...
  • bluetjs
  • bluetjs
  • 2016年10月20日 17:10
  • 7885

【深入理解JVM】:Java内存区域

JVM具有自动内存管理机制,Java不需要像c/c++一样,为每一个new操作写配对的delete/free代码,不容易出现内存泄露和溢出。JVM内存区域主要包括如下部分:程序计数器、Java虚拟机栈...
  • u011080472
  • u011080472
  • 2016年05月05日 09:50
  • 1814

JAVA虚拟机:JVM内存分区及用途

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束...
  • wanggg2760
  • wanggg2760
  • 2016年07月14日 19:38
  • 1731

压力测试中JVM内存暴涨原因分析实战

压力测试中JVM内存暴涨原因分析实战 - day day up - ITeye技术网站 var _gaq = _gaq ...
  • haiyanliu119
  • haiyanliu119
  • 2015年07月14日 16:03
  • 1194

JVM体系结构-----深入理解内存结构

一、概述        内存在计算机中占据着至关重要的地位,任何运行时的程序或者数据都需要依靠内存作为存储介质,否则程序将无法正常运行。与C和C++相比,使用Java语言编写的程序并不需要显示的为每...
  • ljheee
  • ljheee
  • 2016年08月17日 00:42
  • 2516

JVM学习心得

一、JAVA内存管理与GC机制 Java在JVM所虚拟出的内存环境中运行,java内存分为栈(stack)和堆(heap)两部分。 栈 在Java中,JVM中的栈记录了线程的方法调用...
  • qq_16143915
  • qq_16143915
  • 2016年04月20日 00:32
  • 4807
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM学习---JAVA内存
举报原因:
原因补充:

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