根据上节描述的问题,我们知道其最终原因是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. 浅谈JavaScript递归

    递归:是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.递归指的是一个过程:函数不断引用自身,直到引用的对象已知. //公园里面有200个桃子,每天吃掉一半,扔掉一个烂的,第6天 ...

  2. AngularJS高级程序设计读书笔记 -- 指令篇 之 内置指令

    1. 内置指令(10-12 章) AngularJS 内置超过 50 个内置指令, 包括 数据绑定,表单验证,模板生成,时间处理 和 HTML 操作. 指令暴露了 AngularJS 的核心功能, 如 ...

  3. Ubuntu下使用nginx和nginx-rtmp-module搭建流媒体服务器的正确姿势

    之前在使用nginx和nginx-rtmp-module搭建流媒体服务器的时候遇到一个很尴尬的问题,就是在把nginx-rtmp-module模块添加到nginx中去的时候,我最开始采取的做法是先卸载 ...

  4. DataTable多线程操作报错情况

    最近在写一个http接口时用了DataTable这个强大的利器,接口用浏览器跑起来没任何问题.当时也没考虑并发问题,后来用一个压力测试工具做大并发测试,1000+/s次速度测试.发现程序报错了.程序报 ...

  5. php索引数组转成关联数组

    foreach($revenue_data as $k3=>$v3){ $temps[$v3['_id']['date']]= array( '_id'=>$v3['_id'], 'tot ...

  6. MySQL删除表方式差异

    数据库删除语句 Drop/Delete/Truncate比较 Delete :删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行). 删除某一行:Delete from 数据表名 ...

  7. GC机制总结

    一.为什么需要GC 应用程序对资源操作,通常简单分为以下几个步骤: 1.为对应的资源分配内存 2.初始化内存 3.使用资源 4.清理资源 5.释放内存 应用程序对资源(内存使用)管理的方式,常见的一般 ...

  8. django-xadmin列表页filter关联对象搜索问题

    环境:xadmin-for-python3 python3.5.2 django1.9.12 问题描述:Product ProductSku两个实体,ProductSku FK外键关联Product ...

  9. USACO-palsquare 遇到的一个坑

    /** ID: njuwz151 TASK: palsquare LANG: C++ */ #include <iostream> #include <cstdio> #inc ...

  10. Python对数据库的增删改查

    #!/usr/bin/env python   import MySQLdb   DATABASE_NAME = 'hero'   class HeroDB:     # init class and ...