根据上节描述的问题,我们知道其最终原因是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. go 基础语法

    时间有限,简单记一些常用的,麻烦的不写了 定义变量:可以连续定义,也可以单个定义 var a int    int类型 var a="ds"   默认string类型 a:=&qu ...

  2. 如何编写一个带命令行参数的Python文件

    看到别人执行一个带命令行参数的python文件,瞬间觉得高大上起来.牛逼起来,那么如何编写一个带命令行参数的python脚本呢?不用紧张,下面将简单易懂地让你学会如何让自己的python脚本,支持带命 ...

  3. JSONArray用法jquery循环list<Map>对象

    controoler中 List<Map<String,Object>> resList =(List<Map<String,Object>>)resM ...

  4. 限制input[type=number]的输入位数策略整理

    当我们使用类型number的input输入框的时候,我们可能需要限制输入的位数,这个时候通常会想到maxlength,但是maxlength是在number类型的时候是不支持的,下面是一些解决这种问题 ...

  5. 导出CSV表格数据

    <?php class Csv{ //导出csv文件 public function put_csv($list,$title){ $file_name="CSV".date ...

  6. php检测当前浏览器是否为微信浏览器

    <?php /** php检测当前浏览器是否为微信浏览器 */ function is_weixin_browser(){ if(strpos($_SERVER['HTTP_USER_AGENT ...

  7. [leetcode-535-Encode and Decode TinyURL]

    TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/desi ...

  8. Linux系统目录结构介绍

    参考博客: http://www.cnblogs.com/chensiqiqi/p/6243549.html 感谢原博主为我学习Linux指明方向!! linux目录:一切从“根”开始,“/”是所有目 ...

  9. HTML DOM元素关系与操作

    <html> <head><title>DOM元素关系与操作</title></head> <body> <!-- div ...

  10. OpenShitf 使用教程

    OpenShitf https://www.openshift.com 1.注册openshitf账号 https://www.openshift.com/app/account/new 2.gett ...