(文章翻译自What do Java objects look like in memory during run-time?) 我们知道函数在内存中是作为一个活动记录栈来实现的.而且我们知道Java的方法在JVM栈中是作为一个帧栈来实现的并且在堆中被分配内存. Java对象在堆中是什么样子的呢?一旦一个对象被放置到内存中,它就是一个序列的字节. 然后我们怎么知道到哪里去寻找一个指定的域呢?这是在编译器中有一个维护着每一个域的偏移量的内部表. 下面就是一个放置在内存的对象BaseB的例子,这个类…
转载:  https://blog.csdn.net/a745233700/article/details/80291694  (虽然大部分内容都其实是深入理解jvm虚拟机这本书里的,不过整理的很牛逼) 一 java运行时内存中的数据区域 每一个Java程序启动后,会获得一个JVM的实例,用来管理内存.Java 虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.这些区域都有个字的用途,以及创建和销毁时间.Java虚拟机所管理的内存将会包括以下几个运行时数据区域: 1.…
----JVM运行时内存划分----不同的区域存储的内容不同,职责因为不同1.方法区:被线程共享,存储被JVM加载的类的信息,常量,静态变量等2.运行时常量池:属于方法区的一部分,存放编译时期产生的字面量和符号引用3.Java堆区:被线程共享,主要存放new出的对象,GC主要负责的区域4.虚拟机栈:属于线程私有,存放方法中的参数局部变量等5.本地方法栈:线程私有,存储与本地方法相关的变量6.PC,程序计数器线程私有,用来记录当前以及下次要执行的指令----对象访问的方式----1.句柄:对象的引…
java程序运行时内存分配详解 这篇文章主要介绍了java程序运行时内存分配详解 ,需要的朋友可以参考下   一. 基本概念 每运行一个java程序会产生一个java进程,每个java进程可能包含一个或者多个线程,每一个Java进程对应唯一一个JVM实例,每一个JVM实例唯一对应一个堆,每一个线程有一个自己私有的栈.进程所创建的所有类的实例(也就是对象)或数组(指的是数组的本身,不是引用)都放在堆中,并由该进程所有的线程共享.Java中分配堆内存是自动初始化的,即为一个对象分配内存的时候,会初始…
1.Java程序跨平台运行的原因 主要原因是:各种平台的JVM和字节码文件 Java源程序--具体平台的机器代码文件---被编译器翻译成平台无关的Class文件,又用特定JVM运行字节码文件,JVM在运行的过程中 将字节码指令转换为具体平台的机器指令.JVM运行在用户态,操作系统将JVM看作是一个特殊的软件,JVM启动的时候,OS给其划分 一定的内存供其运行字节码文件.存在基于JVM的其他编程语言的原因:对应特定语言的编译器可以将源码翻译成字节码文件,这个字节码可以被JVM识别并执行. 注意:执…
目前三大主流JVM: Sun HotSpot:Sun于1997年收购Longview Technologies公司所得.Sun于2009年被Oracle收购. BEA JRockit:BEA于2002年收购Appeal Virtual Machines公司所得.BEA将其发展为一款专门为服务器硬件和服务器端应用场景高度优化的虚拟机,由于专注于服务器端应用,它可以不太关注程序启动速度,因此JRockit内部不包含解析器实现,全部代码都靠即时编译器编译后执行.除此之外,JRockit的垃圾收集器和M…
首先通过一张图了解 Java程序的执行流程: 我们编写好的Java源代码程序,通过Java编译器javac编译成Java虚拟机识别的class文件(字节码文件),然后由 JVM 中的类加载器加载编译生成的字节码文件,加载完毕之后再由 JVM 执行引擎去执行.在加载完毕到执行过程中,JVM会将程序执行时用到的数据和相关信息存储在运行时数据区(Runtime Data Area),这块区域也就是我们常说的JVM内存结构,垃圾回收也是作用在该区域. 关于这幅图涉及到的: ①.class文件 ②.类加载…
还是我们上次的图,我们上次大概讲解了类加载子系统的执行过程,验证,准备,解析,初始化四个过程.还有我们的双亲委派机制. 我们这次来说一下运行时内存模型.上一段小代码. public class Main { public int compute() { int a = 11; int b = 22; int c = a + b / 2; return c; } public static void main(String[] args) { Main main = new Main(); int…
java运行时内存区域划分为方法区,堆区,虚拟机栈区,本地方法栈,程序计数器.其中方法区跟堆区是线程共享的数据区,其他的是线程私有的数据区. 1.程序计数器 程序计数器(PC)是一块较小的内存,他是存储当前线程执行的字节码的行号指示器,可以类比硬件中PC,硬件中的PC用于指示当前程序执行的代码在内存中的内存地址. 2.JAVA虚拟机栈 虚拟机栈描述的是JAVA方法执行的内存模型.每个方法在执行时都会创建一直栈帧用于存储局部变量表,操作数栈,动态链接,方法出口灯信息.每一个方法从调用到结束都对应一…
学习java运行时内存模式: 各区介绍: 方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoader被回收). Java堆(线程共享):存放对象实例和数组,这里是内存回收的主要地方.可以分为新生代(young)和年老代(tenured).从字面也可以知道,新生代存放刚刚建立的对象 而年老代存放长久没有被垃圾回收机制回收的对象.一般新生代有分为eden,from survivor和to sur…