文章分类 -  jvm

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