![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JVM
文章平均质量分 72
JVM知识学习记录整理
方猿
这个作者很懒,什么都没留下…
展开
-
JVM学习:堆-对象分配过程
一、对象分配过程new的对象先放伊甸园区。此区有大小限制。当伊甸园的空间填满时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收(MinorGC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。再加载新的对象放到伊甸园区。然后将伊甸园中的剩余对象移动到幸存者0区。如果再次触发垃圾回收,此时上次幸存下来的放到幸存者0区的,如果没有回收,就会放到幸存者1区。如果再次经历垃圾回收,此时会重新放回幸存者0区,接着再去幸存者1区。啥时候能去养老区呢?可以设置次数。默认是15次。可以设原创 2021-07-18 21:59:58 · 558 阅读 · 6 评论 -
JVM学习:堆-新生代与老年代
一、概述Java堆区进一步划分,年轻代(YoungGen)和老年代(oldGen)。其中年轻代又可以划分为Eden空间、Survivor0空间和Survivor1空间(有时也叫做from区、to区)Survivor0和Survivor1轮番交换。无主次区分。二、配置比例2.1 配置新生代与老年代的比例配置新生代与老年代在堆结构的占比(一般不会调)默认**-XX:NewRatio**=2,表示新生代占1,老年代占2,新生代占整个堆的1/3。可以修改**-XX:NewRati原创 2021-07-18 21:58:40 · 1685 阅读 · 1 评论 -
JVM学习:堆-内存大小与OOM
一、设置内存大小1.1 理论Java堆区用于存储Java对象实例,那么堆的大小在JVM启动时就已经设定好了,通过选项"-Xms"和"-Xmx"来进行设置。-Xms用于表示堆区的起始内存,等价于**-XX:InitialHeapSize**-Xmx则用于表示堆区的最大内存,等价于**-XX:MaxHeapSize**-X是JVM的运行参数,ms是memory start 。一旦堆区中的内存大小超过“-Xmx"所指定的最大内存时,将会抛出OutofMemoryError异常。通常会将**原创 2021-07-18 21:57:48 · 375 阅读 · 1 评论 -
JVM学习:jvisualvm安装Visual GC插件
一、正常安装BUT图中地址是我新改的,默认地址也是报这个错。国外网站经常出现这种连接问题。二、另寻出路https://blog.csdn.net/shuai825644975/article/details/78970371该博客意思是将设置中的地址改为指定的gitlab地址,但是我可能姿势不对,就像上图一样还是连接不上。三、自寻出路visualvm新访问地址:https://visualvm.github.io/index.html1、官网搜寻最终跳转到这个地址:http原创 2021-07-18 21:55:29 · 204 阅读 · 0 评论 -
JVM学习:本地方法接口
所属位置->红框处一、概述简单地讲,一个Native Method是一个Java调用非Java代码的接囗。一个Native Method是这样一个Java方法:该方法的实现由非Java语言实现,比如C。这个特征并非Java所特有,很多其它的编程语言都有这一机制,比如在C++中,可以用extern 告知C++编译器去调用一个C的函数。“A native method is a Java method whose implementation is provided by non-java原创 2021-06-30 12:22:01 · 52 阅读 · 0 评论 -
JVM学习:虚拟机栈-相关面试题
举例栈溢出的情况?(StackOverflowError)通过 -Xss 设置栈的大小调整栈大小,就能保证不出现溢出么?不能保证不溢出比如栈大小为50块钱,可能够用5天,现在调整为100块,顶多也只是多用几天,对于不出现溢出无法保证。分配的栈内存越大越好么?不是,一定时间内降低了OOM概率,但是会挤占其它的线程空间,因为整个虚拟机的内存空间是有限的。如果线程请求分配的栈容量超过Java虚拟机栈允许的最大容量,Java虚拟机将会抛出一个StackoverflowError 异常。如果Ja原创 2021-06-30 12:21:05 · 88 阅读 · 0 评论 -
JVM学习:虚拟机栈-动态链接
一、概念动态链接(或指向运行时常量池的方法引用)每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用。包含这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking),比如:invokedynamic指令在Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(Symbolic Reference)保存在class文件的常量池里,程序运行时将其加载进方法区的运行时常量池中。比如:描述一个方法调用了另外的其他方法时,就是通过常量池中指向方原创 2021-06-30 12:18:01 · 301 阅读 · 0 评论 -
JVM学习:虚拟机栈-操作数栈
一、概念和局部变量区一样,操作数栈也是被组织成一个以字长为单位的数组。但是和前者不同的是,它不是通过索引来访问,而是通过标准的栈操作—压栈和出栈—来访问的。比如,如果某个指令把一个值压入到操作数栈中,稍后另一个指令就可以弹出这个值来使用。虚拟机在操作数栈中存储数据的方式和在局部变量区中是一样的:如int、long、float、double、reference和returnType的存储。对于byte、short以及char类型的值在压入到操作数栈之前,也会被转换为int。不同于程序计数器,Java虚原创 2021-06-30 12:16:37 · 308 阅读 · 0 评论 -
JVM学习:虚拟机栈-局部变量表
一、认识局部变量表局部变量表:Local Variables,被称之为局部变量数组或本地变量表。定义为一个数字数组,主要用于存储方法参数和定义在方法体内的局部变量,这些数据类型包括各类基本数据类型、对象引用(reference),以及returnAddress类型。八大基本数据类型都可以转换为数字。由于局部变量表是建立在线程的栈上(栈帧内),是线程的私有数据,因此不存在数据安全问题。局部变量表所需的容量大小是在编译期确定下来的,并保存在方法的Code属性的maximum local var原创 2021-06-30 12:12:32 · 238 阅读 · 0 评论 -
JVM学习:虚拟机栈-运行原理及内部结构
运行原理一、栈存储什么每个线程都有自己的栈,栈中的数据都是以**栈帧(Stack Frame)**的格式存在。在这个线程上正在执行的每个方法都各自对应一个栈帧(Stack Frame)。栈帧是一个内存区块,是一个数据集,维系着方法执行过程中的各种数据信息。栈的运行速度仅次于PC寄存器。二、栈的运行原理JVM直接对Java栈的操作只有两个,就是对栈帧的压栈和出栈,遵循先进后出(后进先出)原则。在一条活动线程中,一个时间点上,只会有一个活动的栈帧。即只有当前正在执行的方法的栈帧(栈顶栈帧原创 2021-06-30 12:09:39 · 233 阅读 · 0 评论 -
JVM学习:双亲委派机制
一、原理Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象。而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;如果父类加载器可以完成类加载任务,就成功返回,倘若父原创 2021-06-29 19:09:38 · 110 阅读 · 0 评论 -
JVM学习:类加载器分类
一、类加载器概述JVM支持两种类型的类加载器 。分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader)从概念上来讲,自定义类加载器一般指的是程序中由开发人员自定义的一类类加载器,但是Java虚拟机规范却没有这么定义,而是将所有派生于抽象类ClassLoader的类加载器都划分为自定义类加载器无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终只有3个,如下所示这里的四者之间是包含关系,不是上层和下层,也不是子父类原创 2021-06-29 19:08:14 · 60 阅读 · 0 评论 -
JVM学习:运行时数据区概述及线程
一、运行时数据区1. 前言当我们通过前面的:类的加载 --> 验证 --> 准备 --> 解析 --> 初始化,这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区。2. 内存我们通过磁盘或者网络IO得到的数据,都需要先加载到内存中,然后CPU从内存中获取数据进行读取,也就是说内存充当了CPU和磁盘之间的桥梁3. 特征线程独有:独立包括程序计数器、栈、本地方法栈。线程间共享:堆、堆外内存(永久代或元空间、代码缓存)其中有一些会原创 2021-06-29 19:07:02 · 75 阅读 · 0 评论 -
JVM学习:类加载子系统
一、类记载子系统作用类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine(执行引擎)决定。加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。class文件位于物理磁盘上,需要加载子系统将其以二进制流的数据格式加载到原创 2021-06-29 18:55:49 · 67 阅读 · 0 评论 -
JVM学习:生命周期及整体结构
一、生命周期虚拟机的启动Java虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实现指定的。虚拟机的执行一个运行中的Java虚拟机有着一个清晰的任务:执行Java程序。程序开始执行时他才运行,程序结束时他就停止。执行一个所谓的Java程序的时候,真真正正在执行的是一个叫做Java虚拟机的进程。虚拟机的退出程序正常执行结束。程序在执行过程中遇到了异常或错误而异常终止。由于操作系统原创 2021-06-29 18:49:13 · 103 阅读 · 0 评论 -
JVM学习:初始简介
写在前面1.目前已从事Java开发接近三年,前两年忙于熟悉公司系统及业务,且一直认为程序员能实现业务开发即可(大错特错)。2.个人认为高级程序员应该具备高质量的代码开发能力,严谨完善的业务流程,及新技术的学习能力。3.JVM作为底层基础,涉及类加载系统、内存数据区、执行引擎等部分,内存数据区的GC垃圾回收更是性能调优的必备知识。4.学习路径-尚硅谷宋红康老师-JVM从入门到精通-内存与垃圾回收篇。-某位勤奋同学整理的视频课件:https://blog.csdn.net/oneby1314/ar原创 2021-06-28 21:42:32 · 83 阅读 · 0 评论 -
JVM学习:Java重大变革
1、Java重大事件1990年,在Sun计算机公司中,由Patrick Naughton、MikeSheridan及James Gosling领导的小组Green Team,开发出的新的程序语言,命名为Oak,后期命名为Java1995年,Sun正式发布Java和HotJava产品,Java首次公开亮相。1996年1月23日Sun Microsystems发布了JDK 1.0。1998年,JDK1.2版本发布。同时,Sun发布了JSP/Servlet、EJB规范,以及将Java分成了J2EE、J2原创 2021-06-28 21:44:41 · 83 阅读 · 0 评论 -
JVM学习:JDK、JRE、JVM
话不多说,先上图简图详细图1、JDKJDK(Java SE Development Kit),Java标准开发包,它提供了编译、运行Java程序所需的各种工具和资源,包括Java编译器、Java运行时环境,以及常用的Java类库等。2、JREJRE( Java Runtime Environment) 、Java运行环境,用于解释执行Java的字节码文件。普通用户而只需要安装 JRE(Java Runtime Environment)来运行 Java 程序。而程序开发者必须安装JDK来编译原创 2021-06-29 16:36:30 · 43 阅读 · 0 评论