文章分类 - jvm
摘要:目录 1.`String`内存结构位置 2.`String`的拼接操作 1.String内存结构位置 1.Java中的8种基本数据类型以及String,为了使他们在运行过程中更快,更节省内存,都提供了常量池的概念。2.8种基本数据类型是由系统协调的,String类型的常量池主要的使用方法有两种:直接
阅读全文
摘要:目录 1.`String`的基本特性 1.String的基本特性 1.String是使用一对""引起来的字符串。可以通过new或者字面量的方式创建String2.String声明为final的,不可被继承。3.String实现了Serializable接口。表示字符串是支持序列化的。实现了Compa
阅读全文
摘要:目录 1.设置HotSpot 1.设置HotSpot 1.设置采用解释器还是JIT编译器-Xint: 完全采用解释器模式执行程序。-Xcomp: 完全采用即时编译器模式执行程序。如果即时编译出现问题,解释器会介入执行。-Xmixed: 采用解释器和JIT编译器并存的方式共同执行程序。默认模式。2.设
阅读全文
摘要:目录 1.解释器 2.JIT编译器 3.热点代码探测技术 JVM的执行引擎采用了解释器和JIT编译器的方式来执行代码。 1.解释器 2.JIT编译器 1.HotSpot采用解释器与即时编译器并存的架构。2.为什么有了JIT编译器还需要解释器?当JVM虚拟机启动时,解释器可以首先发挥作用,而不必等待即
阅读全文
摘要:目录 1.执行引擎概述 2.执行引擎的工作方式 3.Java代码的编译和执行过程 1.执行引擎概述 1.执行引擎是JVM的一部分。可以看做是JVM的下层。https://blog.csdn.net/u011069294/article/details/1068872202.虚拟机执行引擎是一个软件的
阅读全文
摘要:目录 1.直接内存概述 2.`IO`与`NIO`对比 3.直接内存的`OOM`与内存大小设置 1.直接内存概述 1.直接内存不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。2.直接内存是在Java堆外,直接向系统申请的内存空间3.Java的NIO库允许使用直接内存,用于数据
阅读全文
摘要:目录 1.对象的内存布局 2.对象的访问定位 1.对象的内存布局 1.整体上来看,对象在内存中有3部分,对象头、实例数据、对齐填充。a)对象头包含运行时元数据和类型指针。运行时元数据包含哈希值(这个哈希值就是创建出来的对象在内存中的地址)、GC分代年龄、锁状态标志等。类型指针,指向方法区(元空间)中
阅读全文
摘要:目录 1.创建对象的方式 2.创建对象的步骤 1.创建对象的方式 创建对象的方式有6种。1.通过new关键字。new关键字是通过调用构造方法实现的。2.通过Class的newInstance方法。这是反射的方式,只能调用无参构造器,权限必须是public3.通过Constructor的newInst
阅读全文
摘要:目录 1.方法区的垃圾回收 1.方法区的垃圾回收 1.Java虚拟机规范对方法区是否实现垃圾回收没有做出强制的规定。存在未实现或未能完整实现方法区类型卸载的垃圾回收器(例如JDK 11的zGC收集器)。2.方法区的回收效果比较难令人满意,条件很苛刻,但是回收又是很有必要的。3.垃圾回收主要回收两部分
阅读全文
摘要:目录 1.方法区的演进 2.为什么要用元空间替换永久代? 3.StringTable为什么要放到堆? 1.方法区的演进 1.只有HostSpot虚拟机才有永久代的。JRockit和IBM J9是不存在永久代的。2.JDK6及之前的方法区JDK6及之前,方法区的实现是永久代,静态变量和字符串常量池存放
阅读全文
摘要:目录 1.什么是常量池? 2.为什么需要常量池? 3.运行时常量池 1.什么是常量池? 1.字节码文件中有个constant pool,就是常量池2.当字节码文件被加载到内存中之后,方法区中会存放字节码文件的constant pool相关信息,这时候就成为了运行时常量池3.常量池保存了各种字面量和对
阅读全文
摘要:目录 1.方法区内部结构 2.`non-final`的类变量与`final`的类变量初始化的时间 1.方法区内部结构 Java代码被编译成字节码文件之后,通过类加载器被加载到运行时数据区。其中,方法区主要存储的是类型的相关信息以及运行时常量池。对于字符串常量,根据JDK版本的不同,有的放到了方法区,
阅读全文
摘要:目录 1.方法区内存大小设置 2.如何解决OOM问题?(了解) 1.方法区内存大小设置 1.方法区的大小可以不是固定的,JVM可以根据应用需要自动调整。a)JDK7及以前(了解):-XX:PermSize设置永久代初始大小。-XX:MaxPermSize设置永久代最大可分配空间。(JDK7目前已经很
阅读全文
摘要:目录 1.运行时数据区简单回顾 2.栈、堆、方法区的交互关系 3.方法区的理解 4.HotSpot中方法区的演进过程 1.运行时数据区简单回顾 运行时数据区划分为下图所示的五个部分:从线程共享与否的角度,可以划分为线程共享的堆和元空间。线程私有的是栈区、程序计数器、本地方法栈。1.除了程序计数器,其
阅读全文
摘要:目录 1.代码优化 1.1 栈上分配 1.2 同步省略(锁消除) 1.3 分离对象或标量替换 1.代码优化 使用逃逸分析,编译器可以对代码做如下优化:1.栈上分配:将堆分配转换为栈分配。2.同步省略:一个对象只能被一个线程访问,那么对于这个对象的操作可以不考虑同步。3.标量替换:有的对象有可能不需要
阅读全文
摘要:目录 1.堆是分配对象存储的唯一选择吗? 2.逃逸分析 3.判断是否发生逃逸 1.堆是分配对象存储的唯一选择吗? 不是。如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。 2.逃逸分析 1.什么是逃逸分析?分析一个对象的引用的使用范围
阅读全文
摘要:目录 1.堆空间参数 2.-XX:HandlePromotionFailure 1.堆空间参数 * -XX:+PrintFlagsInitial : 查看所有的参数的默认初始值 * -XX:+PrintFlagsFinal :查看所有的参数的最终值(可能会存在修改,不再是初始值) * 具体查看某个参
阅读全文
摘要:目录 1.为什么要有TLAB(Thread Local Allocation Buffer) 2.什么是TLAB? 3.TLAB的设置 4. TLAB分配过程 1.为什么要有TLAB(Thread Local Allocation Buffer) 1.堆区是线程共享的,任何线程都可以访问堆区中的共享
阅读全文
摘要:目录 1.堆内存分配策略(或对象提升(Promotion)规则) 1.堆内存分配策略(或对象提升(Promotion)规则) 一般情况下的策略:1.对象会被优先分配到Eden区2.大对象,如果Eden区放不下,就会被直接放到老年代3.长期存活的对象(Survivor区中的对象的age超过阈值的对象)
阅读全文
摘要:目录 1.堆分代思想 1.堆分代思想 1.Java将堆区分为了新生代和老年代。新生代又分为了Eden区、Survivor区。老年代存放着经历多次GC仍然存活的对象。2.分代的唯一的理由就是优化GC性能。如果没有分代,那么所有的对象都放在一起,GC的时候需要找到哪些对象没用,这样需要对整个堆区进行扫描
阅读全文