![](https://img-blog.csdnimg.cn/direct/dc1ecc66ce914091a5e7da03df4b7a72.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
深入理解Java虚拟机
文章平均质量分 78
深入理解Java虚拟机
技术分子
用简洁方式表达
展开
-
JVM学习总结目录
JVM1.编译器和解释器。为啥将 .java 文件编译为.class文件?2..class文件结构和内容。.java文件如何对应.class文件?3.内存加载.class文件过程。加载每步内容和时机?4.JVM 内存结构。 .class内容如何存储? 5.JVM 内存回收机制 。JVM内存那些地方需要回收?6.字节码执行引擎。7.JVM优化...原创 2020-05-22 08:58:06 · 275 阅读 · 1 评论 -
JVM学习总结——一、编译原理(为啥将 .java 文件编译为.class文件?)
百度百科解释:JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。一句话:JVM只能加载符合规范的字节码文件(.class)。原创 2020-05-26 08:50:05 · 714 阅读 · 1 评论 -
JVM学习总结——二、class文件结构(java文件与class文件对应关系如何?)
例子:CA FE BA BE 00 00 00 34 00 25 0A 00 09 00 14 0900 15 00 16 08 00 17 0A 00 18 00 19 08 00 1A 0800 1B 08 00 1C 07 00 1D 07 00 1E 01 00 06 3C 696E 69 74 3E 01 00 03 28 29 56 01 00 04 43 6F 6465 01 00 0F 4C 69 6E 65 4E 75 6D 62 65 72 54 6162 6C 6...原创 2020-05-27 12:49:13 · 376 阅读 · 1 评论 -
JVM学习总结——三、类加载器(如何加载.class文件和时机?)
字节码(.class)文件如何加装到JVM中?JVM加载class文件的原理机制什么是类加载器?类加载器(ClassLoader)就是在系统运行过程中动态的将字节码文件加载到 JVM 中的工具,是一个类。基于这个工具的整套类加载流程,我们称作类加载机制。我们在 IDE 中编写的都是源代码文件,以后缀名为 .java 的文件形式存在于磁盘上,通过编译后生成后缀名为 .class 的字节码文件,ClassLoader 加载的就是这些字节码文件。有哪些类加载器?Java 默认提供了三个 Class原创 2020-05-28 18:03:51 · 1048 阅读 · 1 评论 -
JVM学习总结——四、JVM内存结构
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;-XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。-server选项下默认MaxPermSize为64m,-client选项下默认MaxPermSize为32mJVM在client模式默认-Xms是1M,-Xmx是64MJVM在Server模式默认-Xms是128原创 2018-01-23 11:41:18 · 403 阅读 · 1 评论 -
JVM学习总结——五、JVM内存常见回收算法
那些内存需要回收?Java堆和方法区(废弃常量,无用的类)什么时候回收?用可达算法判断两次标记后如何回收?需要根据jvm垃圾收集器算法回收。jvm垃圾收集器以及使用的回收算法回收算法1.标记-清除算法(Mark-Sweep) 标记-清除算法是最基础收集算法。(适合回收老年代)。 不足之处:1.效率低因为需要先标记再清除。 2原创 2018-01-23 14:19:04 · 228 阅读 · 1 评论 -
JVM学习总结——六、JVM中垃圾回收器介绍
垃圾收集器Serial收集器:(搭配 CMS,Serial Old)单线程串行收集器。新生代采用复制算法,老年代采用标记-整理算法。它在进行垃圾收集工作的时候必须暂停其他所有的工作线程( "Stop The World" ),直到它收集结束。Serial收集器由于没有线程交互的开销,自然可以获得很高的单线程收集效率。ParNew收集器:(搭配 CMS,Serial Old)是Serial收集器多线程版本。Parallel Scavenge收集器:(搭配 Serial Old,Parall原创 2020-06-11 16:12:51 · 412 阅读 · 1 评论 -
JVM学习总结——七、JVM GC回收触发条件
一、Minor GC是什么时候触发的? new 出来的对象(除大对象外)直接在年轻代中的Eden区进行分配,如果Eden区域没有足够的空间, 那么就会触发YGC(Minor GC),YGC处理的区域只有新生代。 二、对象如何进入老年代? 1. 由-XX:PretenureSizeThreshold启动参数控制,若对象大小大于此值,就会绕过新生代, 直接在老年代中分配。 2. YGC时,To Surviv...原创 2020-06-12 15:39:13 · 751 阅读 · 1 评论 -
JVM学习总结—— 八、JVM中G1具体回收过程
G1垃圾收集器创建对象分配策略1. TLAB(Thread Local Allocation Buffer) 线程本地分配缓冲区2. Eden区中分配3. Humongous区分配Humongous:如果一个对象占用的空间超过了分区容量50%以上,G1收集器就认为这是一个巨型对象。这些巨型对象,默认直接会被分配在年老代,但是如果它是一个短期存在的巨型对象,就会对垃圾收集器造成负面影响。为了解决这个问题,G1划分了一个Humongous区,它用来专门存放巨型对象。如果一个H区装不下一个巨型对原创 2020-06-10 09:58:57 · 1224 阅读 · 1 评论 -
JVM学习总结——九、JVM中如何创建对象及内存分配过程
创建对象:当java虚拟机遇到new 指令时。 首先检查指令参数能否在常量池中定位到一个类的引用、加载、解析、初始化。 如果没有那必须先执行相应的类加载过程。指针碰撞:使用过的内存被分到一边,空闲内存放到另一边。中间放着一个指针作为分解点指示器。指针移动来分配。 仅通过指针移动位置分配对象,并发情况会出现线程不安全,两种解决方案: 1.分配内存空间动作进行同步处...原创 2020-06-05 09:47:50 · 217 阅读 · 1 评论 -
JVM学习总结——十、JVM与synchronize锁
jvm中有以下三种锁(由上到下越来越“重量级”):偏向锁轻量级锁重量级锁其中重量级锁是最初的锁机制,偏向锁和轻量级锁是在jdk1.6加入的,可以选择打开或关闭。如果把偏向锁和轻量级锁都打开,那么在java代码中使用synchronized关键字的时候,jvm底层会尝试先使用偏向锁,如果偏向锁不可用,则转换为轻量级锁,如果轻量级锁不可用,则转换为重量级锁。这3种锁需要了解对象的内存结构(MarkWord头),会涉及到字节码的内部存储格式,需要了解两个大体的概念:对象头包含两部分:1.M原创 2020-06-11 18:20:56 · 435 阅读 · 1 评论 -
JVM学习总结——十一、JVM的JIT
JIT的全称是Just in time compilation,中文称之为即时编译。JIT编译器作用当虚拟机发现某个方法或代码块运行特别频繁时,就会把这些代码认定为 Hot Spot Code 热点代码,为了提高热点代码的执行效率,在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各层次的优化。为什么引入JIT?通常Javac将程序源码编译,转换成java字节码,JVM通过解释字节码将其翻译成相应的机器指令,逐条读入,逐条解释翻译。经过解释运行,其运行速度必定会比可运行的二进原创 2020-05-26 18:53:39 · 792 阅读 · 1 评论 -
JVM学习总结——十二、JVM一次调优优化过程
问题:最近接触一个项目,项目恢复测试时发现3次下单2次超时。这就比较恐怖了,业务方之间反馈出来了,通过排查日志发现一个组装参数的方法耗时大概300~500ms,现在的RPC接口肯定不能接受。排查方式:通过观察Young GC 发现一次300多ms,时间也正好吻合。机器配置 2C4G每次FullGC后,内存都能回到某一个值可以排除内存泄漏的情况解决方式:对垃圾回收器进行参数调优,调优过程发现程序处理问题的复杂度不同参数也需要微调。最主要的是当程序足够复杂,JVM参数调优是不明显原创 2020-05-15 17:02:36 · 1178 阅读 · 1 评论