JVM系列(一内存模型)

  好久没有整理这方面的东西了。现在整理一下JVM相关的东西。这是第一篇,JVM内存模型。

进程&JVM

  首先,何谓JVM?为什么要有JVM的存在?

  JVM就是java virtual machine的简称。当然了,除了java的VM以外还会有好多别的虚拟机。java的VM模型有好几个,其中最常见的应该是HotSpot VM。

  假设jvm在一个32位的操作系统中运行。32位windows最大只支持4G内存,而进程只能最多2G内存;32位linux最大也只支持4G内存,但是进程最多可以有3G左右。画个图来更清晰的表示:

  jvm首先就是一个程序。一个虚拟机,用于执行java的虚拟机。具体这个虚拟机的大小是可以调整的,但是最大不会超过系统进程的大小。先把内存分为两块:

  • 虚拟机内的内存
  • direct memory

  direct memory有好多的叫法。比如说non-heap memory(与perm有区分),un-safe memory等。在一个进程中,JVM分配的内存越大,direct memory就会越小。使用这一块内存的好处,就一个字,快!因为虚拟机里面的“安全”内存,是经过jvm分配的。而direct memory是直接使用程序的内存。然而!不经过JVM的这一块内存是不会经过垃圾回收管理的。这块内存对于java来说,使用不当是相当有风险的。

  用两行代码描述这二者的区别:

            ByteBuffer buffer = ByteBuffer.allocateDirect(ONE_MB*128);
            ByteBuffer buffer = ByteBuffer.allocate(ONE_MB*128);    

  有兴趣的童鞋自己玩玩,当分配很大的内存时候,上面两行代码都会抛出OOM异常。但是OOM的内容是不同的。

虚拟机内的内存分布

  虚拟机是用于运行程序的。而程序本身是通过指令执行,通过变量对象运算。指令归于stack(栈),变量对象归于heap(堆)。其次,还有一个叫做non-heap的内存用于放对象的格式等信息,运行时常量等(与direct memory有区别)。借用stackOverflow里面的一个图展示:

  上述3块东西,都是在jvm里面的。3块东西分别用于不同的职能。

分代管理的heap

  上图的第三块内存heap。是理解jvm模型中最核心的一个部分。电脑有安装jdk的话,会有一个visualVm的程序。然后安装了visualGC插件,可以很清晰的看到这一块内存的情况。参考(http://www.mamicode.com/info-detail-632507.html)

  下面来个图片:

  看这个图就一点都不抽象了^_^

  这里有一个eden、2个survivor、一个old和perm的区域。首先注意,perm是non-heap的。perm并不算在heap里面。

  不算perm,为何要有这么几个区域呢??

  

  创建的对象一开始是在eden区域的。绝大部分对象,其实很快就没有被使用了。那么当eden满了后,stop the world。然后把存活的对象放到一个survivor区域中。等eden区又满了,把eden存活的和上次那个survivor中的对象放到另外一个survivor区域中。(新生代的垃圾回收过程)

  假设其中一个survivor区域满了,也依然对象在使用,就把这些对象放到old区中。(基于copying的垃圾回收)

  old区满了,就不能再复制了,在自身中标记--整理(基于mark--compact的垃圾回收)

  简单的说,这样子划分是根据对象的生命周期和垃圾回收原理来分区域的。更详细的说明,要跟垃圾回收结合了。

时间: 2024-11-03 21:13:04

JVM系列(一内存模型)的相关文章

Java 进阶(一) JVM运行时内存模型

1.JVM运行时数据区域的划分 a.程序计数器(Program Counter Register) 一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器.每个线程拥有独立的一个计数器,如果当前执行的是Native方法,则计数器值为空. b.JVM栈(Java Virtual Machine Stack) 描述Java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stacks Frame)用于存储局部变量表,操作数栈,动态链接,方法出口等信息. 每一个方法从调用直至执行完成

jvm(12)-java内存模型与线程

[0]README 0.1)本文部分文字描述转自“深入理解jvm”,旨在学习“java内存模型与线程” 的基础知识: [1]概述 1)并发处理的广泛应用是使得 Amdahl 定律代替摩尔定律称为计算机性能发展源动力的根本原因: 2)Amdahl 定律:该定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力: 3)摩尔定律:该定律用于描述处理器晶体管数量与运行效率间的发展关系: Conclusion)这两个定律的更替代表了近年来硬件发展从追求处理器频率到追求多核心并行处理的发展

JVM学习 - 体系结构 内存模型

一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代" ."非堆",  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存区域.默认最小值为16MB,最大值为64MB,可以通过-XX:PermSize 和 -XX:MaxPermSize 参数限制方法区的大小. 运行时常量池:是方法区的一部分,Class文件中除了有类的版本.字段.方法.接口等描述信息外,还有一项信息是常量池,用于存放编译器生成的各种符号引用,这部分内容将在类加

JVM(二):内存模型

内存模型 Java堆(Heap) Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块.Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建.此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存. Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做"GC堆".如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java堆中还可以细分为:新生代和老年代:新生代又可细分为 Eden空间.From Survivor空间

JVM原理与内存模型

编译型语言:一次性地编译成机器码,生成可执行文件.解释型语言:使用专门的解释器对源码逐行解释成特定平台的机器码并立即执行的语言. JVM原理:Java语言既是编译型语言,又是解释型语言:Java源码通过javac命令被编译成.class文件,这种字节码文件不面向任何平台,只面向JVM(Java Virtual Machine):JVM是Java跨平台的关键部分,其向上提供给Java字节码程序的接口完全相同,而向下适应不同平台的接口则互不相同,为特定平台提供特定机器码,使用java命令解释执行.

JavaScript学习系列之内存模型篇

一个热爱技术的菜鸟...用点滴的积累铸就明日的达人 正文 如果真的想学好一门语言,那么一定要了解它内存模型,本篇文章就带你走进JavaScript的内存模型,由于本人才疏学浅,若有什么表述有误的地方,欢迎各位看官能够指点一二,在此不胜感激... 在阅读这边文章之前,默认您已经掌握了JavaScript的基本概念.栈堆等基本数据结构以及计算机基本理论基础,如有了解欠缺,请移步相关博客后再阅读本文. 一.基本的数据类型的内存结构 首先粗略的介绍一下JavaScript中五种基本的数据类型Undefi

jvm 03-java堆内存模型

java中最大的特点在于其具备良好的垃圾收集特性 GC是整个java之中最重要的安全保证 整个JVM中的GC的处理机制:对不需要的对象进行标记,而后进行清除 JVM堆内存划分 在JDK1.8之后,将最初的永久带内存空间取消了,该图为JDK1.8之前的内存空间组成 取消永久代目的是为了将HotSpot于JRockit两个虚拟机标准联合为一个 在整个JVM堆内存之中实际上将内存分为了三部分: 新生带(年轻代):新对象和没达到一定年龄的对象都在年轻代 老年代:被长时间使用的对象,老年代的内存空间应该要

JVM组成部分以及内存模型

一.JVM的组成部分 我们先把JVM这个虚拟机实现机制画出来,例如以下图所看到的: 从这个图中能够看到,JVM是执行在操作系统之上的,它与硬件没有直接的交互. 我们再来看下JVM有哪些组 成部分,例如以下图所看到的: 1. Class Loader 类载入器 类载入器的作用是载入类文件到内存,比方编写一个HelloWord.java程序,然后通过javac编译成class文件. 那怎么才干载入到内存中被运行呢?Class Loader承担的就是这个责任.那不可能随便建立一个.class文件就能

jvm系列(一)之内存模型

JVM内存结构 Java内存模型是指Java虚拟机的内存模型,我们来看下Java内存模型的图片: VM内存模型主要分为三块:Java 堆内存(Heap).方法区(Non-Heap).JMV栈(JVM Stack).本地方法栈(Native Method Stacks).程序计数器(Program Counter Register). Java堆(Heap) 对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块.Java堆是被所有线程共享的一块内存区域,在虚

【转】深入理解JVM—JVM内存模型

http://www.cnblogs.com/dingyingsi/p/3760447.html#3497199 我们知道,计算机CPU和内存的交互是最频繁的,内存是我们的高速缓存区,用户磁盘和CPU的交互,而CPU运转速度越来越快,磁盘远远跟不上CPU的读写速度,才设计了内存,用户缓冲用户IO等待导致CPU的等待成本,但是随着CPU的发展,内存的读写速度也远远跟不上CPU的读写速度,因此,为了解决这一纠纷,CPU厂商在每颗CPU上加入了高速缓存,用来缓解这种症状,因此,现在CPU同内存交互就变