二.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内存 ...
随机推荐
- for循环 重点题
1.冒泡排序 (特别重要): <script type="text/javascript"> var attr=Array(); for(var i=0; i< ...
- 网页标题(title)动态改变
这是一只小白的突发奇想,实验多次终于有所效果.想要实现什么效果呢, 如图所示 : 要实现这个效果,大体需要两步. 第一,如何像打印似的一个一个字显示文字.要实现这个效果有多种方法.在这里我所运用 ...
- [0] 自定义特性AttributeUsage
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Fxframe ...
- python str转dict
两种方法 捷径 eval(str) >>> user = "{'name' : 'jim', 'sex' : 'male', 'age': 18}" >&g ...
- SQLServer类型与Java类型转换问题解决
ResultSet 接口提供用于从当前行获取列值的获取 方法(getBoolean.getLong 等).可以使用列的索引编号或列的名称获取值.一般情况下,使用列索引较为高效.列从 1 开始编号.为了 ...
- Swift自增和自增运算
自增和自增运算 和 C 语言一样,Swift 也提供了方便对变量本身加1或减1的自增(++)和自减(--)的运算符.其操作对象可以是整形和浮点型. var i = ++i // 现在 i = 1 ...
- 【LeetCode】225. Implement Stack using Queues
题目: Implement the following operations of a stack using queues. push(x) -- Push element x onto stack ...
- Chapter 4. The MPEG-4 and H.264 Standards
本章节介绍一些关于MPEG-4标准与H.264标准的基本知识 比较重要的是第95页关于两种标准的对比表格.其他部分没有什么特别重要的细节.
- JAVA基础——编程练习(一)
java编程练习(一) 编程题目: 请根据所学知识,编写一个 JAVA 程序,实现输出考试成绩的前三名. 要求: 1. 考试成绩已保存在数组 scores 中,数组元素依次为 89 , -23 , 6 ...
- 6.如何使用jedis的线程池
Basic usage example using Jedis in a multithreaded environment You shouldn't use the same instance f ...