likes
comments
collection
share

java JVM 内存模型、回收机制、类加载器

作者站长头像
站长
· 阅读数 41

java JVM 内存模型、回收机制、类加载器

java JVM 内存模型、回收机制、类加载器 jvm 内存模型(JMM) jvm运行时数据区线程共享的分代 新生代和老年代指的是堆,永久代之的是方法区 新生代(堆内存的1/3空间)(新生代默认空间是8/1/1) Eden空间(8份) From Survivor(1份) To survivor(1份) 老年代(堆内存的2/3空间) 对象内存分配 new的对象或数组 优先在Eden分配,大对象、长期存活的对象直接进入老年代(age=15,15次 不被垃圾回收器回收),动态年龄判定(比如说在from 和 to之间来回切换,此时有多个对象, 加起来超过了他们的内存,那么就直接打包放进老年代) 永久代(1.8之前) ,JDK>=1.8 元空间

垃圾回收器方法 1.引用计数法 2.可达性分析

java JVM 内存模型、回收机制、类加载器

垃圾回收算法

复制回收算法(新生代回收算法) 只能有一半的内存可用,这块使用在新生代的Form 和To 区域,所以两个各一半的内存进行回收对象 和复制可用对象 为什么新生代不直接用复制回收算法,而只在from和to区使用? 因为在开发中90%的对象是不需要回收的,那么就有10%需要回收,所以采用8/1/1的方式分配内存回收 对象 老年代回收算法(优先使用清除,如果垃圾回收很多的话,使用标记整理) 1.标记清除算法 发现可回收对象直接清除,但是不对内存进行重新整理,所以这个算法会造成内存是碎片的,并不 是连续的内存 2.标记整理算法 先清理可回收的对象,再对存活的对象进行整理,

永久代会不会垃圾回收? 会

java JVM 内存模型、回收机制、类加载器

java JVM 内存模型、回收机制、类加载器 java JVM 内存模型、回收机制、类加载器

java JVM 内存模型、回收机制、类加载器

java JVM 内存模型、回收机制、类加载器

2.类加载器

java JVM 内存模型、回收机制、类加载器 类加载器类型: BootStrap ClassLoader 启动类的类加载器,加载JDK里 li目录下的文件,是虚拟机能够识别的一个类(不继承CLass Loader,底层是C++) Extension ClassLoader 扩展加载器,负责加载在 JRE目录下ext的目录(可直接使用) App ClassLoader 应用程序类加载器,负责加载用户路径下所指定的类(可直接使用) 启动类加载器加载完之后,其他类加载器才能执行

对象实例化时的顺序 (1) 父类静态代码块(包括静态初始化块,静态属性,但不包括静态方法)

  (2) 子类静态代码块(包括静态初始化块,静态属性,但不包括静态方法 )

  (3) 父类非静态代码块( 包括非静态初始化块,非静态属性 )

  (4) 父类构造函数

  (5) 子类非静态代码块 ( 包括非静态初始化块,非静态属性 )

  (6) 子类构造函数

  • 4.类加载器,双亲委派及其优势

如果一个类加载器在接到加载类的请求时,它首先不会自己尝试去加载这个类,而是把这个请求任务委托给父类加载器去完成,依次递归,如果父类加载器可以完成类加载任务,就成功返回。只有父类加载器无法完成此加载任务时,才自己去加载。 本质是:规定了类加载器的顺序是:引导类加载器先加载,若加载不到,由扩展类加载器加载,若还加载不到,才会由系统类加载器或自定义的类加载器进行加载。 双亲委派的优势:1.避免类的重复加载,确保一个类的全局唯一性 Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种关系可以避免类的重复加载,\当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次。

2.保护程序安全,防止核心API被随意篡改

java JVM 内存模型、回收机制、类加载器

java JVM 内存模型、回收机制、类加载器

java JVM 内存模型、回收机制、类加载器

java JVM 内存模型、回收机制、类加载器

java JVM 内存模型、回收机制、类加载器

java JVM 内存模型、回收机制、类加载器

java JVM 内存模型、回收机制、类加载器

转载自:https://juejin.cn/post/7035598078946050084
评论
请登录