jvm学习笔记
笨娃儿~k
这个作者很懒,什么都没留下…
展开
-
1 Java运行时数据区了解(个人理解,若有不足,敬请指出)
注意:本文说的是Java运行时数据区Java虚拟机在执行Java程序的过程中会把它管理的内存划逻辑上分成若干个不同的数据区域。这些不同区域一些是共享一些是私有的,他们相互协作管理程序。线程私有: 程序计数器 虚拟机栈 本地方法栈线程共享的: 堆 方法区1 程序计数器程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变这个计数器的值来选取...原创 2019-08-10 16:44:10 · 139 阅读 · 0 评论 -
9 方法调用(个人理解,若有不足,敬请指出)
方法调用并不等同于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程。在程序运行时,进行方法调用是最为普遍、频繁的操作。前面说过 Class 文件的编译过程是不包含传统编译中的连接步骤的,一切方法调用在 Class 文件里面存储的都只是符号引用,而不是方法在运行时内存布局中的入口地址(相当于之前说的直接引用)。这个特性给 Java 带...原创 2019-08-10 16:48:59 · 167 阅读 · 0 评论 -
8 类加载机制(个人理解,若有不足,敬请指出)
类加载机制在了解类加载机制前了解一下class结构, 浅显易懂,我这么蠢的都能看懂:https://blog.csdn.net/u010349169/column/info/jvm-principle1-类加载的时机类加载就是把类的class文件加载到运行时数据区并对数据存放等一系列操作,那么类加载时间又是何时呢?在类的生命周期中(加载、连接包括【验证,准备,解析:因为动态绑定的因素可以在...原创 2019-08-10 16:48:30 · 128 阅读 · 0 评论 -
7 Tlab(个人理解,若有不足,敬请指出)
Java对象在完成正确的堆内存空间分配时采用二种方式:一种是cas失败重试,另一种是Tlab。tlab是线程本地分配内存的英语缩写,从语义可知是一个线程专用的内存分配区域,他也存在堆中,但是也独立于堆中空间。我们在为一个对象在堆中分配空间时,也有其他线程在为对象在堆内存分配空间,于是就存在空间的竞争,在激烈的竞争场合内存分配的效率比较低下,所以考虑以上的情况出现,我们采用TLAB线程专属空间避免...原创 2019-08-10 16:47:52 · 289 阅读 · 0 评论 -
6 对象的内存布局和访问定位(个人理解,若有不足,敬请指出)
1 对象的创建1 类加载检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。2 分配内存在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需的内存大小在类加载完成后便可确定,为对象分配空间的任务等同于把一块确定大小的内存从 Java 堆...原创 2019-08-10 16:47:22 · 94 阅读 · 0 评论 -
5 垃圾回收算法(比较简单,可以去看Java性能调优指南,不想写)
jvm并行与并发:并行:指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。并发:指用户线程与垃圾收集线程同时执行(但不一定是并行,可能会交替执行),用户程序在继续运行,而垃圾收集器运行在另一个 CPU 上。2.1. 标记-清除算法(Mark-Sweep)最基础的垃圾回收算法,分为两个阶段,标注和清除。标记阶段标记出所有需要回收的对象,清除阶段回收被标记的对象所占用的空间。该算法最...原创 2019-08-10 16:46:53 · 91 阅读 · 0 评论 -
4 对象生死状态判断(个人理解,若有不足,敬请指出)
1 垃圾回收针对地址Java的内存区域分为程序计数器、虚拟机栈、本地方法栈、Java堆和方法区,而且其中的程序计数器、虚拟机栈和本地方法栈都是线程独立的,也就是说这三块内存区域的生命周期与线程是同生共死的。栈中帧栈在类结构确定的时候就已经知道该分配多少内存了,所以当线程结束的时候,内存也跟着一起回收了,从这个角度看,这三块的内存区域的内存分配和垃圾收集就比较固定了。反观Java堆和方法区,比如我...原创 2019-08-10 16:46:14 · 134 阅读 · 0 评论 -
3 常量池技术 (个人理解,若有不足,敬请指出)
1 常量池分类常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。他包括以下三个不同常量池类别:Class文件常量池class文件中的属于编译阶段,class文件常量池主要用于存放两大类常量:字面量(Literal)和符号引用量(Symbolic References),字面量相当于Java语言层面常量的概念,如文本字符串,声明为final的常量值等,符号引用则属于编译原...原创 2019-08-10 16:45:16 · 171 阅读 · 0 评论 -
2 运行时栈桢结构(个人理解,若有不足,敬请指出)
栈桢是用于虚拟机进行方法调用和方法执行时的数据结构,它是虚拟机运行时数据区虚拟机栈的栈元素。栈元素存储了方法的局部变量表,操作数栈,动态连接和方法返回地址等信息。每一个方法在执行时都对应着一个栈桢在虚拟机栈里面从入栈到出栈的过程。在编译代码的时候,栈桢中需要多大的局部变量表,操作数栈的深度已经确认。在活动栈桢中,只有位于栈顶的栈桢才是有效的,称为当前栈桢,与这个栈桢对应的方法称为当前方法。1-...原创 2019-08-10 16:44:44 · 225 阅读 · 0 评论 -
10 程序编译与优化(个人理解,若有不足,敬请指出)
Java语言的“编译期”是一段不确定的过程,因为它可能指的是(1)前端编译器把java文件转变成class字节码文件的过程,也可能指的是虚拟机(2)后端运行期间编译器(JIT)把字节码转变成机器码的过程。更或者是(3)静态提前编译器直接将Java文件转换成机器码文件。从JDK1.3开始,虚拟机设计团队就把对性能的优化集中到了后端的即时编译中,这样可以让那些不是由Javac产生的Class文件(如...原创 2019-08-10 16:49:30 · 283 阅读 · 0 评论