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.跟踪收集器 (集中式管理):

这里写图片描述

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

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

Tomcat下log4j设置文件路径和temp目录

在Web应用中的如何设置日志文件的路径呢?最笨的方法是写绝对路径,但很不方便。 而Spring的做法是使用一个Servlet Listener,在WebContainer启动时把ROOT的绝对路径写...

java虚拟机和内存管理

1. GC线程是否为守护线程?() 答案:是 解析:线程分为守护线程和非守护线程(即用户线程)。 只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后...

Java虚拟机的深入研究(内存管理---垃圾回收---JVM调优)

JVM学习笔记(一)------基本结构   从Java平台的逻辑结构上来看,我们可以从下图来了解JVM: 从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别 对于JVM...

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

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

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

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

JVM基础 之Java HotSpot虚拟机中的内存管理

转载:http://sishuok.com/forum/blogPost/list/339.html 1  简介          依托JavaTM 2平台的力量,标准版(J2SE...

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
  • 1145

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

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

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

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

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

JVM内存管理以及各个内存区域的作用。JVM内存管理:程序计数器、虚拟机栈、堆(Heap)、方法区、运行时常量池。...
  • xin1990
  • xin1990
  • 2017年07月13日 16:49
  • 112
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM (Java虚拟机) 内存管理
举报原因:
原因补充:

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