二.GC相关之Java内存模型
根据上节描述的问题,我们知道其最终原因是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内存模型的更多相关文章
- 《Java并发编程实战》第十六章 Java内存模型 读书笔记
Java内存模型是保障多线程安全的根基,这里不过认识型的理解总结并未深入研究. 一.什么是内存模型,为什么须要它 Java内存模型(Java Memory Model)并发相关的安全公布,同步策略的规 ...
- 【转】Java 内存模型及GC原理
一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...
- Java 内存模型及GC原理 (转载)
一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...
- Java 内存模型及GC原理
一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...
- Java 内存模型及GC原理 (转)
来源:http://blog.csdn.net/ithomer/article/details/6252552 一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性 ...
- java内存模型及GC原理
java内存模型 sun官方网站:sun java 虚拟机模型 JVM内存模型中分两大块,一块是 NEW Generation, 另一块是Old Generation. 在New Generation ...
- Java内存模型相关原则详解
在<Java内存模型(JMM)详解>一文中我们已经讲到了Java内存模型的基本结构以及相关操作和规则.而Java内存模型又是围绕着在并发过程中如何处理原子性.可见性以及有序性这三个特征来构 ...
- Java 内存模型、GC原理及算法
Java 内存模型.GC原理:https://blog.csdn.net/ithomer/article/details/6252552 GC算法:https://www.cnblogs.com/sm ...
- java内存模型(二)深入理解java内存模型的系列好文
深入理解java内存模型(一)--基础 深入理解java内存模型(二)--重排序 深入理解java内存模型(三)--顺序一致性 深入理解java内存模型(四)--volatile 深入理解java内存 ...
随机推荐
- php练习 租房子
题目要求 1.封装类 <?php class DBDA { public $fuwuqi="localhost"; //服务器地址 public $yonghuming=&q ...
- C# 调用cmd.exe的方法
网上有很多用C#调用cmd的方法,大致如下: [c-sharp] view plaincopy private void ExecuteCmd(string command) { Proces ...
- 收集一些工作中常用的经典SQL语句
作为一枚程序员来说和数据库打交道是不可避免的,现收集一下工作中常用的SQL语句,希望能给大家带来一些帮助,当然不全面,欢迎补充! 1.执行插入语句,获取自动生成的递增的ID值 INSERT INTO ...
- centos文件权限详解
假设回显信息为 ①-②rws③r-x④r-x ⑤1 ⑥root ⑦root ⑧430540 ⑨Dec 20 18:27 ⑩/usr/sbin/passwd ,现在逐一分析其内容. ①. 首字符-,表 ...
- PHPCMS v9 自定义表单添加验证码
1. 在 \phpcms\templates\default\formguide\show.html 中添加验证码显示 <input type="text" id=&quo ...
- Builder模式详解及其在Android开发中的应用
一.引言 在Android开发中,采用Builder模式的代码随处可见,比如说Android系统对话框AlertDialog的使用或者是Android中的通知栏(Notification)的使用,又比 ...
- js动态参数作为Object的属性取值
js动态参数作为Object的属性取值var myObj = {"a":1,"b":2};var a = 'a';myObj[a] 就可以获取到 属性a的值了
- MySQL如何有效的存储IP地址及字符串IP和数值之间如何转换
mysql> select inet_aton('192.168.0.1'); +--------------------------+ | inet_aton('192.168.0.1') | ...
- 【Android Developers Training】 32. 向其它应用发送简单数据
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Python的语言类型
Python 是强类型的动态脚本语言 . 强类型:不允许不同类型相加 动态:不使用显示数据类型声明,且确定一个变量的类型是在第一次给它赋值的时候 脚本语言:一般也是解释型语言,运行代码只需要一个解释器 ...