JVM
文章平均质量分 77
JVM学习相关和调优
风在咆哮
这个作者很懒,什么都没留下…
展开
-
垃圾回收机制
官方介绍文章目录JVM体系结构各组件基本介绍垃圾回收描述垃圾标记阶段算法垃圾清除阶段算法垃圾分代收集过程JVM体系结构上图各组件翻译如下Class File:.class文件Class Loader Subsystem:类加载子系统Method Area:方法区Heap:堆Java Threads:java线程Program Counter Registers:程序计数器或PC寄存器Native Internal Threads:本地内部线程Runtime Data Areas:运原创 2021-07-27 11:16:54 · 424 阅读 · 0 评论 -
JVM参数设置、分析
JVM参数的含义参数名称含义默认值备注-Xms初始堆大小物理内存的1/64(小于1GB)默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM会增大堆直到-Xmx的最大限制-Xmx最大堆大小物理内存的1/4(小于1GB)默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制-Xmn年轻代大小注意:此处的大小是指eden区+survivor0区+survivor1区。与原创 2021-07-23 13:56:29 · 131 阅读 · 0 评论 -
12、垃圾回收
12.1、概述 垃圾是指在运行过程中没有任何指针指向的对象 自动内存管理,无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险 自动内存管理机制,能够让软件开发人员从繁重的内存管理中释放出来,可以更专心地专注于业务开发 GC的作用区域:方法区、堆 垃圾回收器可以对年轻代回收,也可以对老年代回收,甚至是全堆和方法区的回收,其中,java堆是垃圾收集器的工作重点 从次数上讲:频繁收集Young区;较少收集Old区;基本不动Perm区原创 2021-07-22 08:38:13 · 131 阅读 · 0 评论 -
11、String Table
11.1、String Table调整的原因JDK7中将StringTable放到了堆空间中,因为永久代的回收效率很低。在FullGC的时候才会触发,而FullGC是老年代空间不足,永久代不足时才触发,这就导致StringTable回收效率不高,而在开发中会创建大量的字符串,回收效率低,导致永久代内存不足。放到堆里,能及时回收内存11.2、String的基本特性String在jdk8及以前内部定义了final char[] value用于存储字符串数据。jdk9时改为byte[]加上编码标记原创 2021-07-22 08:37:59 · 145 阅读 · 0 评论 -
10、执行引擎
10.1、概述 执行引擎是JVM核心的组成部分之一 “虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式 JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅是一些能够被JVM所原创 2021-07-21 11:46:49 · 73 阅读 · 0 评论 -
9、直接内存
JDK8元空间使用的是本地内存 不是虚拟机运行时数据区的一部分,也不是《java虚拟机规范》中定义的内存区域 直接内存是在Java堆外、直接向系统申请的内存区间 来源于NIO,通过存在堆中的DirectByBuffer操作Native内存 通常,访问直接内存的速度会由于Java堆。即读写性能高。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存,Java的NIO库允许Java程序使用直接内存,用于数据缓冲区 也可能导致OOM异常 由于直转载 2021-07-21 11:45:28 · 55 阅读 · 0 评论 -
8、HotSpot虚拟机对象探秘
8.1、对象的实例化8.1.1、创建对象的方式 new Class的newInstance:JDK9标记过时,反射的方式,只能调用空参的构造器,权限必须是public Constructor的newInstance:反射的方式,可以调用空参,权限没有要求 使用clone:不调用任何构造器,当前类需要实现Cloneable接口,实现clone方法 使用反序列化:从文件、网络等获取一个对象的二进制流 第三方库Objenesis 8.1.2、创建对象原创 2021-07-21 11:44:25 · 104 阅读 · 0 评论 -
7、堆(Heap)
7.1、概述 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间(堆内存的大小是可以调节的) 《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上他应该被视为连续的 所有线程共享Java堆,在这里还可以划分为线程私有的缓冲区(Thread Local Allocation Buffer,TLAB) 7.2、内存细分现代垃圾回收器大部转载 2021-07-21 11:43:04 · 128 阅读 · 0 评论 -
6、方法区
6.1、方法区的理解《Java虚拟机规范》中明确说明:“尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压缩。”,但对于HotSpotJVM而言,方法区还有一个别名叫做Non-Heap(非堆),目的就是要和堆分开。所以方法区看作是一块独立于Java对的内存空间。方法区和java堆一样,是各个线程共享的内存区域方法区在JVM启动的时候被创建,并且它的实际物理内存空间和Java堆区一样,都是可以不连续的方法区的大小和堆空间一样,可以选择固定大小或者转载 2021-07-21 11:41:48 · 248 阅读 · 0 评论 -
5、本地方法栈
Java虚拟机栈用于管理java方法的调用,而本地方法栈用于管理本地方法的调用 本地方法栈也是线程私有的 允许被实现成固定或者可动态扩展内存大小(在内存溢出方面是相同的) 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverflowError异常 如果本地方法栈可以动态扩展,并且在尝试扩展的时候无法申请到足够的内存,或者在创建新的线程时没有足够的内存去创建对应的本地方法栈,那么Java虚拟机将会抛出一个OutOf..转载 2021-07-21 11:40:37 · 57 阅读 · 0 评论 -
4、本地方法接口
4.1、概述4.1.1、什么是本地方法(Native Method)简单地讲,一个Native Method就是一个Java调用非Java代码的接口。一个Native Method是这样一个java方法:该方法的实现是由非java语言实现。在定义一个native method时,并不提供实现体(有些像定义一个Java interface),因为其实现体是由非java语言在外面实现的本地接口的作用是融合不同的编程语言为java所用,他的初衷是融合C/C++程序举例:标识符native可原创 2021-07-21 11:39:28 · 126 阅读 · 0 评论 -
3、运行时数据区
3.1、概述主要包括方法区Java虚拟机定义了若干种程序运行期间会使用到的运行时数据区,其中有一些会随着虚拟机启动而创建,随着虚拟机退出而销毁。另外一些则是与线程一一对应,这些线程对应的数据区域会随着线程开始和结束而创建和销毁3.2、线程线程是一个程序里的运行单元。JVM允许一个应用有多个线程并行运行。在HotSpot JVM里,每个线程都与操作系统的本地线程直接映射。当一个java线程准备好执行以后,此时一个操作系统的本地线程也同时创建。java线程执行终止后,本地线程也会回收..原创 2021-07-21 11:37:53 · 171 阅读 · 1 评论 -
2、类加载子系统
2.1、作用负责从文件系统或网络中加载class文件,class文件开头有特定标识,魔数(Magic Number)、版本号classloader只负责class文件的加载,至于是否可运行,则由执行引擎决定加载的类信息存放于方法区的内存空间,除了类信息,方法区还会存放运行时常量池信息,还可能包括字符串字面量和数字常量(常量池运行时加载到内存中,即运行时常量池)2.2、角色2.3、类的加载过程加载、链接、初始化、使用、卸载2.3.1、加载 通过一个类的全限定名来获取此类的转载 2021-07-21 11:36:18 · 73 阅读 · 0 评论 -
1、JVM与Java体系结构
1.1、JVM整体架构详图1.2、Java代码执行过程详图1.3、汇编语言、机器语言、高级语言关系1.4、JVM架构模型1.4.1、基于栈式优点:设计和实现简单,适用于资源受限的系统;避开了寄存器的分配:使用零地址指令方式分配;指令流中大部分都是零地址指令,执行过程依赖操作栈,指令集更小(8位字节码,所以指令集更小,但是完成一项操作花费的指令相对多),编译器容易实现;不需要硬件支持,可移植性更好,更好实现跨平台缺点:性能下降,实现同样的功能需要更多的指令,毕竟还要入栈原创 2021-07-21 11:34:31 · 199 阅读 · 0 评论