
jvm
mu6y
这个作者很懒,什么都没留下…
展开
-
JVM GC G1垃圾回收器
G1回收器官方给G1设定的目标实在延迟可控的情况下获得尽可能高的吞吐量,所以才担当起”全功能收集器“的重任与期望。G1时一个并行回收器,它把堆内存分割为很多不相关的区域,使用不同的Region来表示Eden,幸存者0区,幸存者1区,老年代等。G1 GC有计划的避免在整个Java堆中进行全区域的垃圾收集。G1跟踪这个Region里面的垃圾堆积的价值大小,在后台维护一个优先列表,每次根据允许的收集时间,优先回收价值最大的Region。由于这种方式的侧重点在于回收垃圾最大量的区间,所以我们给G1一个名字,原创 2020-07-18 11:14:17 · 288 阅读 · 0 评论 -
JVM 常见的垃圾收集器
垃圾回收器垃圾回收器的分类串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。在诸如CPU处理器或者较小的应用内存硬件平台不是特别优越的场合,串行回收器的性能表现可以超过并行回收器和并发回收器,所以,串行回收默认被应用在客户端的Client模式下的JVM中。在并发能力比较强的CPU上,并行回收器产生的停顿时间要短语串行回收器和串行回收相反,并行收集可以运用多个CPU同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行原创 2020-07-18 09:03:10 · 148 阅读 · 0 评论 -
JVM 垃圾收集 内存相关问题与四种引用类型
垃圾回收的相关概念System.gc()的理解在默认情况下,通过System.gc()或者Runtime.getRuntime().gc()的调用,会显示触发Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用JVM实现者可以通过System.gc()调用来决定JVM的GC行为,而一般情况下,垃圾回收应该是自动机型的,无需手动触发,否则就太过于麻烦了。System.gc() 与 System.ru原创 2020-07-18 08:57:27 · 174 阅读 · 0 评论 -
JVM常见的GC算法
JVM 垃圾回收概述垃圾收集机制是Java的招牌能力,极大的提高了开发效率。如今,垃圾收集几乎称为现代语言的标配,及时经过如此长时间的发展,Java的垃圾收集机制仍然在不断的演进中,不同大小的设备、不同特征的应用场景,堆垃圾收集提出了新的挑战。什么是垃圾垃圾是指在运行程序中没有任何指针指向的对象,这个对象就是需要被回收的垃圾。如果不及时对内存中的垃圾进行清理,那么,这些垃圾对象所占的内存空间会一致保存到应用程序结束,被保留的空间无法被其他对象使用。甚至可能导致内存溢出。早期垃圾回收在早期的原创 2020-07-18 08:52:46 · 423 阅读 · 0 评论 -
JVM对象实例化过程
JVM对象的实例化从字节码文件看创建对象的过程判断对象对应的类是否加载、链接、初始化虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。如果没有,那么在双亲委派模式下,使用当前类加载器已ClassLoader+包名+类名为Key进行查找对应的.class文件。如果没有找到文件,则抛出ClassNotFoundException异常,如果找到,则进行类加载,并生成对应的Class类对象原创 2020-07-09 11:36:11 · 1762 阅读 · 0 评论 -
JVM String常量池
JVM StringTableString:字符串,使用一堆""引起表示String s1 = “atguigu”;String s2 = new String(“atguigu”);String声明为final的,不可被继承String实现了Serializable接口,表示可以序列化String实现了Comparable接口,表示可以排序JDK1.8之前String底层时char[],JDK1.9变为byte[]。字符串常量池字符串常量池中不会存储相同内容的字符串Stri原创 2020-07-09 09:50:10 · 171 阅读 · 0 评论 -
JVM执行引擎
JVM执行引擎虚拟机时一个相对于物理机的概念,这两种机器都有代码执行能力,其区别时物理机的执行引擎时直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约的定制指令集和执行引擎的结构体系,能够执行不被硬件直接支持的指令集格式。JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统之上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM锁识别的字节码指令、符号表、以及其他辅助信息。如果让一个Jav原创 2020-07-09 09:37:45 · 172 阅读 · 0 评论 -
JVM 方法区
JVM方法区方法区的用途: 主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。PermGen(永久代)什么是永久代永久代是方法区的一种实现,只有Java1.7之前的HotSpot虚拟机才有永久代,对于其他类型的虚拟机并没有永久代,方法区主要存储类的相关信息,所以对于动态生成类的情况比较容易出现永久代的内存溢出。在JDK1.8中HotSpot已经没有永久代这个区间,取而代之的是一个叫做Metaspace(元空间)的东西。原创 2020-07-09 09:00:18 · 142 阅读 · 0 评论 -
JVM 堆内存总结
JVM的堆内存方法区和堆对进程来说是唯一的,一个进程对应一个JVM实例。堆的核心概述一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域Java堆区在JVM启动时就被创建,其空间大小也就确定了。是JVM管理的最大的一块内存空间。《JVM虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(TLAB)所有的对象实例以及数组都应该在运行时分配在堆上。数组和对象可能永远原创 2020-07-02 13:39:11 · 423 阅读 · 1 评论 -
JVM 虚拟机栈(动态链接与方法重写)
JVM虚拟机栈动态链接(指向运行时常量池的方法引用)每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接。比如invokedynamic指令。在Java源文件被编译到字节码文件中,所有的变量和方法都作为符号引用保存在class文件的常量池里,比如:描述一个方法调用了其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接就是为了将这些符号引用转换为调用方法的直接引用。帧数据区保存着能够访问常量池的指针。pub原创 2020-06-28 22:44:45 · 1461 阅读 · 0 评论 -
JVM虚拟机栈(局部变量表与操作数栈)
JVM虚拟机栈(局部变量表与操作数栈)虚拟机栈概述由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的。优点时跨平台,指令集小,编译器容易实现,缺点时性能下降,实现同样的功能需要更多的指令。栈是运行时的单位,堆时存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储问题,即数据怎么放,放在哪里。public class StackTest{ public static void main(Strin原创 2020-06-27 22:30:37 · 2876 阅读 · 2 评论 -
JVM运行时数据区概述与程序计数器
JVM运行时数据区JVM定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁,另外一些则是与线程一一对应的,这些与线程对应的数据区域会随着线程开始和结束而创建和销毁。上述本地方法栈,程序计数器,虚拟机栈为线程私有,堆区和元数据区为线程共享的。Runtime 实例一个JVM实例就对应着一个Runtime实例线程线程是一个程序的运行单元。JVM允许一个应用有多个线程并行的执行,再Hotspot JVM里,每个线程都与操作系统的本地线程直接映射原创 2020-06-27 16:24:58 · 167 阅读 · 0 评论 -
JVM 双亲委派模型与其他类加载器相关知识
JVM 双亲委派模型与沙箱安全模型现象JVM对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模型,即把请求交给父类处理,他是一种任务委派模型。创建一个java.lang包,再其中创建一个String下面代码使用的不是自定义的String类,还是JDK核心api库中的Stringpublic class StringTest{ public static原创 2020-06-26 22:26:45 · 105 阅读 · 0 评论 -
JVM 类加载器分类
Java类加载器分类JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)。从概念上讲,自定义类加载器一般指的是程序中有开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生与抽象类ClassLoader的类加载器都划分为自定义类加载器。无论类加载器的类型如何划分,再程序中我们最常见的类加载器始终只有3个Bootstrap ClassLoader(使用c++语原创 2020-06-26 21:42:07 · 441 阅读 · 0 评论 -
JVM ClassLoader加载过程
JVM ClassLoader加载过程JVM类加载阶段LoadingLinkingInitialization类加载器子系统的作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定加载的类信息存放与一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常原创 2020-06-26 19:22:25 · 165 阅读 · 0 评论 -
JVM 类加载器
JVM 类加载器基于栈式架构的特点基于栈式架构的特点设计和实现更简单,适用于资源首先的系统:避开了寄存器的分配难题:使用零地址指定方式分配指令流中的指令大部分是零地址指令,其执行过程依赖与操作栈。指令集更小,编译器容易实现。不需要硬件支持,可移植性更好,更好实现跨平台基于寄存器架构的特点典型的应用是x86的二进制指令集:比如传统的PC以及Android的Daclik虚拟机...原创 2020-04-21 14:42:56 · 174 阅读 · 0 评论 -
Java对象模型
Java对象结构Java对象结构在内存中,一个Java对象包含三部分对象头、实例数据和对齐填充。对象头中又包含锁状态标志、线程持有锁等标志对象头oop-klass modeloopOOP指的是普通对象指针,而kalss用来描述对象实例的具体类型。//定义了oops共同基类typedef class oopDesc* oop...转载 2020-03-29 18:00:26 · 129 阅读 · 0 评论 -
java new一个对象的时候JVM做了什么
Java在new一个对象的时候,如果该对象所属的类没有被加载到内存,那么整体过程分为两步:类加载过程(第一次使用该类)创建对象过程类加载过程若对象所属的类是第一次使用,那么将会使用双亲委派模型来进行类的加载,有类加载器负责根据一个类的全限定名来读取此类的二进制字节流到JVM内部,并将其转换为一个与目标类型对应的java.lang.Class对象实例验证格式验证:验证是否符合cl...原创 2020-03-01 17:13:06 · 215 阅读 · 0 评论 -
JVM方法区与JVM常量池
JVM方法区方法区的用途: 主要用于存储类的信息、常量池、方法数据、方法代码等。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”。PermGen(永久代)什么是永久代永久代是方法区的一种实现,只有Java1.7之前的HotSpot虚拟机才有永久代,对于其他类型的虚拟机并没有永久代,方法区主要存储类的相关信息,所以对于动态生成类的情况比较容易出现永久代的内存溢出。...原创 2020-02-29 23:25:23 · 497 阅读 · 0 评论 -
JVM双亲委派模型
Java类加载器双亲委派模式要求除了顶层的BootstrapClassLoader之外,其余的类加载器都应当有自己的父类加载器,双亲委派模式中的父子关系并非通常所说的类继承关系,而是采用组合关系来复用父类加载器的相关代码类加载器之间的关系如下:类装载方式:隐式装载,程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。显式装载, 通过cl...原创 2020-02-29 21:28:22 · 205 阅读 · 0 评论