JVM (Java虚拟机) 内存管理

原创 2016年08月29日 17:49:28

Java不需要开发人员显式分配内存和回收内存,而是通过JVM来自动管理内存的分配和回收 ( 即GC )。这篇博文将用通俗易懂的方式来总结 JVM。

JVM的规范定义如下:
这里写图片描述

接下来我们分开来分析整个JVM。
1.JVM的内存管理:

这里写图片描述

如上图所示,Sun JDK 遵照JVM的规范,将内存划分为五部分,分别为:pc寄存器、JVM方法栈、本地方法栈、JVM方法区、JVM堆。

pc寄存器和JVM方法栈:

每个线程均会创建pc寄存器和JVM方法栈
pc寄存器占用的可能为cpu寄存器或者操作系统内存
JVM方法栈占用的是操作系统内存,JVM方法栈是线程私有
当方法运行完,其占用这两部分内存会自动释放。

本地方法栈:

本地方法栈用于支持本地方法的执行
存储了每个本地方法调用的状态
在Sun JDK 中,本地方法栈和JVM方法栈是同一个

JVM方法区:

存放了要加载的类的信息、类中的静态变量、类中定义的final类型的常量、类中的方法信息等。
方法区域是全局共享的
在Sun JDK 中方法区又称为持久代,默认最小值为16M,最大值为64M.
在一定条件下可以被GC.

JVM堆:
堆主要用于存储对象实例和数组值,Java中所有通过new创建的对象的内存都在堆中分配。由GC进行回收。
补充:老年代主要用来存放新生代中经过多次垃圾回收仍然存活的对象,例如缓存对象,新建的对象也有可能在老年代上分配内存(大对象或大的数组对象,且数组要保证无引用外部对象)。

关于堆的细节内容,请看我之前写的一篇博文:

Java GC、新生代、老年代

关于内存的分配问题:
Java对象所占有的内存主要是从堆上进行分配,堆是线程共享的,因此在堆上分配内存时需要加锁。当堆上空间不足时,会触发GC,若GC后空间仍然不足,则会抛出异常。

接下来,我们重点分析内存的回收:

JVM通过GC来回收堆和方法区中的内存
GC的基本原理是:
(1)先找到程序中不再被使用的对象
(2)回收这些对象所占用的内存
通常采用收集器的方式实现GC,主要的收集器有引用计数收集器和跟踪收集器。

1.引用计数收集器(分散式管理 ):
给每个对象设置一个引用计数器,当该对象被引用的时候,计数器的值加一,当计数器的值为0的时候,表示该对象没有被引用,即可以进行回收。
缺点:
(1)引用计数器需要在每次对象赋值时进行计数器的增减,有一定的消耗。
(2)引用计数器对于循环引用的场景没有办法进行回收。
所以,Java不使用这种收集器。
2.跟踪收集器 (集中式管理):

这里写图片描述

跟踪式收集器基于一定的条件触发,执行时需要从根集合扫描对象的引用关系,这会造成程序的暂停。

三种跟踪收集算法的缺点:
复制:成本是要增加一块新的内存以及进行对象的移动
标记--清除:会造成内存碎片
标记--压缩:不产生内存碎片但是对象移动成本高
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

《深入理解Java虚拟机——JVM高级特性与最佳实践》学习笔记——自动内存管理机制

《深入理解Java虚拟机——JVM高级特性与最佳实践》学习笔记——自动内存管理机制1.概述对于从事C、C++程序开发的开发人员来说,在内存管理领域,既拥有每一个对象的”所有权”,又担负着每一个对象生命...

JVM内存管理机制----对《深入理解JAVA虚拟机》第二章的理解(上)

JVM内存区域分为五块:虚拟机栈,本地方法栈,程序计数器,堆区,方法区。 虚拟机栈(线程私有):执行java方法,线程中每执行一个方法都会创建一个栈帧。方法调用时,栈帧在JVM中入栈,方法结束时,出栈...

Sun JVM内存管理与Java虚拟机(JVM)垃圾回收器的工作机制

转自:http://dev.firnow.com/course/3_program/java/javajs/20100719/453020.html内存管理和垃圾回收是JVM非常关键的点,对Java性...
  • wf1982
  • wf1982
  • 2011-02-15 17:37
  • 1104

JVM虚拟机内存管理

JVM是运行在操作系统之上的一个抽象计算机,运行在JVM上的JAVA程序,隔离了计算机底层的差异,实现了“write once,run anywhere”。

初探jvm虚拟机之内存管理(二)

上篇介绍了关于jvm内存区域的概念性的内容 http://blog.csdn.net/fzj258554288/article/details/51397010 ,本篇介绍对象访问在内存中的体现,...

jvm开发笔记5 - 虚拟机内存管理

一、 前言      ajvm是笔者正在开发中的一个java虚拟机, 想通过编写这个jvm帮助程序员了解jvm的具体实现细节, 它是国内第一个开源的java虚拟机项目:https://git...

JVM内存管理,虚拟机堆栈的理解

JVM内存管理以及各个内存区域的作用。JVM内存管理:程序计数器、虚拟机栈、堆(Heap)、方法区、运行时常量池。

java虚拟机内存管理机制:JVM内存管理总结

原博客:http://blog.csdn.net/lengyuhong/article/details/5953544 近期看了看Java内存泄露的一些案例,跟原来的几个哥们讨论了一下,深入研究...

java虚拟机内存管理机制(一):JVM内存管理总结【分享】

近期看了看Java内存泄露的一些案例,跟原来的几个哥们讨论了一下,深入研究发现JVM里面还是有不少以前不知道的细节,这里稍微剖析一下。先看一看JVM的内部结构—— 如图所示,JVM主要包括两...

java虚拟机内存管理机制(二):了解JVM的内存管理与垃圾回收

Java语言具备GC(垃圾回收)的能力,内存管理不需要应用程序去过问,这很方便。但是,GC是怎么进行的,JVM的内存参数应该怎么调整,如何优化,往往我们不是太清楚。看过一些资料后,对Sun JVM的内...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)