java虚拟机中的板块

JVM内存板块分为5大块:JAVA堆、永久代、栈空间、本地方法栈、Cheap。

JAVA堆:又名Heap区,包括Young、old两大板块

永久代:、

栈空间:运行时线程私有栈空间

本地方法栈:C部分的代码区域

Cheap:非java区域的内存使用,有些JNI的调用会用到堆内存

Yong空间分为3个板块:1个Eden+2个Survivor区。

Eden区:使用new()或者newInstance()等方法创建的对象,默认都先将对象放到Eden区域的(除非对象太大,具体默认大小阈值-XX:PretenureSizeThreshold,超过阈值则放到old区)。

2个Survivor区又称S0、S1区。当Eden区域放满了就会做YoungGC(也称作MinorGC)。

位置总结:

1、当实例化一个对象时,对象大小没有达到阈值则会放入Eden区域。

2、第一次发生MinorGC时,会在S0或S1中选一个区域将Eden区域中活着的对象写入,(这里假定为S0),如果S0区域放不下了,则会放入Old区域,然后清空Eden区域。

3、第二次发生MinorGC时,会将“Eden区域+S0区域中活着的对象拷贝到S1”,如果S1区域放不下了,则会将对象放入Old区域,然后清空Eden区域和S0区域。

4、第三次发生MinorGC时,会将“Eden区域+S1区域中活着的对象拷贝到S0”,如果S0区域放不下了,则会将对象放入Old区域,然后清空Eden区域和S1区域,以此类推。

小结:

1、通常情况下,FULLGC是我们不愿意看到的情况。如果写代码是有偏大的一些内存在使用,就会频繁导致FULLGC,例如:在多线程系统中,每个请求所对应的线程每次多几KB或几MB的空间,那么这些多出来的空间很快会被放到old区域,当old区域满了,就会做FULL GC操作。

2、当Survivor区域放不下了,对象进入Old区域时,JVM会检查Old区域的内存空间是否足够,如果不足,就会做一次FULL GC操作。

3、如果通过intern()方法,调用一个String对象,那么这个对象就会在Perm区域的常变量池中分配空间,当然它会通过equals保证唯一值。但是如果大量调用不同的String对象的Intern()方法,那么这些对象会在perm区域形成一份拷贝,逐步导致perm区域满,这块区域如果满了,就会做fullGC。 如果发生FULL GC时,没有引用指向String常量,则对象会回收,如果有,则就无法回收,最终导致OOM。

4、Class对象也存储在Perm区域,如果动态加载大量的Class,而无法卸载的话,那么Perm区域也会满,自然也会FULLGC,甚至OOM(注:如果相关的ClassLoader下面的任意class对象还活着,那么它就不会被释放)

5、线程的栈空间,这块空间是线程的私有空间,它会存放程序运行过程中的局部变量信息、先进后出栈。在程序运行过程中如果,递归调用,不断消耗栈空间,就会出现StackOverflowError的错误。

时间: 2024-08-03 00:49:14

java虚拟机中的板块的相关文章

Java虚拟机规范阅读(二)IEEE754简介以及Java虚拟机中的浮点算法

什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数.典型的比如相对于浮点数的定点数(Fixed Point Number).在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置.货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值.由于小数点位置固定,所以可以直接用四位数值来表达相应的数值.SQL 中的 NUMBER 数据类型就是利用定点数来定义的.还有一种提议的表达方式为有理数表达方式,

JAVA虚拟机中的堆内存Heap与栈内存Stack

原文链接:http://www.cnblogs.com/laoyangHJ/archive/2011/08/17/gc-Stack.html 深入Java虚拟机:JVM中的Stack和Heap 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清Java中静态方法和静态属性的问题. 一般,JVM的内存分为两部分:Stack和Heap. Stack(栈)是JVM的内存指令区.Stack管理很简单,pus

聊聊JAVA虚拟机中的垃圾收集器

前言 JAVA虚拟机的垃圾收集器是虚拟机内存的清道夫,它的存在让JAVA开发人员能将更多精力投入到业务研发上.了解垃圾收集器,并利用好这个工具,能更好的保障服务稳定性.这篇文章通过分析JAVA虚拟机内存模型,介绍垃圾收集器常用算法和收集器类别,使得垃圾收集器的配置和使用变得不再遥不可及. JAVA虚拟机内存模型 JAVA虚拟机内存可以划分为:虚拟机栈.本地方法栈.JAVA堆内存.方法区(包含运行时常量池).程序计数器.直接内存. 虚拟机栈 虚拟机栈是线程私有的,生命周期跟线程相同.也就是说一个线

java虚拟机中的对象的创建

当虚拟机遇到一条new 指令时,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且这个符号引用代表类的是否已加载.解析和初始化过.如果没有必须执行类的加载过程. 在类加载检查过后,接下来虚拟机将为新生对象分配内存.对象所需内存大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从java堆中化分出来.java内存的分配方式分为"指针碰撞"(Bump the Pointer)和"空闲列表"(Free List)两种方式. 指

作为程序员必须掌握的Java虚拟机中的22个重难点

Java虚拟机一直是比较重要的知识点,是Java高级开发必会的.本文为你总结了关于JVM的22个重点.难点,图文并茂的向你展示和JVM有关的重点知识.全文共7000字左右. 概念 虚拟机:指以软件的方式模拟具有完整硬件系统功能.运行在一个完全隔离环境中的完整计算机系统 ,是物理机的软件实现.常用的虚拟机有VMWare,Visual Box,Java Virtual Machine(Java虚拟机,简称JVM). Java虚拟机阵营:Sun HotSpot VM.BEA JRockit VM.IB

HotSpot Java虚拟机中的“方法区”“持久代”“元数据区”的关系?

Sun/Oracle JDK的HotSpot VM中,直到JDK7都有“持久代”(Permanent Generation,简称PermGen).也称为方法区.Oracle JDK8的HotSpot VM去掉“持久代”,以“元数据区”(Metaspace)替代之. Oracle是在JDK7的时候宣布移除PermGen内存区域,但是知道JDK8才最终移除. 在JDK7之前,所谓的Permanet Generation内存区域其实包含了两个部分: 方法区 Internded String 方法区主要

Java为什么要在虚拟机中运行

简单的来说,Java作为一门高级程序语言,语法复杂,抽象度高,不能直接翻译为机器码在机器上运行,所以设计者就设计了虚拟机,通过编译器将Java程序转换成虚拟机所能识别的指令码,也就是Java字节码,Java字节码会被虚拟机翻译为可以被机器识别的机器码.这也实现了Java的跨平台 虚拟机的第二个好处就是带来了一个托管环境,托管环境能够代替我们处理代码中冗余并且容易出错的部分,比如自动内存管理,垃圾回收. 还有诸如数组越界.动态类型.安全权限等等动态监测. Java如何在虚拟机中运行的 从虚拟机角度

Java虚拟机工作原理详解

原文地址:http://blog.csdn.net/bingduanlbd/article/details/8363734 一.类加载器 首先来看一下java程序的执行过程. 从这个框图很容易大体上了解java程序工作原理.首先,你写好java代码,保存到硬盘当中.然后你在命令行中输入 [java] view plaincopy javac YourClassName.java 此时,你的java代码就被编译成字节码(.class).如果你是在Eclipse IDE或者其他开发工具中,你保存代码

java虚拟机的原理

所谓虚拟机,就是一台虚拟的机器.ta它是一款软件,用来执行一系列虚拟计算机指令,大体上虚拟机可以分为系统虚拟机和程序虚拟机,Visual Box .Vmare就属于系统虚拟机.他们完全是对物理计算机的仿真,提供了一个可运行完成操作系统的软件平台.程序虚拟机典型代表就是java虚拟机,它专门为执行单个计算机程序而设计,在java 虚拟机中执行的指令,我们称为java字节码指令.无论是系统虚拟机还是程序虚拟机,在上面运行的软件都被限制于虚拟机提供的资源中.java发展至今,出现过很多虚拟机,最初Su