
JVM
叶落雨飘
emmmmm 我是一只小萌新~
展开
-
[JVM学习之路]十五、详解经典的七种垃圾回收器
垃圾回收器一、GC分类与性能指标1.GC分类垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。1.线程数按线程数分:可以分为串行垃圾回收器和并行垃圾回收器串行回收串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。在诸如单CPU处理器或者较小的应用内存等硬件平原创 2020-08-07 21:59:22 · 677 阅读 · 1 评论 -
[JVM学习之路]十四、垃圾回收相关概念及JVM的引用(面试考点)
垃圾回收相关概念一、对System.gc()的理解在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(无法保证马上触发GC)。JVM实现者可以通过system.gc()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。在一些特殊情况下,比原创 2020-08-06 21:59:03 · 250 阅读 · 0 评论 -
[JVM学习之路]十三、垃圾回收相关算法及思想(重要)
垃圾回收相关算法垃圾回收有两个阶段,一个标记阶段,一个清除阶段;标记阶段使用的算法是引用计数算法和可达性分析算法;清除阶段使用的算法是标记-清除算法、复制算法和标记-压缩算法一、标记:引用计数算法1.对象存活判断在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。如果一个对象不再被任何的存活对象继续引用时,就可以原创 2020-08-05 21:59:46 · 338 阅读 · 0 评论 -
[JVM学习之路]十二、垃圾回收概述及相关大厂面试题
垃圾回收概述大厂面试题-垃圾回收蚂蚁金服:你知道哪几种垃圾回收器,各自的优缺点,重点讲一下 cms和g1一面: JVM GC算法有哪些,目前的JDK版本采用什么回收算法一面: G1回收器讲下回收过程GC是什么?为什么要有GC?一面: GC的两种判定方法? CMS收集器与G1收集器的特点。百度:说一下GC算法,分代回收说下垃圾收集策略和算法天猫:一面: jvm GC原理,JVM怎么回收内存一面: CMS特点,垃圾回收算法有哪些?各自的优缺点,他们共同的缺点是什原创 2020-08-04 18:25:47 · 209 阅读 · 0 评论 -
[JVM学习之路]十一、StringTable(字符串常量池)的基本特性、内存分配和字符串拼接、intern()方法使用及相关面试题
StringTable(字符串常量池)一、String的基本特性String:字符串,使用一对""引起来表示。String sl = “hello”;//字面量的定义方式;String s2 = new String(“hello”) ;String类是已经被声明为final的, 不可被继承String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小String在jdk8及以前内部定义为“priva原创 2020-08-03 21:36:23 · 316 阅读 · 1 评论 -
[JVM学习之路]十、执行引擎及相关概念
执行引擎一、执行引擎概述执行引擎在执行的过程中究竟需要执行什么样的字节码指令完全依赖于PC寄存器。每当执行完一项指令操作后,PC寄存器就会更新下一条需要被执行的指令地址。当然方法在执行的过程中,执行引擎有可能会通过存储在局部变量表(栈)中的对象引用准确定位到存储在Java堆区中的对象实例信息。元数据定位目标对象的类型信息。(对象头中的元数据指针指向方法区引用的对象类型,通过局部变量表定位对象实例信息。)从外观上来看,所有的Java虚拟机的执行引擎输入、输出都是一致的:输入的是字节码二进制流原创 2020-08-03 18:15:21 · 209 阅读 · 0 评论 -
[JVM学习之路]九、直接内存
直接内存一、直接内存概念直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。直接内存是Java堆外的、直接向系统申请的内存区间。通过存在堆中的DirectByteBuffer操作Native内存。访问直接内存的速度会优于Java堆。即读写性能高。出于性能考虑,读写频繁的场合可能会考虑使用直接内存Java的NIO库允许Java程序使用直接内存,用于数据缓冲区二、直接缓冲区与非直接缓冲区区别io读写速度要小于直接内存读写三、直接内存参数设置直原创 2020-08-02 18:19:55 · 217 阅读 · 0 评论 -
[JVM学习之路]八、对象实例化内存分布与访问定位
对象实例化内存分布与访问定位一、对象的实例化具体执行步骤可以分为6步1.判断对象对应的类是否已经加载、链接、初始化虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。( 即判断类元信息是否存在)。如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为Key进行查找对应的.class文件。如果没有找到文件,则抛出ClassNotFoundExceptio原创 2020-08-02 17:43:01 · 318 阅读 · 0 评论 -
[JVM学习之路]七、方法区的内存结构、演变细节和垃圾回收
方法区一、栈、堆、方法区的的交互关系二、方法区相关理解方法区别名”Non-Heap“非堆,被看做是一块独立于Java堆的内存空间1.方法区特点方法区(Method Area)与Java堆一样,是各个线程共享的内存区域方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang原创 2020-08-01 17:30:48 · 226 阅读 · 0 评论 -
[JVM学习之路]五、堆(二)对象分配逃逸分析相关内容
堆(二)对象分配逃逸分析相关内容提问:堆是分配对象的唯一选择吗?初步结论:如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。栈上分配无序GC,随方法结束而弹栈,以此达到降低GC的回收频率和提升GC的回收效率的目的。一、逃逸分析对象是否发生逃逸,需要分析对象的动态作用域:如果一个对象在方法中被定义后,对象只在方法内部使用,则被认为没有发生逃逸如果一个对象在原创 2020-07-31 17:45:43 · 162 阅读 · 0 评论 -
[JVM学习之路]四、本地方法接口概念
四、本地方法接口简单来讲,一个Native Method就是一个java调用非java代码的接口一个Native Method 是这样一个java方法:该方法的底层实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。定义一个native方法时,用native关键字修饰,但是不能和abstract搭配。没有具体实现体public class IHaveNatives {原创 2020-07-27 21:06:06 · 161 阅读 · 0 评论 -
[JVM学习之路]五、堆(一)堆的内存结构、参数设置、分代思想、内存分配策略及TLAB
堆(一)一、堆的核心概述堆的特点:1.一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域2.Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间(堆内存的大小是可以调节的)3.《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。4.所有的线程共享java堆,在这里还可以划分线程私有的缓冲区(TLAB:Thread Local Allocation Buffer).(面试问题:堆空间一定是所有线程共享的原创 2020-07-27 20:59:04 · 569 阅读 · 0 评论 -
[JVM学习之路]三、运行时数据区的内部结构详解(一)(程序计数器、虚拟机栈和本地方法栈)
运行时数据区的内部结构(程序计数器、虚拟机栈和本地方法栈)一、运行时数据区结构图源-阿里JDK8以后,原来的方法区变成了元数据区+JIT编译产物在JVM运行的时候,有些区是随着进程而存在消亡,而有些是随着线程在图中红色的方法区和堆是随着JVM的生命而创建和消亡,也就是对应着JVM进程,是进程中所有的线程所共有的;而图中灰色区域则是与使用的线程进行一一对应,是每个线程所私有的。也就是说,每个线程独立享有:程序计数器,本地方法栈,虚拟机栈;而所有线程共享的是堆和堆外内存(元空间)调优都是在元原创 2020-07-26 17:32:18 · 396 阅读 · 0 评论 -
[算法练习-剑指offer]题15.翻转链表(Java)
题目题号:15题目名:反转链表编程语言Java题目描述输入一个链表,反转链表后,输出新链表的表头。初次思路将最后一个位置定下来,将前面的值逐个插入到最后这个位置的后面比如 12345->2345 1->345 2 1->45 3 2 1-> 5 4 3 2 1解题代码public class Solution { public ListNode ReverseList(ListNode head) { //思路,将前面的结点插到后面来完成原创 2020-07-24 21:38:39 · 113 阅读 · 0 评论 -
[JVM学习之路]二、认识类加载子系统,了解类加载过程、类加载器分类和几个重要机制
类加载子系统一、类加载子系统简介类加载器子系统分为三个阶段:加载阶段链接阶段初始化阶段1.类加载子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识(16进制CA TE BA BE);2.ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine来决定3.加载后的Class类信息存放于一块成为方法区的内存空间。除了类信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量原创 2020-07-24 17:01:06 · 190 阅读 · 0 评论 -
[JVM学习之路]一、初识JVM,了解其结构、模型及生命周期
JVM入门简介一、JVM位置JVM是运行在操作系统之上的,与硬件之间没有直接的联系二、JVM的整体结构方法区和堆是所有线程所共享Java栈(jvm虚拟机栈)、本地方法栈和程序计数器是运行时每个线程所独立拥有的三、JVM的架构模型javap -v #反编译Java编译器的指令是基于栈的指令集架构;另一种是基于寄存器的指令集架构由于不同平台的CPU不同,所以不能设计成基于寄存器的。基于栈优点: 1.跨平台 2.指令集小,编译器容易实现缺点: 1.性能下降,实现同样功能原创 2020-07-24 16:52:47 · 129 阅读 · 0 评论