jvm之内存分配与垃圾回收
来源:互联网 发布:mysmartcamera监控软件 编辑:程序博客网 时间:2024/05/22 17:02
jvm之内存分配与垃圾回收
java运行时内存区结构
线程共享内存区
java堆区
它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配。
方法区(永久代)
方法区在物理上也属于java堆区的一部分。它用于存储每一个类的结构信息,例如运行时常量池,成员变量和方法数据,构造函数和普通函数的字节码内容,还包括一些在类、实例、接口初始化时用到的特殊方法。当开发人员在程序中通过Class对象中的getName、isInstance等方法获取信息时,这些数据都来自方法区。
运行时常量池
存放的为类中固定的常量信息、方法和域的引用信息。属于方法区的一部分,内存大小超过方法区的所能提供的最大值会有异常。
线程私有内存区
pc寄存器
一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器, Java 的多线程机制离不开程序计数器,每个线程都有一个自己的PC,以便完成不同线程上下文环境的切换。
java栈
每一个 JVM 线程都有自己的 java 虚拟机栈,这个栈与线程同时创建,它的生命周期与线程相同。虚拟机栈描述的是Java 方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法被调用直至执行完成的过程就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。
本地方法栈
本地方法栈则为虚拟机使用到的本地方法(比如使用c/c++代码编写的方法)服务。
内存分配原理
逃逸分析和栈上分配
垃圾回收
垃圾标记算法:根搜索算法
垃圾回收算法:标记清除算法(会产生碎片,适合老年代),复制算法(适合新生代),标记压缩算法(适合老年代)
四种full GC的场景:
1、System.gc();
2、旧生代空间不足
旧生代空间只有在新生代对象转入及创建为大对象、大数组时才会出现不足的现象,当执行Full GC后空间仍然不足,则抛出如下错误:
java.lang.OutOfMemoryError: Java heap space 。
3、Permanet Generation空间满
PermanetGeneration中存放的为一些class的信息等,当系统中要加载的类、反射的类和调用的方法较多时,Permanet Generation可能会被占满。
4、统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间
这是一个较为复杂的触发情况,Hotspot为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC时,做了一个判断,如果之前统计所得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间,那么就直接触发Full GC。
0 0
- jvm之内存分配与垃圾回收
- JVM学习笔记之内存分配与垃圾回收
- JVM之内存分配与回收策略
- JVM之内存分配与回收策略
- jvm虚拟机特性之内存分配与回收
- jvm之内存管理和垃圾回收
- Java的内存回收之内存泄漏与垃圾回收
- JVM的垃圾回收与内存分配
- jvm 内存分配与垃圾回收
- Java进阶之内存管理与垃圾回收
- 性能优化一之内存与垃圾回收器
- JVM之内存区域分配
- jvm之内存分配策略
- JVM学习03-内存管理和垃圾回收01(之内存区域划分)
- JVM内存管理之内存回收策略
- JVM垃圾回收与内存分配浅析(一)
- JVM垃圾回收与内存分配浅析(二)
- JVM垃圾回收与内存分配(一)
- 浅谈GC的基本原理
- JDBC
- Android基础—三个绘图工具类详解
- Cmake使用中出现的问题
- linux shell 脚本启动Java总结
- jvm之内存分配与垃圾回收
- 爱回收 笔试题—Java初始化顺序
- C++单例模式模板
- 获取系统时间
- vh单位模拟office word效果
- 集合的练习——简易书店购物车
- Bower使用
- 按下done退出键盘,点击空白退出键盘
- C++中new和不new的区别