![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Jvm学习
Jvm学习
知北行
不积跬步,无以至千里,不积小流,无以成江海
展开
-
jvm学习——25.垃圾回收器前瞻
垃圾回收器的新发展GC仍然处于飞速发展之中,目前的默认选项G1 GC在不断的进行改进,很多我们原来认为的缺点,例如串行的Full GC、Card Table扫描的低效等,都已经被大幅改进,例如,JDK 10以后,Full GC已经是并行运行,在很多场景下,其表现还略优于Parallel GC的并行Full GC实现。 即使是Serial GC,虽然比较古老,但是简单的设计和实现未必就是过时的,它本身的开销,不管是GC相关数据结构的开销,还是线程的开销,都是非常小的,所以随着云计算的兴起,在Serv.转载 2020-08-13 16:55:11 · 88 阅读 · 0 评论 -
jvm学习——24.JVM关于GC的日志分析
通过阅读GC日志,我们可以了解Java虛拟机内存分配与回收策略。内存分配与垃圾回收的参数列表-XX: +PrintGC 输出Gc日志。类似: -verbose:gc-XX: +PrintGCDetails 输出GC的详细日志-XX: +PrintGCTimeStamps 输出GC的时间戳(以基准时间的形式)-XX: +PrintGCDateStamps输出GC的时间戳(以日期的形式,如2013一05一04T21 : 53:59.234+0800 )-XX: +PrintHeapAtGC 在进行转载 2020-08-13 16:54:59 · 192 阅读 · 0 评论 -
jvm学习——23.JVM七大垃圾回收器下篇G1(Garbage First)
186G1回收器:区域化分代式既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First (G1)GC? 原因就在于应用程序所应对的业务越来越庞大、复杂,用户越来越多,没有GC就不能保证应用程序正常进行,而经常造成STW的GC又跟不上实际的需求,所以才会不断地尝试对GC进行优化。G1 (Garbage一First) 垃圾回收器是在Java7 update4之后引入的一个新的垃圾回收器,是当今收集器技术发展的最前沿成果之一。 与此同时,为了适应现在不断扩大的内存和不断增加的处转载 2020-08-13 16:54:44 · 261 阅读 · 0 评论 -
jvm学习——22.JVM七大垃圾回收器上篇Serial、ParNeW、Parallel Scavenge、 Serial Old、 Parallel Old、 CMS、 G1
JVM七大垃圾回收器上篇Serial、ParNeW、Parallel Scavenge、 Serial Old、 Parallel Old、 CMS、 G1170GC逻辑分类垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。从不同角度分析垃圾收集器,可以将GC分为不同的类型。Java不同版本的新特性:语法层面:Lambda表达式、switch、自动装箱、自动拆转载 2020-08-13 16:54:29 · 747 阅读 · 0 评论 -
jvm学习——21.垃圾回收之引用
163JVM引用概述我们希望能描述这样一类对象: 当内存空间还足够时,则能保留在内存中;如果内存空间在进行垃圾收集后还是很紧张,则可以抛弃这些对象。【既偏门又非常高频的面试题】强引用、软引用、弱引用、虚引用有什么区别?具体使用.场景是什么?在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference) 、弱引用(Weak Reference) 和虚引用(Phantom Reference) 4种,这4种引用.转载 2020-08-13 16:54:17 · 211 阅读 · 0 评论 -
jvm学习——20.垃圾回收之安全点与安全区域
162安全点(Safe point)程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点(Safepoint) ”Safe Point的选择很重要,如果太少可能导致GC等待的时间太长,如果太频繁可能导致运行时的性能问题。大部分指令的执行时间都非常短暂,通常会根据“是否具有让程序长时间执行的特征”为标准。比如:选择些执行时间较长的指令作为Safe Point, 如方法调用、循环跳转和异常跳转等。如何在GC发生时,检查所有线程都跑到最近的安全点停.转载 2020-08-13 16:54:06 · 238 阅读 · 0 评论 -
jvm学习——19.垃圾回收之并行与并发
160程序的并行和并发程序的并发(Concurrent)在操作系统中,是指一个时间段中有几个程序都处于己启动运行到运行完毕之间,且这几个程序都是在同一个处理器_上运行。并发不是真正意义上的“同时进行”,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行。程序的并行(Parallel)当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另.转载 2020-08-13 16:53:54 · 224 阅读 · 0 评论 -
jvm学习——18.垃圾回收之STW
159Stop The WorldStop一the一World,简称STW,指的是GC事件发生过程中,会产生应用程序的停顿。停顿产生时整个应用程序线程都会被暂停,没有任何响应,有点像卡死的感觉,这个停顿称为STW。举例:➢可达性分析算法中枚举根节点(GC Roots)会导致所有Java执行线程停顿。停顿的原因:分析工作必须在一个能确保一致性的快照 中进行一致性指整个分析期间整个执行系统看起来像被冻结在某个时间点上V如果出现分析过程中对象引用关系还在不断变化,则分析结果的准确.转载 2020-08-13 16:53:41 · 2322 阅读 · 0 评论 -
jvm学习——17.内存溢出与内存泄漏
157内存溢出内存溢出相对于内存泄漏来说,尽管更容易被理解,但是同样的,内存溢出也是引发程序崩溃的罪魁祸首之一。由于GC一直在发展,所有一般情况下,除非应用程序占用的内存增长速度非常快,造成垃圾回收已经跟不上内存消耗的速度,否则不太容易出现OOM的情况。大多数情况下,GC会进行各种年龄段的垃圾回收,实在不行了就放大招,来一次独占式的Full GC操作,这时候会回收大量的内存,供应用程序继续使用。javadoc中对OutOfMemoryError的解释是,没有空闲内存,并且垃圾.转载 2020-08-13 16:53:30 · 130 阅读 · 0 评论 -
jvm学习——16.垃圾回收相关概念
155System.gc()的理解System.gc()无法保证GC一定执行在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显式触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。JVM实现者可以通过system.gc()调用来决定JVM的GC行为。而一般情况下,垃圾回收应该是自动进行的,无须手动触发,否则就太过于麻烦了。然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用(无法保证马.转载 2020-08-13 16:53:13 · 72 阅读 · 0 评论 -
jvm学习——15.JVM垃圾回收算法(垃圾标记两种方法)
139垃圾标记阶段对象存活判断:在堆里存放着几乎所有的Java对象实例,在GC执行垃圾回收之前,首先需要区分出内存中哪些是存活对象,哪些是已经死亡的对象。只有被标记为己经死亡的对象,GC才会在执行垃圾回收时,释放掉其所占用的内存空间,因此这个过程我们可以称为垃圾标记阶段。那么在JVM中究竟是如何标记一个死亡对象呢?简单来说,当一个对象已经不再被任何的存活对象继续引用时,就可以宣判为已经死亡。判断对象存活一般有两种方式:引用计数算法和可达性分析算法。引用计数法 (java没有采用)引用.转载 2020-08-13 16:53:01 · 409 阅读 · 0 评论 -
jvm学习——14.JVM垃圾回收概述
135JVM垃圾回收概述什么是垃圾?➢垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。➢外文: An object is considered garbage when it can no longer be reached from any pointer in the runningprogram.如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一直保留到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。垃圾收集,.转载 2020-08-13 16:52:38 · 100 阅读 · 0 评论 -
jvm学习——13.字符串常量池StringTable
118String的基本特性String:字符串,使用一对""引起来表示。String sl = “hello”;//字面量的定义方式;String s2 = new String(“hello”) ;String类是已经被声明为final的, 不可被继承。String实现了Serializable接口:表示字符串是支持序列化的。 实现了Comparable接口:表示String可以比较大小String在jdk8及以前内部定义为==“private final char val.转载 2020-08-13 16:52:23 · 299 阅读 · 0 评论 -
jvm学习——12.JVM执行引擎
110JVM执行引擎概述1.执行引擎是Java虚拟机的核心组成部分之一2.虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的。而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。3.JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只.转载 2020-08-13 16:52:11 · 177 阅读 · 0 评论 -
jvm学习——11.JVM直接内存(Direct Memory)
107直接内存1.直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域。2.直接内存是Java堆外的、直接向系统申请的内存区间。3.简单理解: java process memory = java heap + native memory示例代码:/** * IO NIO (New IO / Non-Blocking IO) * byte[] / char[] Buffer * Stream .转载 2020-08-13 16:51:59 · 2364 阅读 · 0 评论 -
jvm学习——10.运行时数据区之对象的实例化内存布局与访问定位
102对象的实例化创建对象的方式1.new:最常见的方式(本质是构造器) 变形1 : Xxx的静态方法 变形2 : XxBuilder/XxoxFactory的静态方法2.Class的newInstance():反射的方式,只能调用空参的构造器,权限必须是public3.Constructor的newInstance(Xxx):反射的方式,位于java.lang.reflect.Constructor 可以调用空参、带参的构造器,权限没有要求4.使用clone() :不调用任何构.转载 2020-08-13 16:51:46 · 126 阅读 · 0 评论 -
jvm学习——9.运行时数据区之方法区
87运行时数据区结构图(温习):堆、栈、方法区的交互关系88方法区的理解方法区(Method Area)与Java堆一样,是各个线程共享的内存区域方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang.OutOfMemoryError:PermGen sp.转载 2020-08-13 16:51:34 · 192 阅读 · 0 评论 -
jvm学习——8.堆是分配对象的唯一选择吗?
82在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。 在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的堆外存储技.转载 2020-08-13 16:56:57 · 164 阅读 · 0 评论 -
jvm学习——7.运行时数据区之堆
一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器、本地方法栈和虚拟机栈。66核心概述1.一个jvm实例只存在一个堆内存,堆也是java内存管理的核心区域2.Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间(堆内存的大小是可以调节的)3.《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。4.所有的线程共享java堆,在这里还可以划分线程私有的转载 2020-08-13 16:51:01 · 127 阅读 · 0 评论 -
jvm学习——6.本地方法接口及本地方法栈
63本地方法接口在讲Java虚拟机运行时数据区中本地方法栈之前,我们先来说说运行时数据区之外的一个叫本地方法接口的东西简称JNI(Java Native Interface)简单来讲,一个Native Method就是一个java调用非java代码的接口,一个Native Method 是这样一个java方法:该方法的底层实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知C++ 编译器去调用一个C的函.转载 2020-08-13 16:39:17 · 99 阅读 · 0 评论 -
jvm学习——5.Java虚拟机栈--栈帧
47栈帧的内部结构每个栈帧中存储着1.局部变量表(Local Variables)2.操作数栈(Operand Stack)(或表达式栈)3.动态链接(Dynamic Linking)(或执行"运行时常量池"的方法引用)----深入理解Java多态特性必读!!4.方法返回地址(Return Adress)(或方法正常退出或者异常退出的定义)5.一些附加信息其中部分参考书目上,称方法返回地址、动态链接、附加信息为帧数据区48局部变量表(Local Variables)1..转载 2020-08-13 16:50:18 · 444 阅读 · 0 评论 -
jvm学习——4.虚拟机栈基本内容
44虚拟机栈的背景由于跨平台性的设计,java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。根据栈设计的优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。内存中的堆与栈栈是运行时的单位,而堆是存储的单位1.栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放、放在哪儿。2.一般来讲,对象主要都是放在堆空间的,是运行时数据区比较大的一块3.栈空间存放 基本数据类型的局部变量,以及转载 2020-08-13 16:57:05 · 123 阅读 · 0 评论 -
jvm学习——3.运行时数据区之程序计数器
41JVM运行时数据区–程序计数器JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。一个线程对应一个 JVM Stack。JVM Stack 中包含一组 Stack Frame。当 JVM 调用一个 Java 方法时,它从对应类的类型信息中得到此方法的局部变量区和操作数栈的大小,并据此分配栈帧内存,然后.转载 2020-08-13 16:49:50 · 223 阅读 · 0 评论 -
jvm学习——2.运行时数据区概述及线程
39节Java内存空间内存是非常重要的系统资源,是硬盘和cpu的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了JAVA在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的jvm对于内存的划分方式和管理机制存在着部分差异(对于Hotspot主要指方法区)(图源阿里)JDK8的元数据区+JIT编译产物 就是JDK8以前的方法区JavaAPI中的Runtimepublic class Runtimeextends Object每个Java应用程转载 2020-08-13 16:49:15 · 71 阅读 · 0 评论 -
jvm学习——1.类加载子系统
JVM细节架构图类加载子系统作用1、类加载子系统负责从文件系统或者网络中加载class文件,class文件在文件开头有特定的文件标识即16进制CA TE BA BE;2、加载后的Class类信息存放于一块成为方法区的内存空间。除了类信息之外,方法区还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)来一张经典的JVM内存结构图:其中类加载器的工作范围只限于下图的左半部分,不包含调用构造器实例化对象3.ClassLoader只负转载 2020-08-13 16:47:41 · 120 阅读 · 0 评论