根据上节描述的问题,我们知道其最终原因是GC导致的。本节我们就先详细探讨下与GC息息相关的Java内存模型。

名词解释:变量,理解为java的基本类型。对象,理解为java new出来的实例。

Java程序运行在JRE(Java Runtime Environment)中,JRE包括JAVA API和JVM(Java Virtual Machine)。

Java原文件编译后得到Java Byte Code(.class)文件,JRE通过classloader将Java byte code文件加载到JVM的run-time data area.

JVM的run-time data area 包含The pc Register, Java Virtual Machine Stacks, Heap, Method Area, Run-Time Constant Pool, Native Method Stacks.

The pc Register:每个线程都有自己的Register。主要记录每个时间点线程正在执行的方法名称,指令地址,returnAddress,当前指针等。如果当前执行的是java native method(也就是java最底层的方法)时,那么当前线程的the pc Register 的值是undefined。

Native Method Stacks:这块stack用来执行不是java语言写的方法(也就是native method)。

Heap:这块空间被JVM所有的线程共享。从这也就看出java内部的线程通信是通过共享内存完成的。这里存储了所有的实例对象和数组。GC对对象的回收与空间的压缩也就发生在这个空间。

Java Virtual Machine Stacks:创建线程时,JVM就为此线程分配了stack。主要存储线程自己的变量,部分结果,对共享内存的引用等。这块空间由heap分配。

Method Area:这块空间由heap分配。也是被所有JVM的所有线程共享,主要存储着run-time constant pool ,方法的代码。这块空间一般不会被GC.

Run-Time Constant Pool:这块空间由Method Area分配,主要存储着常量,变量的引用。

总结:1.JVM Run-time data Area 的关系图:

举例说明内存的使用:当启动一个类的main函数时(其实就是启动了一个进程),jvm的run-time data area就分配好了。the pc register记录此main函数的名字,main函数里的指令地址等;这个类的全局变量存到了Run-Time Constant Pool;类的构造函数,方法体,方法体内的变量存储到了Method Area; Jvm stack 存储了此线程(main函数体)的本地变量,对象的引用,返回结果,异常分发等;main函数体内的实例存储到heap。

程序执行过程:线程按照the pc register记录的指令执行(为了更快执行,这些指令会重排序,有CPU的重排序及内存系统的重排序(java 的happen-before),这里假想为顺序执行),此线程可以直接读取当前jvm stack的本地变量,读取Runtime constant pool中的全局变量,通过对象的引用调用heap中的实例,invoke Method Area中的method。或者invoke Native Method Area 中的method.可抽象理解为,线程通过Heap读/写当前线程的数据和结果。

二.GC相关之Java内存模型的更多相关文章

  1. 《Java并发编程实战》第十六章 Java内存模型 读书笔记

    Java内存模型是保障多线程安全的根基,这里不过认识型的理解总结并未深入研究. 一.什么是内存模型,为什么须要它 Java内存模型(Java Memory Model)并发相关的安全公布,同步策略的规 ...

  2. 【转】Java 内存模型及GC原理

    一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...

  3. Java 内存模型及GC原理 (转载)

    一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...

  4. Java 内存模型及GC原理

    一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...

  5. Java 内存模型及GC原理 (转)

      来源:http://blog.csdn.net/ithomer/article/details/6252552 一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性 ...

  6. java内存模型及GC原理

    java内存模型 sun官方网站:sun java 虚拟机模型 JVM内存模型中分两大块,一块是 NEW Generation, 另一块是Old Generation. 在New Generation ...

  7. Java内存模型相关原则详解

    在<Java内存模型(JMM)详解>一文中我们已经讲到了Java内存模型的基本结构以及相关操作和规则.而Java内存模型又是围绕着在并发过程中如何处理原子性.可见性以及有序性这三个特征来构 ...

  8. Java 内存模型、GC原理及算法

    Java 内存模型.GC原理:https://blog.csdn.net/ithomer/article/details/6252552 GC算法:https://www.cnblogs.com/sm ...

  9. java内存模型(二)深入理解java内存模型的系列好文

    深入理解java内存模型(一)--基础 深入理解java内存模型(二)--重排序 深入理解java内存模型(三)--顺序一致性 深入理解java内存模型(四)--volatile 深入理解java内存 ...

随机推荐

  1. php练习 租房子

    题目要求 1.封装类 <?php class DBDA { public $fuwuqi="localhost"; //服务器地址 public $yonghuming=&q ...

  2. C# 调用cmd.exe的方法

    网上有很多用C#调用cmd的方法,大致如下: [c-sharp] view plaincopy private void ExecuteCmd(string command)   {   Proces ...

  3. 收集一些工作中常用的经典SQL语句

    作为一枚程序员来说和数据库打交道是不可避免的,现收集一下工作中常用的SQL语句,希望能给大家带来一些帮助,当然不全面,欢迎补充! 1.执行插入语句,获取自动生成的递增的ID值 INSERT INTO ...

  4. centos文件权限详解

    假设回显信息为  ①-②rws③r-x④r-x ⑤1 ⑥root ⑦root ⑧430540 ⑨Dec 20 18:27 ⑩/usr/sbin/passwd ,现在逐一分析其内容. ①. 首字符-,表 ...

  5. PHPCMS v9 自定义表单添加验证码

    1.  在 \phpcms\templates\default\formguide\show.html 中添加验证码显示 <input type="text" id=&quo ...

  6. Builder模式详解及其在Android开发中的应用

    一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比 ...

  7. js动态参数作为Object的属性取值

    js动态参数作为Object的属性取值var myObj = {"a":1,"b":2};var a = 'a';myObj[a] 就可以获取到 属性a的值了

  8. MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换

    mysql> select inet_aton('192.168.0.1'); +--------------------------+ | inet_aton('192.168.0.1') | ...

  9. 【Android Developers Training】 32. 向其它应用发送简单数据

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  10. Python的语言类型

    Python 是强类型的动态脚本语言 . 强类型:不允许不同类型相加 动态:不使用显示数据类型声明,且确定一个变量的类型是在第一次给它赋值的时候 脚本语言:一般也是解释型语言,运行代码只需要一个解释器 ...