Java虚拟机学习笔记
Java虚拟机的个人学习笔记
syrdbt
这个作者很懒,什么都没留下…
展开
-
Java 自定义类加载器
1.系统类加载器 系统提供的类加载器有如下三种:启动类加载器,扩展类加载器,引用程序类加载器。 1.1启动类加载器 启动类加载器(Bootstrap ClassLoader)负责将存放在 <JRE_HOME>\lib 目录中的,或者被 -Xbootclasspath 参数所指定的路径中的,并且是虚拟机识别的(仅按照文件名识别,如 rt.jar,名字不符合的类库即使放在 li...原创 2019-07-27 10:41:37 · 315 阅读 · 0 评论 -
JVM 的垃圾收集器
JVM 的垃圾收集器:Serial、ParNew 、Parallel Scavenge、Serial Old、Parallel Old、CMS 、G1 。 1.概述 下图中垃圾收集器只要连线则表明垃圾收集器可以搭配使用。没有万能的收集器,具体应用选择合适的垃圾收集器。 2.Serial垃圾收集器 单线程收集器,用于新生代,这里的单线程指的是它在进行垃圾回收时暂停其他工作线程...原创 2019-07-19 09:43:15 · 174 阅读 · 0 评论 -
JVM的垃圾收集(GC)算法
JVM的垃圾收集算法:标记-清除,复制,标记-整理,分代回收。 1.“标记-清除”垃圾收集算法 “标记-清除”垃圾收集算法有两个阶段:标记 和 清除。 标记 是标记所有需要回收的对象,清除 是清除所有标记的回收对象。 缺点: (1)会产生大量不连续的内存碎片,因为对象分配内存需要是连续的内存空间,如果对象太大,且没有足够大的连续内存空间,会触发垃圾回收。 (2)标记 和 清除效...原创 2019-07-15 20:23:14 · 210 阅读 · 0 评论 -
JVM 判断是否应该回收对象
JVM内存 中程序计数器、虚拟机栈、本地方法栈 3个区域随线程而生,随线程而灭。这几个区域不用考虑回收问题,因为方法结束后或者线程结束后,内存就跟着回收了。而Java堆和方法区不一样,一个接口的多个实现类需要的内存不一样,一个方法的多个分支需要的内存也可能不一样,我们只有在程序运行的时候才知道会创建那些对象,这部分内存的分配和回收都是动态的,垃圾收集主要所关注的就是Java堆和方法区。 ...原创 2019-07-01 14:18:40 · 228 阅读 · 0 评论 -
JVM 中对象的内存布局 和 对象访问定位
1.对象的内存布局 对象的内存布局主要包括:对象头(Header)、实例数据(InstanceData)和对齐填充(Padding)。 1.1对象头(Header) 对象头包括:MarkWord和 和类型指针。 MarkWord是对象自身运行时候的对象头数据,例如:哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳。这部分数据在 32位和 64位...原创 2019-06-28 14:50:26 · 311 阅读 · 0 评论 -
JVM虚拟机的类加载
类加载的生命周期:加载、验证、准备、解析、初始化、使用和 卸载 ,一共 7个阶段。 1.概述 在虚拟机的类加载机制中:类型的加载、连接和初始化 都是在程序运行期间完成的。这种策略会使类加载时稍微增加一些性能开销, 但是为 Java 提供了高度的灵活性 , 如 Java 的动态扩展语言特性就是依赖运行期动态加载和动态连接这个特点实现。 举例: 如果编写一个面向接口的应用程序,可...原创 2019-06-26 18:06:36 · 184 阅读 · 0 评论 -
JVM 创建 Java 对象
JVM 创建 Java 对象的流程:类的加载,内存分配、对对象进行必要的设置、执行 <init> 方法初始化。 1.JVM 创建 Java 对象 使用 new 关键字可以创建一个类的对象。 new指令在虚拟机中的执行操作: 类的加载:首先在常量池(方法区中)去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并检查这个符号引用代表的类是否已被加载、解析和...原创 2019-06-25 10:53:25 · 181 阅读 · 0 评论 -
Java虚拟机(JVM)内存结构
Java虚拟机(JVM)执行程序时会将管理的内存分为若干个不同的数据区域,分别为:程序计数器(Program Counter Register)、虚拟机栈(VMStack)、本地方法栈(NativeStack)、堆(Heap)、方法区(MethodArea)。 1.概述 线程共享的数据区:堆(Heap)、方法区(MethodArea)。 线程私有的数据区:程序计数器(Progr...原创 2019-04-21 12:51:32 · 318 阅读 · 0 评论