Java虚拟机内存管理原理基础入门

Jdk:Java程序设计语言、Java虚拟机、Java API类库。

Jdk是用于支持Java程序开发的最小环境。

Jre:Java API类库中的Java SE API子集、Java虚拟机

Jre是支持Java程序运行的标准环境。

clip_image002

Program Counter Register:较小的内存空间,可以看作当前线程所执行的字节码的行号指示器。是唯一一个Java虚拟机规范中没有规定OutOfMemoryError的区域。

VM Stack:生命周期和线程相同,它描述了Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。

两种异常:StackOverflowError、OutOfMemoryError

Native Method Stack:类似VM Stack,且Sun HotSpot直接合二为一!

Heap:最大的一块内存,虚拟机启动时创建,唯一目的就是存放对象实例的。

Method Area:存储已被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。Java虚拟机规范称其为堆的逻辑部分,别名却叫Non-Heap(非堆),或永久代

Runtime Constant Pool:方法区的一部分

Direcrt Memory:不是虚拟机运行时数据区的一部分,也不是虚拟机规范定义的内存区域。

对象的创建—关键字new

内存划分方法:指针碰撞(堆内存规整,通过移动指针分配内存)、空闲列表(堆内存不规整,通过更新内存列表分配内存)。

TLAB(Thread Local Allocation Buffer):本地线程分配缓冲,对于所创建的线程都会分配一块独立的空间,避免内存分配冲突,提升内存分配效率。

对象的内存布局:对象头(Header)、实例数据(Instance Data)和对其填充(Padding)。

对象的访问定位:Java程序通过栈上的reference(引用)数据来操作堆上的具体对象。

  方式:句柄和直接指针(Sun HotSpot)。

clip_image004

clip_image006

OutOfMemoryError异常实战

工具:Eclipse Memory Analyzer

内存泄漏Memory Leak、内存溢出Memory Overflow

判断对象是否死亡—堆内存

1、引用计数算法:给对象添加一个引用计数器,每当有一个地方引用它是,计数器加1;当引用失效时,计数器减1;任何时刻计数器为0的对象就是不可能再被使用的。

2、可达性分析算法:通过“GC Roots”对象作为起始点向下搜索,当一个对象到GC Roots没有任何引用链相连,证明此对象是不可用的。

To be or not to be!

1、 使用上述算法判断对象是否使用;

2、 如果不再被使用,则标记并筛选;

    刷选是否有必要执行finalize()方法,如下情况不需要执行:

    l 对象没覆盖finalize()方法;

    l finalize()方法已经被虚拟机调用过;

3、 如果有必要执行,则把该对象放置在F-Queue队列中;

4、 由一个虚拟机自动建立、低优先级的Finalizer线程去执行它,即由虚拟机来触发执行;

5、 GC对队列中的对象会进行第二次标记,即给对象重新建立引用,就能移除回收集合;

注意:任何一个对象的finalize()方法都只会被系统调用一次!

方法区回收

主要两部分:废弃常量和无用的类

控制参数

-Xnoclassgc:关闭虚拟机对class的垃圾回收功能;

-verbose:class:监视有多少类被加载;

-XX:TraceClassLoading、-XX:TraceClassUnLoading:打印类被加载和卸载的过程信息;

注意:在大量使用反射、动态代理、CGLib等ByteCode框架、动态生成JSP以及OSGI这类频繁自定义ClassLoader的场景都需要虚拟机具备类卸载的功能,以保证永久代不会溢出!

垃圾收集算法

1、标记—清除算法:容易产生内存碎片

2、复制算法:堆被划分成两个不同的区域:新生代(Young) 主要是用来存放新生的对象、老年代(Old) 主要存放应用程序中生命周期长的内存对象。新生代 (Young)又被划分为三个区域:Eden、From Survivor、To Survivor。

默认的,新生代(Young)与老年代(Old)的比例的值为1:2

默认的,Edem : from : to = 8 : 1 : 1

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cd28f84297dcaaad121cdcdf01c1eb91.html