JVM
m0_46493091
不废现在,不惧未来
展开
-
JVM七大垃圾回收器下篇G1(Garbage First)【尚】
文章目录G1回收器:区域化分代式为什么名字叫做Garbage First (G1)呢?G1垃圾回收器优势G1缺点G1参数设置G1回收器的常见操作步骤G1适用场景分区region,化整为零G1回收器垃圾回收过程记忆集与写屏障G1回收过程详解过程1年轻代GC过程2年轻代GC+并发标记过程过程3混合回收过程4Full GCG1回收器优化建议7种经典的垃圾回收器总结怎么选择垃圾回收器关于面试G1回收器:区域化分代式既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First (G1)GC?原创 2020-08-21 21:41:33 · 227 阅读 · 0 评论 -
JVM七大垃圾回收器上篇Serial、ParNeW、Parallel Scavenge、 Serial Old、 Parallel Old、 CMS、 G1【尚】
JVM并没有明确指出要使用哪种垃圾回收器,也就是说可以使用不同厂商,不同版本的垃圾回收器。文章目录评估GC的性能指标吞吐量暂停时间高吞吐与低暂停对比经典垃圾回收器发展7款经典的垃圾收集器7款经典的垃圾收集器与垃圾分代之间的关系垃圾收集器的组合关系Serial回收器:串行回收Serial Old收集器Serial回收器的优势Serial回收器总结ParNew回收器:并行回收ParNew收集器效率Parallel回收器:吞吐量优先Parallel Old收集器Parallel垃圾回收器参数配置CMS回收器:原创 2020-08-21 19:56:24 · 393 阅读 · 0 评论 -
Java四种引用总结,强引用、软引用、弱引用、虚引用【尚】
文章目录JVM引用强引用: 不回收软引用: 内存不足即回收弱引用: 发现即回收虚引用: 对象回收跟踪终结器引用JVM引用我们希望能描述这样一类对象: 当内存空间还足够时,则能保留在内存中;如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象。【既偏门又非常高频的面试题】强引用、软引用、弱引用、虚引用有什么区别?具体使用.场景是什么?在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference) 、弱引原创 2020-08-21 13:26:20 · 198 阅读 · 0 评论 -
JVM垃圾回收安全点Safe Point【尚】
GC安全点程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点(Safepoint) ”Safe Point的选择很重要,如果太少可能导致GC等待的时间太长,如果太频繁可能导致运行时的性能问题。大部分指令的执行时间都非常短暂,通常会根据“是否具有让程序长时间执行的特征”为标准。比如:选择些执行时间较长的指令作为Safe Point, 如方法调用、循环跳转和异常跳转等。如何在GC发生时,检查所有线程都跑到最近的安全点停顿下来呢?抢先式中断: (原创 2020-08-21 11:06:27 · 187 阅读 · 0 评论 -
JVM垃圾回收的并行与并发【尚】
文章目录程序的并行和并发并发并行二者对比垃圾回收的并发与并行程序的并行和并发一皇两后是并发,两皇一后是并行并发在操作系统中,是指一个时间段中有几个程序都处于己启动运行到运行完毕之间,且这几个程序都是在同一个处理器_上运行。并发不是真正意义上的“同时进行”,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行。并行当系统有一个以上CPU时,当一个CPU执行一个进程时原创 2020-08-21 11:03:28 · 337 阅读 · 0 评论 -
JVM-STW-stop the world
Stop一the一World,简称STW,指的是Gc事件发生过程中,会产生应用程序的停顿。停顿产生时整个应用程序线程都会被暂停,没有任何响应,有点像卡死的感觉,这个停顿称为STW。➢可达性分析算法中枚举根节点(GC Roots)会导致所有Java执行线程停顿。.停顿的原因分析工作必须在一个能确保一致性的快照中进行一致性指整个分析期间整个执行系统看起来像被冻结在某个时间点上如果出现分析过程中对象引用关系还在不断变化,则分析结果的准确性无法保证例子被STW中断的应用程序线程会在原创 2020-08-21 10:34:25 · 164 阅读 · 0 评论 -
Java垃圾回收System.gc()的理解
System.gc()无法保证GC一定执行在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。JVM实现者可以通过system.gc()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(无法保证马上触发GC)。代码实例通过原创 2020-08-21 10:19:58 · 337 阅读 · 0 评论 -
JVM内存溢出与内存泄漏【尚】
文章目录内存溢出(OOM)内存泄漏(Memory Leak)内存溢出相对于内存泄漏来说,尽管更容易被理解,但是同样的,内存溢出也是引发程序崩溃的罪魁祸首之一。由于GC一直在发展,所有一般情况下,除非应用程序占用的内存增长速度非常快,造成垃圾回收已经跟不上内存消耗的速度,否则不太容易出现OOM的情况。大多数情况下,GC会进行各种年龄段的垃圾回收,实在不行了就放大招,来一次独占式的Full GC操作,这时候会回收大量的内存,供应用程序继续使用。javadoc中对OutOfMemoryError的解释是原创 2020-08-21 10:16:37 · 125 阅读 · 0 评论 -
JVM垃圾回收算法详解【尚】
文章目录垃圾标记阶段引用计数法 (java没有采用)可达性分析算法GC Roots对象的finalization机制对象是否"死亡"?垃圾清除阶段标记-清除算法复制算法标记-压缩(整理,Mark-Compact)算法三种算法的对比混合算法分代收集算法增量收集算法分区算法G1回收器垃圾标记阶段对象存活判断:在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间原创 2020-08-20 22:22:46 · 100 阅读 · 0 评论 -
JVM垃圾回收概述【尚】
什么是垃圾什么是垃圾( Garbage) 呢? ➢垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。 ➢外文: An object is considered garbage when it can no longer be reached from any pointer in the runningprogram.如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。垃圾收集,.原创 2020-08-20 11:10:19 · 113 阅读 · 0 评论 -
字符串常量池,intern面试题,新特性【尚】
文章目录String的基本特性String-不可变的字符序列String底层是不会扩容的HashTableString的内存分配字符串拼接操作普通常量拼接变量的拼接、StringBuilder原理final常量拼接拼接"+"操作与append的效率对比new String("ab")会创建几个对象?new String("ab")会创建几个对象?new String("a") + new String("b")呢?intern()经典面试题扩展intern练习题1:intern练习题2:intern()效率原创 2020-08-20 08:46:39 · 227 阅读 · 1 评论 -
JVM--执行引擎【转】
1.执行引擎是Java虚拟机的核心组成部分之一2.虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的。而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。3.JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM锁识别的字节码指原创 2020-08-18 22:24:12 · 144 阅读 · 0 评论 -
JVM--原空间直接内存
1.直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。2.直接内存是Java堆外的、直接向系统申请的内存区间。3.简单理解: java process memory = java heap + native memory直接内存来源于NIO通过存在堆中的DirectByteBuffer操作Native内存。访问直接内存的速度会优于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存Java的NIO库允许Java程序使用直接内存,原创 2020-08-18 17:25:18 · 165 阅读 · 0 评论 -
JVM--Java对象的实例化过程、以及对象在内存中的分布布局
文章目录对象的实例化创建对象的方式创建对象的步骤对象的内存布局对象头(Header)实例数据(Instance Data)对齐填充(Padding)图示小结对象的访问定位句柄访问方式直接指针方式对象的实例化创建对象的方式1.new:最常见的方式(本质是构造器)变形1 : Xxx的静态方法变形2 : XxBuilder/XxoxFactory的静态方法2.Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public3.Constructor的ne原创 2020-08-18 16:54:05 · 1248 阅读 · 0 评论 -
JVM运行时数据区--方法区【尚】
文章目录堆、栈、方法区的交互关系方法区的理解HotSpot虚拟机中方法区的演进设置方法区大小的参数解决报错OOM:(内存泄漏、内存溢出)方法区的内部结构方法区的演进细节一些细节StringTable 为什么要调整?静态变量、成员变量、局部变量的存放位置Class对象是存放在堆区的,不是方法区,这点很多人容易犯错。方法区的垃圾回收补充:面试堆、栈、方法区的交互关系方法区的理解方法区(Method Area)与Java堆一样,是各个线程共享的内存区域方法区在JVM启动时就会被创建,并且它的实际的物理原创 2020-08-17 16:39:37 · 204 阅读 · 0 评论 -
JVM中堆是分配对象的唯一选择吗?【尚】
在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技术。 .原创 2020-08-16 13:03:05 · 175 阅读 · 0 评论 -
JVM运行时数据区--堆【尚】
一个进程对应一个jvm实例,一个jvm实例对应一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器、本地方法栈和虚拟机栈。原创 2020-08-15 19:43:06 · 166 阅读 · 0 评论 -
JVM运行时数据区--本地方法栈【尚】
本地方法栈Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法(一般非Java实现的方法)的调用本地方法栈,也是线程私有的。允许被实现成固定或者是可动态拓展的内存大小。(和Java虚拟机栈在内存溢出方面情况是相同的)如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlowError异常。如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方原创 2020-08-14 21:43:07 · 210 阅读 · 0 评论 -
JVM-- 本地方法接口【尚】
本地方法接口在讲Java虚拟机运行时数据区中本地方法栈之前,我们先来说说运行时数据区之外的一个叫本地方法接口的东西简称JNI(Java Native Interface)简单来讲,一个Native Method就是一个java调用非java代码的方法。一个Native Method 是这样一个java方法:该方法的底层实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函数。在定义原创 2020-08-14 21:27:43 · 103 阅读 · 0 评论 -
JVM-- 栈帧【尚】
文章目录栈帧的内部结构1 局部变量表查看栈帧的局部变量表变量槽slot的理解与演示slot的重复利用补充说明2 操作数栈操作数栈特点操作数栈代码追踪栈顶缓存技术ToS(Top-of-Stack Cashing)3 动态链接方法的调用(重点)虚方法与非虚方法字节码中方法调用指令关于invokedynamic指令动态类型语言和静态类型语言方法重写的本质虚方法表3 方法返回地址(Return Address)栈帧的内部结构每个栈帧中存储着局部变量表(Local Variables)操作数栈(Opera原创 2020-08-14 18:06:43 · 189 阅读 · 0 评论 -
JVM运行时数据区--虚拟机栈(重点)【尚】
文章目录虚拟机栈的背景内存中的堆与栈java虚拟机的特点栈中可能出现的异常Java虚拟机栈的存储结构和运行原理局部变量表虚拟机栈的背景由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。内存中的堆与栈栈是运行时的单位,而堆是存储的单位栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪儿原创 2020-08-13 16:08:53 · 142 阅读 · 0 评论 -
JVM运行时数据区--程序计数器(PC寄存器)【尚】
文章目录PC寄存器作用代码实例PC寄存器面试常问1.使用PC寄存器存储字节码指令地址有什么用呢(为什么使用PC寄存器记录当前线程的执行地址呢)2.PC寄存器为什么会设定为线程私有?JVM中的PC寄存器(Program Counter Register)又名程序计数器,是对物理PC寄存器的一种抽象模拟。PC寄存器作用PC寄存器是用来存储指向下一条指令的地址,对应将要执行的指令代码。然后由执行引擎读取下一条指令。1.它是一块很小的内存空间,几乎可以忽略不计。也是运行速度最快的存储区域2.在jvm规范中原创 2020-08-13 10:15:09 · 177 阅读 · 0 评论 -
JVM--运行时数据区【尚】
文章目录运行时数据区内部结构java内存分区java中的线程与进程java线程JVM系统线程分类运行时数据区内部结构java内存分区java虚拟机定了了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。如图,灰色的区域为单独线程私有的,红色的为多个线程共享的,即java中的线程与进程1.每个线程:独立包括程序计数器、栈、本地栈2.线程间共享:堆、堆外内存(原创 2020-08-12 22:39:30 · 91 阅读 · 0 评论 -
JVM之--类加载器子系统【尚】
JVM入门:内存与垃圾回收1、JVM与Java体系结构1.1前言1.2参考书目1.3Java及JVM简介1.4Java发展重大事件1.5虚拟机与Java虚拟机1.6JVM整体结构1.7Java代码执行流程1.8JVM的框架模型1.9JVM的生命周期1.xJVM的发展历程2、类加载子系统3、运行时数据区概述及线程4、程序计数器5、虚拟机栈6、本地方法接口7、本地方法栈8、堆9、方法区10、直接内存11、执行引擎12、StringTable13、垃圾回收概述14、垃圾回收相关算法15、垃圾回收相关概念16、垃圾原创 2020-08-12 21:35:55 · 180 阅读 · 0 评论