JVM中的内存分配及GC回收过程简单整理
b站jvm视频
可能是把Java内存区域讲的最清楚的一篇文章
史上最全Java面试266题:算法+缓存+TCP+JVM+搜索+分布式+数据库
JVM架构和GC垃圾回收机制(JVM面试不用愁)
GUAVA collection utils官方文档
Google Guava中文文档
大牛整理的各种知识点详解
Collections 工具类和 Arrays 工具类常见方法
Java 并发进阶常见面试题总结
StopTheWorld的触发
Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起
(除了垃圾收集帮助器之外)。Java中一种全局暂停现象,全局停顿,所有Java代码停止,native代码可以执行,
但不能与JVM交互;这些现象多半是由于gc引起。
幸存区对象进入老年区的条件
为了更好的适应不同程序的内存情况,虚拟机不是永远要求对象年龄必须达到了某个值才能进入老年代,如果
Survivor 空间中相同年龄所有对象大小的总和大于 Survivor 空间的一半,年龄大于或等于该年龄的对象就可以
直接进入老年代,无需达到要求的年龄。
判断对象已经死亡
1. 引用计数法:这个方法实现简单,效率高,但存在对象引用循环的问题。
给对象中添加一个引用计数器,每当有地放引用他,计数器就加一;当引用失效,计数器就减一,
当计数器为0时,就代表该对象已经死亡不再被引用了。
新生代中为什么要分为Eden和Survivor
因为若是没有survivor区,每次minorGC 幸存的对象直接进入老年区的话,老年区很快会被填满。
紧接着就是触发fullGC,而fullGC会消耗大量的时间,因为老年区比新生代的内存大得多。降低执行速度。
类加载进内存
1、加载
将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入口,这个过程需要类加载器参与。
2、连接
验证:确保Class文件中字节流包含的信息是否符合虚拟机的要求,保证不会危害虚拟机自身的安全
准备:正式为类变量(static变量)分配内存并设置类变量初始值的阶段,这些内存都将在方法区中进行分配
解析:虚拟机将常量池中的符号引用替换为直接引用的过程
3、初始化
当使用new创建一个对象时,jvm会在堆中分配一个内存存放该对象。
一个类通过类加载器把一个类的二进制文件加载进方法区,也就是说方法区存放类的信息,类信息包括:类的版本、字段、方法、接口等描述。
常量池是类信息的一部分,主要存放俩大类常量:字面量和符号引用量。
字面量就是:
final修饰的变量和字符串常量,
符号引用量是:
类和接口的全限定名 字段名称和描述符 方法名称和描述符.
运行时常量池是方法区的一部分,虚拟机加载class文件后把常量池中的数据存放到运行时常量池中。