Java内存模型与垃圾收集

运行时数据区域:

线程私有:

1.程序计数器

如果正在执行的方法为Native方法,程序计数器值为空。

2.java虚拟机栈

虚拟机栈描述java方法执行的内存模型:每个方法被执行时会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口。从方法的调用到执行完成,对应栈帧在虚拟机栈中入栈到出栈过程。

3.本地方法栈

与虚拟机栈作用相似。区别为虚拟机栈为虚拟机执行java方法服务,本地方法栈为虚拟机使用到的Native方法服务。

线程共有:

1.Java堆

存放对象实例,垃圾回收机制主要管理区域。

2.方法区

存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码

对象访问: 

引用定位对象的访问方式

1.使用句柄

Java堆中会划分出一块内存作为句柄池,reference中存放对象句柄地址,句柄中包括对象实例数据和类型数据各自的具体地址信息

2.直接指针

使用直接指针访问方式,reference中直接存储对象地址,如上图。

垃圾收集

1. 引用计数法

虚拟机并未采用!!!

收集算法直接,但并不能解决循环引用带来的内存泄露。

2.根搜索算法

通过一系列GC ROOTS 对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径成为引用链,当某对象到GC ROOTS没有引用链相连时,则证明此对象不可用。

GCROOTS对象:

虚拟机栈(栈帧中的本地变量表)中的引用的对象。

方法区中的类静态属性引用的对象。

方法区中常量引用的对象。

本地方法栈中JNI(即Native方法)引用的对象。

引用类型:

强引用 > 软引用 > 弱引用 > 虚引用

本文内容参考自: 深入理解JAVA虚拟机

时间: 2024-10-11 17:20:52

Java内存模型与垃圾收集的相关文章

Java内存模型与垃圾回收

1.Java内存模型 Java虚拟机在执行程序时把它管理的内存分为若干数据区域,这些数据区域分布情况如下图所示: 程序计数器:一块较小内存区域,指向当前所执行的字节码.如果线程正在执行一个Java方法,这个计数器记录正在执行的虚拟机字节码指令的地址,如果执行的是Native方法,这个计算器值为空. Java虚拟机栈:线程私有的,其生命周期和线程一致,每个方法执行时都会创建一个栈帧用于存储局部变量表.操作数栈.动态链接.方法出口等信息. 本地方法栈:与虚拟机栈功能类似,只不过虚拟机栈为虚拟机执行J

Java 内存模型及GC原理

转至:http://blog.csdn.net/ithomer/article/details/6252552 一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能. 本文将从JVM内存模型.GC工作原理,以及GC的几个关键问题进行探讨,从GC角度提高Java程序的性能. 一.Java内存模型 按照官方的说法:Java 虚拟机具

JAVA内存模型及垃圾回收自我总结

本文为原创,根据<深入理解java虚拟机>和自己的一些理解进行整理,单纯和看其他人的博客感觉不如自己一点点的画和记录来的印象深刻. JAVA内存模型: 判断对象是否已死(可以回收)的算法 方法区(永久代)回收的相关说明: 永久代的垃圾回收主要两部分内容:废弃的常量和无用的类. 废弃的常量:无任何对象引用此常量. 无用的类:1.该类所有实例已经被回收(堆中不存在该类的任何实例). 2.加载该类的ClassLoader已经被回收. 3.给类对应的Class对象没有任何地方呗引用,无法在任何地方通过

java内存模型分析2

不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成,线程.主内存和工作内存的交互关系如下图所示,和上图很类似. 这里的主内存.工作内存与Java内存区域的Java堆.栈.方法区不是同一层次内存划分.!!!! 这里的主内存.工作内存与Java内存区域的Java堆.栈.方法区不是同一层次内存划分.!!!! 3.2 内存间交互操作 关于主内存与工作内存之间的具体交互协议,即一个变量如何从主内存拷贝到工作内存.如何从工作内存同步到主内存之间的实现细节,Java内存模型定

JMM java内存模型

JMM对于一个想要深入了解java的程序猿来说是不可避免的一关,本文偏理论性,尽可能说的通俗易懂,如有不对的地方希望多多指正. 那我们先说一下jvm的主内存分配 1 java虚拟机栈(java virtual stack) 虚拟机栈是线程私有的,每个线程都有一个自己的虚拟机栈,是java方法执行的内存模型,每个方法执行的时候都会在虚拟机栈上创建一个栈帧,栈帧是一个数据结构,主要存储的是方法中的局部变量(基本类型,对象的引用,returnAddress类型(指向一条字节码指令的地址)),操作栈(指

(转)JAVA内存模型

(原本准备把内存模型单独放到某一篇文章的某个章节里面讲解,后来查阅了国外很多文档才发现其实JVM内存模型的内容还蛮多的,所以直接作为一个章节的基础知识来讲解,可能该章节概念的东西比较多.一个开发Java的开发者,一旦了解了JVM内存模型就能够更加深入地了解该语言的语言特性,可能这个章节更多的是概念,没有太多代码实例,所以希望读者谅解,有什么笔误来Email告知:[email protected],本文尽量涵盖所有Java语言可以碰到的和内存相关的内容,同样也会提到一些和内存相关的计算机语言的一些

java内存模型及分块

转自:http://www.cnblogs.com/BangQ/p/4045954.html 1.JMM简介 2.堆和栈 3.本机内存 4.防止内存泄漏 1.JMM简介 i.内存模型概述 Java平台自动集成了线程以及多处理器技术,这种集成程度比Java以前诞生的计算机语言要厉害很多,该语言针对多种异构平台的平台独立性而使用的多线程技术支持也是具有开拓性的一面,有时候在开发Java同步和线程安全要求很严格的程序时,往往容易混淆的一个概念就是内存模型.究竟什么是内存模型?内存模型描述了程序中各个变

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

一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能. 本文将从JVM内存模型.GC工作原理,以及GC的几个关键问题进行探讨,从GC角度提高Java程序的性能. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两种类型内存:堆和非堆,堆内存

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

一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能提高整个应用程序的性能. 本文将从JVM内存模型.GC工作原理,以及GC的几个关键问题进行探讨,从GC角度提高Java程序的性能. 一.Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配. JVM主要管理两种类型内存:堆和非堆,堆内存