学习JVM的个人理解以及整理——自动内存管理机制

原创 2018年04月17日 15:24:49

java虚拟机所管理的内存区域划分为堆,方法区,虚拟机栈,本地方法栈,程序计数器。

每个虚拟机栈中有一个私有的程序计数器,程序计数器占用很小的一块内存,在执行一个java方法时,记录正在执行的虚拟机字节码的地址。虚拟机栈中有一个栈帧,用于存放局部变量表,操作数栈,动态链表,方法出口等。

常量池用于存放编译期期间生成的各种字面量和符号,在类加载后进入方法区的运行时常量池。

Java语言并不要求常量一定在编译期才能产生。并非一定是在class编译期中预置的才能进去方法区中的运行时常量池,在运行期间也可以将常量放入。运用的最多的就是String类的intern()方法。运行时常量池是方法区的一部分,当无法申请的内存是会抛出OOS异常。

对象的创建,当遇到一个new指令时,会先去检查这个指令的参数在常量池中是否能定位到一个类的符号引用,在检查这个符号引用代表的类是否被加载,解析和初始化够。在类加载通过后,对象所需要的大小可以完全确定。在Java堆中,拥有一个指针座位分界点的指示器,当需要分配内存时,会指向未被分配内存的区域,将其挪动一段与对象大小相等的距离,称为指针碰撞。如果内存不是规整的,会有一个列表,上面记录哪些区域是可用的,当需要是划分列表中一块足够大的空间分配给对象,然后更新列表上的记录,称为空闲列表。Java堆是否规整由GC收集器是否带有压缩整理功能决定。Serial等带有Compact过程的采用指针碰撞,CMS这种基于Mark-Sweep算法的收集器,采用空闲列表。

对象在内存中存储的布局可以分为3部分:对象头,实例数据,对齐填充。

对象头包含两部分,第一部分是自己运行时的数据,包裹哈希吗,GC分代年龄,锁状态的标志,线程自带的锁,偏向线程ID,偏向时间戳等。另一部分是类型指针,指向它的类元数据。虚拟机可以通过这个指针来确定它是哪个类的实例。如果是Java数组的话,在对象头中还必须有一块用于用于记录数组长度的数据,虚拟机可以通过普通java对象的元数据确定Java对象的大小,但是从数组的元数据中无法确定数组的大小。

对齐填充并不是必然存在的,起到一个占位符的作用,HotSpot VM的自动内存管理系统要求对象的起始地址必须是8字节的倍数,当对象的实例数据没有对齐的时候,就需要对齐填充来补全。

实例数据是对象真正存储的有效信息,也是在程序中所定义的各种类型的字段内容。存储顺序受到虚拟机分配策略参数和字段在java源码中定义顺序的影响。相同宽度的字段总是被分配到一起。满足这个条件下,父类中定义的方法会出现在子类之前。如果CompactFields为true,子类中较窄的变量也可能会插入到父类变量的空隙之中。

在jdk1.6之前,StringBuilder会在java堆中创建一个实例,调用String.intern()会把这个实例复制在方法区,所以他们不是一个相同的引用,在jdk1.7后,不会再实现复制,而是在方法区中记录首次出现的实例引用。





挑战万元高薪--深入理解java虚拟机(jvm)

-
  • 1970年01月01日 08:00

[jjzhu学java]深入理解JVM笔记之内存管理机制

深入理解JVM笔记之内存管理机制 运行时数据区域 程序计数器 JVM栈 本地方法栈 Java堆 方法区 运行时常量池 直接内存 对象访问 OutOfMemoryError异常 Java堆溢出示例 JV...
  • jjzhu_zju
  • jjzhu_zju
  • 2016-10-20 23:10:38
  • 676

JVM_自动内存管理机制

运行时数据区域 java虚拟机在执行java程序的过程中会把它所管理的内存划分为若干个不同点数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则...
  • suneqing
  • suneqing
  • 2016-05-14 17:35:52
  • 1046

Java自动内存管理机制(一) JVM、Class

关于JVM的内存回收机制,内容概念非常多,非一篇博文所能详尽。所以这里只截取重要部分。详细之处可参阅相关书籍或博客: 《深入理解Java虚拟机-JVM高级特性与最佳实践》 周志明 著1.JVM概念 ...
  • u012440687
  • u012440687
  • 2016-07-25 09:03:17
  • 840

JVM内存管理机制和垃圾回收机制

从Java平台的逻辑结构上来看,我们可以从下图来了解JVM:从上图能清晰看到Java平台包含的各个逻辑模块,也能了解到JDK与JRE的区别对于JVM自身的物理结构,我们可以从下图鸟瞰一下:对于JVM的...
  • u011225629
  • u011225629
  • 2015-10-09 15:06:04
  • 5608

jvm:停止复制、标记清除、标记整理算法(垃圾回收)

jvm:停止复制、标记清除、标记整理算法(垃圾回收)
  • u010841296
  • u010841296
  • 2016-03-21 12:24:55
  • 3640

专研JVM的个人理解以及整理——自动内存管理机制

java虚拟机所管理的内存区域划分为堆,方法区,虚拟机栈,本地方法栈,程序计数器。每个虚拟机栈中有一个私有的程序计数器,程序计数器占用很小的一块内存,在执行一个java方法时,记录正在执行的虚拟机字节...
  • qq_41534566
  • qq_41534566
  • 2018-04-18 16:09:26
  • 82

面试总结:java程序执行过程 + JVM内存管理 + GC垃圾回收机制

java程序执行过程 +JVM内存管理 + GC垃圾回收机制1、Java程序执行过程一个java程序的编译和执行过程如下: .java ——编译——> .class 类加载器负责加载各个字节码文件(....
  • u010429424
  • u010429424
  • 2017-08-17 19:15:26
  • 1717

JVM内存管理及GC机制

一、概述Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之一,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和...
  • suifeng3051
  • suifeng3051
  • 2015-09-08 16:28:18
  • 14140

JVM——内存管理和垃圾回收

GC   何为GC? Java与C语言相比的一个优势是,可以通过自己的JVM自动分配和回收内存空间。垃圾回收机制是由垃圾收集器Garbage Collection GC来实现的,GC是后台的守护进程...
  • SEU_Calvin
  • SEU_Calvin
  • 2016-07-12 21:05:30
  • 15891
收藏助手
不良信息举报
您举报文章:学习JVM的个人理解以及整理——自动内存管理机制
举报原因:
原因补充:

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