jvm
文章平均质量分 91
TofuCai
代码是思想的具体体现
展开
-
jvm深度学习(18):类加载器和双亲委派机制
类加载器前面说过类加载,而执行这个任务的就是类加载器,类加载主要做五件事:加载、验证、准备、解析、初始化。JDK为我们提供了三层类加载器分别是:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extention ClassLoader)、应用程序类加载器(Application ClassLoader)。除了这三种还有自定义类加载器(Custom ClassLoader),支持一些个性化的扩展功能。启动类加载器Bootstrap ClassLoader,他处..原创 2020-08-09 09:32:53 · 210 阅读 · 0 评论 -
jvm深度学习(17):类加载过程及触发类初始化的场景验证
前言:你可以不知道JVM的内存结构,但你一定要记住类加载,因为面试他真的会问,而且他确实对我们编码能力提升确实有帮助。鄙人尽量用简单的话,让各位看官憋尿。一个类的醉生梦死 千言万语不如一张图生动...原创 2020-08-02 00:25:39 · 388 阅读 · 0 评论 -
jvm深度学习(16):JVM之自动装箱拆箱
JVM之自动装箱拆箱提问:jvm中如何进行进行装箱拆箱操作?装箱拆箱先写个示例代码:package com.imooc.firstappdemo.jvm;public class TofuCaiInteger { public static void main(String[] args) { int icount = 8; Integer integerCount = 19; icount = icount * in..原创 2020-07-30 19:45:52 · 493 阅读 · 0 评论 -
jvm深度学习(15):JVM之异常处理机制try、catch、finally
提问:异常在JVM是怎么处理的? 如果写了try{}catch(){}finally{},又是怎么执行的?代码的真理永远存在于字节码show code1:package com.imooc.firstappdemo.jvm;public class TofuCaiExection { public static void main(String[] args) { int i = 0; }}反汇编:主要看 红框内main...原创 2020-07-30 17:58:27 · 424 阅读 · 0 评论 -
jvm深度学习(14):GC 常用参数
GC 常用参数-Xmn -Xms -Xmx –Xss 年轻代 最小堆 最大堆 栈空间 -XX:+UseTLAB 使用 TLAB,默认打开-XX:+PrintTLAB 打印 TLAB 的使用情况-XX:TLABSize 设置 TLAB 大小-XX:+DisableExplicitGC 启用用于禁用对的调用处理的选项 System.gc()-XX:+PrintGC 查看 GC 基本信息-XX:+PrintGCDetails 查看 GC 详细信息-XX:+PrintHeapAtGC 每次一次 GC原创 2020-07-29 17:14:02 · 424 阅读 · 0 评论 -
jvm深度学习(13):简述低延迟的垃圾回收器,怎样读GC日志
低延迟的垃圾回收器 传统的垃圾回收器一般情况下 内存占用、吞吐量、延时 只能同时满足两个。但是现在的发展,延迟这项的目标越来越重要。所以就有低延迟的垃圾回 收器。Eplison JAVA11新的垃圾回收器,是一个“不干活”的垃圾回收器,负责堆的管理与布局、对象的分配、与解释器的协作、与编译器的协作、与监控子系统协作等职责,主要用于需要剥离垃圾收集器影响的性能测试和压力测试。ZGC 有类似于 G1 的 Region,但是没有分代。标志...原创 2020-07-29 17:10:17 · 197 阅读 · 0 评论 -
jvm深度学习(12):G1中的技术细节、安全点与安全区域
G1 中的技术细节前言:前面在JVM中常见的垃圾回收器章节对G1有过详细的描述。我们知道G1为了解决STW问题,使用了“化整为零”的思想。将堆内存分割小块的region,每个region根据需要,可以是Eden区或者Survivor或者老年代区。G1根据区域的不同,用不同的策略进行垃圾回收。问题 虽然这种“化整为零”很好的解决了STW问题,但是随着内存区域的颗粒化,再加上G1内存区域的不固定(回收前Eden,但由于都处于强引用,回收不了,直接变为Survivor,更有甚者...原创 2020-07-28 00:04:27 · 513 阅读 · 0 评论 -
jvm深度学习(11):GC并发标记之三色标记及漏标问题
三色标记概念叙述 在三色标记法之前有一个算法叫Mark-And-Sweep(标记清除)。这个算法会设置一个标志位来记录对象是否被使用。最开始所有的标记位都是 0,如果 发现对象是可达的就会置为 1,一步步下去就会呈现一个类似树状的结果。等标记的步骤完成后,会将未被标记的对象统一清理,再次把所有的标记位设置成 0方便下次清理。 这个算法最大的问题是 GC 执行期间需要把整个程序完全暂停,不能异步进行 GC 操作。因为在不同阶段标记清扫法的标志位 0 和 1 有不同的含义...原创 2020-07-27 22:56:26 · 4289 阅读 · 5 评论 -
jvm深度学习(10):JVM 中常见的垃圾回收器
前言: 在新生代中,每次垃圾回收时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成回收。 而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记—清理”或者“标记—整理”算法来进行回收。以下是各垃圾回收器之间的关系:注意:图中CMS与Serial无关系,已打马赛克。Oracle 官方也有对应英文解释 https://docs.oracle.com/en/java/javase/13/gctuning/ergonomics.h原创 2020-07-25 23:25:47 · 617 阅读 · 0 评论 -
jvm深度学习(9):垃圾回收机制及算法
垃圾回收基础知识什么是 GC?Java 与 C++等语言最大的技术区别:自动化的垃圾回收机制(GC)为什么要了解 GC 和内存分配策略1、面试需要。。。2、GC 对应用的性能是有影响的;3、写代码有好处栈:栈中的生命周期是跟随线程,所以一般不需要关注堆:堆中的对象是垃圾回收的重点方法区/元空间:这一块也会发生垃圾回收,不过这块的效率比较低,一般不是我们关注的重点。分代回收理论当前商业虚拟机的垃圾回收器,大多遵循“分代收集”的理论来进行设计,这个理论大体上是这么描述的:1、原创 2020-07-25 22:21:25 · 189 阅读 · 0 评论 -
jvm深度学习(8):JVM对象的分配策略
栈上分配 即方法中的对象没有发生逃逸。 逃逸分析的原理:分析对象动态作用域,当一个对象在方法中定义后,它可能被外部方法所引用。 比如:调用参数传递到其他方法中,这种称之为方法逃逸。甚至还有可能被外部线程访问到,例如:赋值给其他线程中访问的变量,这个称之为线程逃逸。 从不逃逸到方法逃逸到线程逃逸,称之为对象由低到高的不同逃逸程度。 如果确定一个对象不会逃逸出线程之外,那么让对象在栈上分配内存可以提高 JVM 的效率。代码示例:p...原创 2020-07-25 14:21:28 · 267 阅读 · 0 评论 -
jvm深度学习(7):JVM 中对象的创建过程、内存布局、访问定位、判断对象存活算法、四种引用、Finalize 方法
前言:本文分别从JVM 中对象的创建过程、对象的内存布局、对象的访问定位、判断对象的存活、四大引用5个方面来讲述。JVM 中对象的创建过程提问:对象在jvm中到底是怎么创建出来的?图解:1)检查加载 当JVM遇到一条字节码new指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用(符号引用 :符号引用以一组符号来描述所引用的目标),并且检查类是否已经被加载、解析和初始化过。如果该类没有没有加载过,将会抛出异常。2)分配内存 如果...原创 2020-07-25 13:33:51 · 248 阅读 · 0 评论 -
jvm深度学习(6):实例代码运行JVM内存处理全流程、堆的垃圾回收、栈优化技术
实例代码运行JVM内存处理全流程提问:当一个实例在运行时我们的JVM究竟发生了什么?先写个代码,然后运行public class JVMObject { public final static String MAN_TYPE = "man"; // 常量 public static String WOMAN_TYPE = "woman"; // 静态变量 public static void main(String[] args)throws Exceptio...原创 2020-07-24 20:32:44 · 244 阅读 · 0 评论 -
jvm深度学习(5):常量池与String
本文分静态常量池、运行时常量池和字符串常量池三个方面去分析。 先提一句,对于字符串常量池官方从未给过任何关于其的定义,不知从哪来,也不知哪去,有各种对其的争议,有人说它属于运行时常量池,也有人说他是和运行时常量池并行的一个常量池。本文对其单独拿出来讲解,并不对争议进行站队,没有必要,更没有意义。静态常量池(又称Class常量池) 在 class 文件中除了有类的版本、字段、方法和接口等描述信息外,还有一项信息是常量池 (Constant P...原创 2020-07-22 18:05:56 · 257 阅读 · 0 评论 -
jvm深度学习(4):java方法的运行与程序计数器
程序计数器:较小的内存空间,当前线程执行的字节码的行号指示器;各线程之间独立存储,互不影响。程序计数器是一块很小的内存空间,主要用来记录各个线程执行的字节码的地址,例如,分支、循环、跳转、异常、线程恢复等都依赖于计数器。由于 Java 是多线程语言,当执行的线程数量超过 CPU 核数时,线程之间会根据时间片轮询争夺 CPU 资源。如果一个线程的时间片用完了,或者是其它原因导致这个线程的 CPU 资源被提前抢夺,那么这个退出的线程就需要单独的一个程序计数器,来记录下一条运行的指令。因为 JVM 是虚原创 2020-07-19 16:09:08 · 340 阅读 · 0 评论 -
jvm深度学习(3):java方法的运行与虚拟机栈
方法的执行虚拟机栈是线程运行 java 方法所需的数据,指令、返回地址。其实在我们实际的代码中,一个线程是可以运行多个方法的。 比如:这段代码很简单,就是起一个 main 方法,在 main 方法运行中调用 A 方法,A 方法中调用 B 方法,B 方法中运行 C 方法。我们把代码跑起来,线程 1 来运行这段代码, 线程 1 跑起来,就会有一个对应 的虚拟机栈,同时在执行每个方法的时候都会打包成一个栈帧。 比如 main 开始运行,打包一个栈帧送入到虚拟机栈。执行main方法执行A(原创 2020-07-18 17:35:09 · 262 阅读 · 0 评论 -
jvm深度学习(2): jvm的内存区域
前言: JVM 能涉及非常庞大的一块知识体系,比如内存结构、垃圾回收、类加载、性能调优、JVM 自身优化技术、执行引擎、类文件结构、监控工具等。 但是在所有的知识体系中,都或多或少跟内存结构有一定的关系。比如垃圾回收回收的就是内存、类加载加载到的地方也是内存、性能优化也涉及到内存优化、执行引擎与内存密不可分、类文件结构与内存的设计有关系,监控工具也会监控内存。所以内存结构处于 JVM 中核心位置。也是属于我们入门 JVM 学习的最好的选择。 同时 JVM 是一个...原创 2020-07-18 12:04:34 · 268 阅读 · 0 评论 -
jvm深度学习(1):基础知识
jvm基础知识1 JVM 从编译到执行1.1 java程序的执行过程 一个 Java 程序,首先经过 javac 编译成 .class 文件,然后 JVM 将其加载到方法区,执行引擎将会执行这些字节码。执行时,会翻译成操作系统相 关的函数。JVM 作为 .class 文件的翻译存在,输入字节码,调用操作系统函数。过程如下:Java 文件->编译器>字节码->JVM->机器码。 JVM 全称 Java Virtual Machine,也就是我们耳...原创 2020-07-18 10:45:57 · 248 阅读 · 0 评论