JVM内存分配

内存分配:当JVM运行起来的时候就会给内存划分空间,那么这块空间称之为运行时数据区。
(备注:当一个Java源程序编译成class字节码文件之后,字节码文件里存放的都是二进制的汇编命令,当程序运行的时候,JVM会将这个二进制的命令逐行解释,交给CPU去执行)

运行时数据区将划分为以下几块内容:

1)栈:

   每一个线程运行起来的时候就会对应一个栈(线程栈),栈当中存放的数据是被当前线程所独有的。而栈当中存放的是栈帧,当线程调用一个方法的时候,就会形成一个栈帧,并将这个栈帧进行压栈操作,当方法执行完之后就会将这个栈帧进行出栈操作。这个栈帧里面包括(局部变量、操作数栈、指向当前方法对应类的常量池引用、方法的返回地址等信息)。

(备注:由于局部变量都是存放在栈中,而每一个线程都对应自己的线程栈,因此局部变量是线程安全的,不会产生资源共享的情况。)

2)本地方法栈:

       本地方法栈的机制和栈的机制类似,区别在于,栈是运行Java所实现的方法,而本地方法栈是运行的本地方法(Native Method)。所谓的本地方法指的是在本地jvm中需要调用非Java语言所实现的方法,例如c语言。在JVM的规范中,其实没有强制性要求实现方一定要划分出本地方法栈的和具体的实现,这一部分可以根据实现方具体要求来实现。因此在HotSport虚拟机的实现中就将方法栈和本地方法栈二合为一。

   

3)程序计数器:     

程序计数器也可以称之为PC寄存器。它主要用于存放当前程序下一条将要执行的指令地址。CPU会根据这个地址找到对应的指令来执行。通俗的讲就是指令缓存。这个寄存器是有JVM内部实现的,并不是物理概念上的寄存器,但是JVM在实现功能的逻辑上是相同的

 4)堆:

     堆内存中主要存放创建的对象以及数组。 堆内存是可以被多个线程所共享的一块区域,因此多个线程栈都可以去访问同一块堆的内存区域。堆里面的每一对象都存放了该实例的实例变量。 当方法中定义了一个局部变量,如果这个变量是基本数据类型,那么这个变量的值就直接存放在栈中,如果这个变量是引用数据类型,那么这个对象变量就存放在堆内存中,而栈中存放的是一个指向堆内存中这个对象的首地址。

(备注:Java中除了8个基本数据类型以外的所有类型都是引用数据类型)

时间: 2024-10-22 05:36:08

JVM内存分配的相关文章

最简单例子图解JVM内存分配和回收

一.简介 JVM采用分代垃圾回收.在JVM的内存空间中把堆空间分为年老代和年轻代.将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象.年轻代中又被分为Eden区(圣经中的伊甸园).和两个Survivor区.新的对象分配是首先放在Eden区,Survivor区作为Eden区和Old区的缓冲,在Survivor区的对象经历若干次收集仍然存活的,就会被转移到年老区. 简单讲,就是生命期短的对象放在一起,将少数生命期长的对象放在一起,分别采用不同的回收

Android性能调优篇之探索JVM内存分配

详细内容请查看我的简书地址:Android性能调优篇之探索JVM内存分配 或者我的个人博客地址:Android性能调优篇之探索JVM内存分配

JVM内存分配简介

面向对象进阶 JVM内存分配 1.xxx.java----xxx.class (编译器进行) 2.xxx.class----类加载器(三种)----在内存分配空间 3.JVM会将内存分为5块① 栈:  Java栈区域比较小,空间大约1M. 特点:(存取数据)速度非常快,在栈里边执行的基本上都是快速的任务:基本数据类型和对象的引用.② 堆:  new出来的对象都存放在堆里边,堆里边的每一个对象都会产生一个唯一的地址. 内存地址会赋值给栈里边的引用.堆里边的对象需要垃圾回收机制才能销毁. 要销毁一个

JVM内存分配及String常用方法

一,JVM内存分配和常量池 ? 在介绍String类之前,先来简单分析一下在JVM中,对内存的使用是如何进行分配的.如下图所示(注意:在jdk1.8之后便没有方法区了): ? ? 如上JVM将内存分为多个不同的区域,这些区域都有各自的用途.创建和销毁的时间,有些区域随虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束来建立和销毁. ? 区域名称的说明: 1.1,方法区: ? 属于数据共享内存区域,存储已被虚拟机加载的类信息.常量.静态变量.即时编译器编译后的代码等数据. 1.2,虚拟机

深入理解JVM内存分配策略

理解JVM内存分配策略 三大原则+担保机制 JVM分配内存机制有三大原则和担保机制 具体如下所示: 优先分配到eden区 大对象,直接进入到老年代 长期存活的对象分配到老年代 空间分配担保 对象优先在Eden上分配 如何验证对象优先在Eden上分配呢,我们进行如下实验. 打印内存分配信息 首先代码如下所示: public class A { public static void main(String[] args) { byte[] b1 = new byte[4*1024*1024]; }

jvm内存模型,java类从编译到加载到执行的过程,jvm内存分配过程

一.jvm内存模型 JVM 内存模型主要分为堆.程序计数器.方法区.虚拟机栈和本地方法栈 1.堆 1.1.堆是 JVM 内存中最大的一块内存空间. 1.2.该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中. 1.3.堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Survivor 和 To Survivor 组成. 2.程序计数器(Program Counter Register) 程序计数器是一块很小的内存

JVM虚拟机-03、JVM内存分配机制与垃圾回收算法

JVM虚拟机-03.JVM内存分配机制与垃圾回收算法 1 JVM内存分配与回收 1.1 对象优先在Eden区分配 大多数情况下,对象在新生代中?Eden?区分配.当?Eden?区没有足够空间进行分配时,虚拟机将发起一次Minor?GC.我们来进行实际测试一下.在测试之前我们先来看看?Minor?GC和Full?GC?有什么不同呢? Minor?GC/Young?GC:指发生新生代的的垃圾收集动作,MinorGC非常频繁,回收速度一般也比较快. Major?GC/Full?GC:一般会回收老年代,

jvm 内存分配 (转)

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

JVM——内存分配与收回策略

JVM的自动内存管理要自动化地解决两个问题:对象分配内存以及回收分配给对象的内存.回收内存前几篇已经讲了,现在说内存分配.对象的内存分配一般分配在堆内存中,也可能经过JIT 编译后被拆散为标量类型间接地在栈上分配.对象主要分配在新生代的Eden 区上,如果启动了本地线程分配缓存,将按线程优先在TLAB (本地线程分配缓存)上分配.少数情况下也可能会直接分配在老年代中,分配的规则不是固定的,与使用哪一种垃圾收集器组合,还与虚拟机中内存相关参数设置有关.对象优先在Eden区分配多数情况下,对象在新生