JVM
文章平均质量分 77
JVM
zuodaoyong
这个作者很懒,什么都没留下…
展开
-
jvm命令行监控和诊断工具
一、jps查看正在运行的java进程,如果想关闭,则使用-XX:-UsePerfData,默认是开启状态:-XX:+UsePerfData1、参数(1)-q显示LVMID(Local virtual machine id)即本地虚拟机唯一id,不显示主类的名称(2)-l输出应用程序主类的全类名,如果是执行的为jar包,则输出jar完整路径(3)-m输出虚拟机进程启动时传递给主类的main函数的参数(4)-v列出虚拟机进程启动的jvm参数二、jstat(主要用于检测翻译 2021-10-05 09:22:29 · 270 阅读 · 0 评论 -
类加载器ClassLoader详解
类加载器ClassLoader详解翻译 2021-02-11 14:10:26 · 7844 阅读 · 0 评论 -
类的卸载
在类加载器的内部实现中,用一个集合存放所加载类的引用。一个Class对象总是会引用它的类加载器,调用Class对象的getClassLoader()方法,可以获取其类加载器。某个类的Class实例和其类的加载器之间是双向关联关系一个类的实例总是引用代表这个类的Class对象,在Object类中定义了getClass()方法,这个方法返回代表对象所属类的Class对象的引用。一个类何时结束生命周期,取决于代表它的Class对象何时结束生命周期1、启动类加载器加载的类型在整个运行期间是不可能被卸翻译 2021-02-10 23:00:11 · 653 阅读 · 0 评论 -
类的初始化阶段之类的主动使用与被动使用
一、主动使用(会调用<clinit>()方法)Class只有在必须要首次使用的时候才会被装载,java虚拟机规定,一个类或者接口在初次使用(主动使用)前,必须要初始化。主动使用的情况如下1、当创建一个类的实例时,比如使用new关键字,或者通过反射、克隆、反序列化2、当调用类的静态方法时,即使用了字节码的invokestatic指令public class ActiveUse1 { public static void main(String[] args) {翻译 2021-02-10 22:33:25 · 259 阅读 · 0 评论 -
类的加载过程详解
在java中数据类型分为基本数据类型和引用数据类型。基本数据类型由虚拟机预先定义,引用数据类型则需要进行类的加载。按照java虚拟机规范,从class文件到加载进入内存中的类,再到类卸载出内存为止,整个生命周期如下一、加载将java类的字节码文件加载到机器内存中,并在内存中构建出java类的原型(类模板对象)1、加载类时,java虚拟机加载步骤(1)通过类的全名,获取类的二进制数据流(2)解析类的二进制数据流为方法区内的数据结构(Java类模型)(3)创建java.lang.翻译 2021-02-10 20:58:10 · 9501 阅读 · 0 评论 -
垃圾回收器详解
一、垃圾回收分类1、串行垃圾回收在同一时间段内只允许只有一个cpu用于垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束(1)在单核cpu,或者较小的应用平台上使用串行垃圾回收优于并行回收,串行回收默认应用在客户端的client模式下的jvm中(2)在多核cpu下,并行回收器产生的停顿时间短于串行回收器(3)独占式,会有stop-the-world2、并行垃圾回收(1)多个cpu同时回收,提升了应用的性能(2)独占式,会有stop-the-world二、GC性能指翻译 2020-07-20 21:14:42 · 398 阅读 · 0 评论 -
java引用类别详解
jdk1.2之后,java对象对引用的概念进行了扩充,将引用分为强引用,软引用,弱引用和虚引用。一、强引用(StrongReference)程序出现对象的引用赋值,只要强引用关系在,垃圾收集器永远不会收掉被引用的对象。(1)可以直接访问目标对象(2)目标对象被其他对象引用,虚拟机即使抛oom,也不会回收该对象(3)强引用也是java内存泄漏的主要原因之一二、软引用(SoftReference)在系统将要发生内存溢出之前,将会把这些对象列入回收范围之中进行第二次回收。如果回收后还没翻译 2020-07-20 14:15:28 · 156 阅读 · 0 评论 -
垃圾回收的并发与并行
1、并行多条垃圾收集线程并行工作,但此时用户线程处于等待状态,比如ParNew、Parallel、Scavenge、Parallel Old在单核cpu,并行垃圾回收效率可能较低。2、串行单线程运行,如果内存不够,则程序暂停,启动垃圾回收器回收,回收完,再启动程序线程继续运行。3、并发用户线程和垃圾回收线程同时执行,用户线程运行在cpu core1上,垃圾回收线程运行在cpu core2上。比如cms,g1...翻译 2020-07-19 22:51:43 · 989 阅读 · 0 评论 -
堆内存溢出与内存泄漏
一、内存溢出java堆内存溢出主要有如下原因1、虚拟机堆内存设置不够2、出现内存泄漏3、内存中创建了大量的大对象,并且长时间不能回收。在抛出OutOfMemoryError之前,通常垃圾收集器会被触发,在java.nio.BITs.reserveMemory()方法中调用了System.gc()。不过也有例外,如果分配一个大对象超过了堆内存大小,此时jvm判定垃圾收集器并不能解决,所以直接抛出OutOfMemoryError。二、内存泄漏对象不会再使用,但是GC又不能回收,此时造翻译 2020-07-19 22:43:18 · 469 阅读 · 0 评论 -
System.gc()详解
通过使用System.gc()或者Runtime.getRuntime().gc()调用会显示触发Full GC,同时对新生代和老年代回收System.gc()底层调用Runtime.getRuntime().gc()程序中如果System.gc()会通知jvm的垃圾收集器来回收,但是此时垃圾收集器不一定一定来回收,即finalize方法有可能调用,有可能不调用。此时如果调用System.runFinalization()方法,会强制调用对象的finalize方法...翻译 2020-07-19 22:15:41 · 4004 阅读 · 0 评论 -
GC垃圾收集算法详解
一、垃圾标记算法1、对象存活判断只有对堆内存上对象进行标记出哪些是存活的,哪些是死亡(不再被其他存活对象引用)对象。被标记为死亡的对象在GC时被回收。判断对象存活主要有两种方式(1)引用计数(java未选择,python选择)每个对象保存一个整型的引用计数器属性,用于记录对象被引用的情况。算法思想:对于一个对象A,只要有任何对象引用了A,则A的引用计数加1,当引用失效,此时引用计数器减1。一旦引用计数器值为0,则可以被回收。优点:实现简单,垃圾对象便于辨识,判定效率高,回翻译 2020-07-19 21:54:00 · 300 阅读 · 0 评论 -
对象finalize机制
finalize()是Object类的,该方法是垃圾回收机制回去调用的,java对象不要试图调用1、finalize()可能导致对象复活2、finalize()执行的时间没有保障,它是由GC线程决定的,如果没有GC,则finalize()方法将没有执行机会。3、复写finalize()方法,有可能对GC性能造成影响如果从所有根节点都无法访问到某个对象,说明该对象已经不再使用,一般来说,此对象需要被回收。但事实上,有可能处于“死缓”状态,一个无法触及的对象有可能在某一个条件下复活自己。fi翻译 2020-07-19 19:32:15 · 392 阅读 · 0 评论 -
StringTable详解
一、存储结构jdk8及以前String底层使用char[],一个char是两个字节,jdk9开始改用byte[]加上编码标记节约空间。jdk9官网提供的String修改说明:http://openjdk.java.net/jeps/254修改动机:二、不可变性1、当对字符串重新赋值时,需要重写指定内存区域赋值2、当对现有字符串进行连接操作时,也需要重新指定内存区域。3、调用String的replace方法时修改指定字符串或者字符时,也需要重新指定内存区域赋值。4.翻译 2020-07-19 16:08:37 · 1734 阅读 · 1 评论 -
直接内存
直接内存是在java堆外的,直接向系统申请内存区间,通过DriectByteBuffer操作native内存。读写文件,需要和磁盘交互,需要由用户态切换到内核态,如下图所示:使用nio,操作系统会划出直接缓存区可以被java代码直接访问,数据只有一份,nio适合对大文件的读写操作。直接内存大小可以通过MaxDirectMemorySize设置,如果不指定,默认是和堆的最大值-Xmx参数一致。...翻译 2020-07-12 09:51:36 · 554 阅读 · 0 评论 -
对象实例化
一、创建对象的方式1、new(1)直接new 对象(2)单例模式,构造器是私有的,通过静态方法获取对象(3)工厂类产生对象2、class的newInstance()反射的方式,只能调用空参构造器,权限是public3、Constructor的newInstance()可以调用有参构造器,权限没有要求4、使用clone()实现Cloneable接口,浅拷贝不使用构造器,深拷贝需要用到其他方式产生对象5、使用反序列化从文件中,网络中获取一个二进制流6、第三方库翻译 2020-07-11 10:01:15 · 4131 阅读 · 0 评论 -
JVM方法区详解
线程共享角度来分析运行时数据区栈,堆,方法区的交互翻译 2020-07-04 14:49:04 · 7849 阅读 · 12 评论 -
JVM堆详解
1、一个JVM实例只存在一个堆内存,堆也是java内存管理的核心区域2、java堆在jvm启动的时候被创建,其空间大小也就确定了。是jvm管理的最大的一块内存空间。3、堆可以处于物理上不连续的内存空间中,但在逻辑上为连续的。4、所有线程共享堆,还可以划分线程私有的缓冲区(TLAB)...翻译 2020-06-14 12:54:48 · 872 阅读 · 0 评论 -
Java虚拟机栈详解
设置虚拟机栈的指令:-Xss256k(K)或者-Xss12m(M),单位不区分大小写在一条活动线程中,一个时间点上,只会有一个活动的栈帧,即只有当前正在执行的方法的栈帧(栈顶栈帧)是有效的。这个栈帧被称为当前栈帧。与当前栈帧相对应的方法就是当前方法,定义这个方法的类就是当前类执行引擎运行的所有字节码指令只针对当前栈帧进行操作。如果在当前方法中调用了新的方法,对应的新的栈帧会被创建出来,放在栈的顶端,成为新的当前栈帧。注意:(1)不同线程中所包含的栈帧是不允许存在相互引用的,即不可能在翻译 2020-05-30 19:50:34 · 467 阅读 · 0 评论 -
jvm方法调用详解
一、在jvm中,将符号引用转换为调用方法的直接引用与方法的绑定机制相关。1、静态链接当一个字节码文件被装载进jvm内部时,如果被调用的目标方法在编译器可知,且运行期保持不变,这种情况下将调用方法的符号引用转换为直接引用。2、动态链接如果被调用的方法在编译期无法确定下来,也就是说只能在程序运行期将调用方法的符号引用转换为直接引用。二、绑定机制绑定是一个字段,方法或者类的符号引用被替换为直接引用的过程1、早期绑定被调用的目标方法如果在编译期可知,且运行期保持不变时,即可将这个方法翻译 2020-05-30 18:21:49 · 970 阅读 · 0 评论 -
JVM类加载器
一、分类JVM支持两种类型的来加载器,分别是引导类加载器(BootStrap classLoader)和自定义类加载器(User-Defined classLoader)jvm虚拟机规范中将所有派生抽象类classLoader的类加载器划分为自定义类加载器。1、启动类加载器(引导类加载器,Bootstrap ClassLoader)(1)该类加载使用c/c++语言实现的,嵌套在jvm内部(2)用来加载java的核心库(java_home/jre/lib/rt.jar,resources.翻译 2020-05-24 09:25:38 · 198 阅读 · 0 评论 -
JVM之生命周期
1、虚拟机启动通过引导类加载器(bootstrap class loader)创建一个初始化类(initial class)来完成的。该类由不同的虚拟机自己实现2、虚拟机的执行(1)一个运行中的java虚拟机有着一个清晰的任务:执行java程序(2)程序开始执行时,虚拟机才运行,程序结束时,虚拟机也停止(3)执行一个java程序,其实真正执行的是一个java虚拟机进程3、虚拟机的推出(1)程序正常结束(2)程序在执行过程中遇到了异常或者错误而异常终止(3)由于操作系统出.翻译 2020-05-21 05:41:38 · 197 阅读 · 0 评论 -
JVM之类加载器子系统
1、类加载器子系统负责从文件系统或者网络中加载Class文件,Class文件在文件开头有特定的文件标识。2、ClassLoader只负责Class文件的加载,至于他是否可以运行,则是由ExecutionEngine决定。3、加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池的信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常...翻译 2020-02-21 21:16:32 · 684 阅读 · 0 评论 -
JVM之架构模型
翻译 2020-02-19 21:50:43 · 341 阅读 · 0 评论 -
深入理解JVM之对象的访问定位
建立对象后,java程序通过栈的reference数据来操作堆上的对象。java虚拟机访问方式有两种:使用句柄,直接指针1、使用句柄java堆上划分出一块内存条作为句柄池,reference存储的是对象的句柄地址。句柄中包含对象实例数据,类型数据的地址。2、直接指针reference存储的是对象地址3、总结句柄访问最大好处就是reference中存储的稳定的句柄地址...原创 2019-10-13 22:06:35 · 196 阅读 · 0 评论 -
深入理解JVM之虚拟机对象的内存布局
在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块:对象头,实例数据,对齐填充。一、对象头对象头包含两部分信息,(1)是存储对象自身运行时数据(官方称“Mark Word”),如哈希、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳。(2)类型指针,对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪一个类的实例。并不是所有的虚拟机实现都必...翻译 2019-08-31 14:45:20 · 116 阅读 · 0 评论 -
深入理解JVM之虚拟机运行时数据区
java运行时数据区如上图所示。1、程序计数器(线程私有)程序计数器可以看做当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器。java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,在任何时刻,一个处理器的核只会执行一条线程中的指令。...原创 2019-08-23 08:06:10 · 125 阅读 · 0 评论 -
深入理解JVM之虚拟机发展史
1、1996年Sun公司发布jdk1.0版本自带的JVM是Classic VM(jdk1.4被废弃),被废弃根源是这款虚拟机只能使用纯解释器执行代码。如果使用编译器执行,需要外挂,而且解释器不可运行。外挂的编译器编译java比较慢。2、jdk1.2出现了Exact VM,此虚拟机支持编译器和解释器共存,使用准确式内存管理(虚拟机可以知道内存中某个位置的数据是什么类型)和热点代码探测热点代码...原创 2019-08-19 22:33:13 · 185 阅读 · 0 评论