年份:2018
日期:7-31
对象访问:
使用句柄/直接指针
对比:
句柄访问方式-reference中存放的是稳定的句柄地址,在对象被移动时,只会改变句柄中实例数据指针,而reference本身不需要被修改
直接指针访问方式-速度更快节省了一次指针定位的开销。
Oom:
1java堆溢出
2虚拟机栈和本地方法栈溢出
3运行时常量池溢出
4方法区溢出
5本机直接内存溢出
[
引入计数算法
根搜索算法
]
[
强引用/软引用/弱引用/虚引用
]
在Java语言中,可以作为GC roots的对象包括:
1 虚拟器栈中的引用对象
2 方法区中的类静态引用的对象
3方法区中的常量引用对象
4本地方法栈中jni的引用对象。
永久代垃圾回收主要回收内容-废弃常量/无用的类。
无用类需要满足:
1该类的所有实例都已经被回收
2加载该类的classloader已经被回收
3该类对应的java.lang.class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。
垃圾收集算法
1标记-清除算法
2 复制算法
3标记-整理算法
4 分代收集算法。
日期:7-30
理论内容-jvm
理论知识来源-深入理解java虚拟机[jvm高级特性与最佳实践]
Sun官方定义的java技术体系:
java技术体系
1 java程序涉及语言
2 各种硬件平台的java虚拟机
3 class文件格式
4 java api类库
5 来自商业机构和社区的第三方类库
运行时-数据区域
栈帧是方法运行期间基础数据结构
本地方法栈:
1 StackOverFlowError
2 OutOfMemoryError
java堆:被所有线程共享,在虚拟机启动被创建-存放对象示例
方法区: 是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编辑后的代码等数据。主要目标-针对常量池的回收/类型的卸载
运行时常量池:-方法区的一部分,(常量池:)用于存放编译期生成的各种字面量和符号引用,这部分内容在类加载后存放到方法区中的运行时常量池