JVM

  • JVM 内存模型

    • 线程共享

      • 堆和方法区
    • 线程私有

      • 虚拟机栈 本地方法栈 程序计数器
    • 方法区:

    原来是通过永久代来实现,现在通过元空间实现,永久代是堆的一部分,元空间属于本地内存。元空间主要存储元信息,静态变量和常量池并入堆中。

    静态变量 静态代码块 静态方法 构造代码块

  • 对象的非静态成员变量

  • 栈内存

    存储局部变量

类加载机制

​ 七个阶段: 加载 验证 准备 解析 初始化 使用 卸载

  • 加载

    - 通过一个类的权限域名获取他的二进制字节流
       - 将二进制字节流代表的静态存储结构转化为方法区运行的数据结构
    - 将java 堆生成代表这个类的class 对象作为读取方法区数据的访问入口
- Xmx 最大堆内存  Xms 初始堆内存

四大引用

强引用我们平常new 这个对象

软引用:内存空间够就不会回收大

弱引用,不管空间是否够都能引用他。

虚引用主要用来跟踪垃圾回收的过程。

什么可以作为GCRPOOT 的引用对象

java 虚拟机栈中的引用对象

方法区中类静态属性引用对象

方法区产常量引用对象

本地方法栈中的引用对象

GC 回收的过程

1、发生Young GC之前进行检查,如果“老年代可用的连续内存空间” < “新生代历次Young GC后升入老年代的对象总和的平均大小”,说明本次Young GC后可能升入老年代的对象大小,可能超过了老年代当前可用内存空间,此时会触发FullGC

2、当老年代没有足够空间存放对象时,会触发一次FullGC

3、如果元空间区域的内存达到了所设定的阈值-XX:MetaspaceSize=,也会触发FullGC。

String Stringbuffer 是线程安全的 StringBuilder线程不安全

Donate comment here