随笔分类 -  JVM

对JVM的学习总结记录
摘要:TLAB产生的原因 堆区是线程共享区域,任何线程都可以访问到堆区中的共享数据 由于对象实例的创建在JVM中非常频繁,因此在并发环境下从堆区中划分内存空间是线程不安全的 为避免多个线程操作同一地址,需要使用加锁等机制,进而影响分配速度 TLAB是什么 从内存模型而不是垃圾收集的角度,对Eden区域继续 阅读全文
posted @ 2020-06-10 09:56 叮叮叮叮叮叮当 阅读(839) 评论(0) 推荐(0)
摘要:概述 如果对象在Eden出生并经过第一次Minor GC后依然存活,并且能被Survivor容纳的话,将被移动到Survivor空间中,把那个将对象年龄设为1,对象在Survivor区中每熬过一次MinorGC,年龄就增加一岁,当它的年龄增加到一定程度(默认15岁,其实每个JVM、每个GC都有所不同 阅读全文
posted @ 2020-06-09 17:21 叮叮叮叮叮叮当 阅读(559) 评论(0) 推荐(0)
摘要:分类 针对hotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC) 部分收集:不是完整收集整个Java堆的垃圾收集。其中又分为: 新生代收集(Minor GC/Young GC):只是新生代的垃圾收集 老年代收集( 阅读全文
posted @ 2020-06-09 17:09 叮叮叮叮叮叮当 阅读(370) 评论(0) 推荐(0)
摘要:一般情况 new的对象先放伊甸园区,此区有大小限制 当伊甸园的空间填满时,程序又需要创建对象,出发GC(Minor GC),将伊甸园区中的不再被其他对象所引用的对象进行销毁。再加载新的对象放到伊甸园区 然后将伊甸园中的剩余对象移动到幸存者0区 如果再次触发垃圾回收,此时上次幸存下来的放到幸存者0区的 阅读全文
posted @ 2020-06-09 16:39 叮叮叮叮叮叮当 阅读(388) 评论(0) 推荐(0)
摘要:概述 存储在JVM中的java对象可以被划分为两类: 一类是生命周期较短的瞬时对象,这类对象的创建和消亡都非常迅速 另外一类对象时生命周期非常长,在某些情况下还能与JVM的生命周期保持一致 Java堆区进一步细分可以分为年轻代(YoungGen)和老年代(OldGen) 其中年轻代可以分为Eden空 阅读全文
posted @ 2020-06-09 16:27 叮叮叮叮叮叮当 阅读(407) 评论(0) 推荐(0)
摘要:设置 Java堆区用于存储java对象实例,堆的大小在jvm启动时就已经设定好了,可以通过 "-Xmx"和 "-Xms"来进行设置 -Xms 用于表示堆的起始内存,等价于 -XX:InitialHeapSize -Xms 用来设置堆空间(年轻代+老年代)的初始内存大小 -X 是jvm的运行参数 ms 阅读全文
posted @ 2020-06-09 16:12 叮叮叮叮叮叮当 阅读(1016) 评论(0) 推荐(0)
摘要:概述 一个进程对应一个JVM实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器、本地方法栈和虚拟机栈 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了。是JVM管理的最大一块内存空间 阅读全文
posted @ 2020-06-09 16:04 叮叮叮叮叮叮当 阅读(536) 评论(2) 推荐(0)
摘要:本地方法接口 简单来讲,一个Native Method就是java调用非java代码的接口,一个Native Method 是这样一个java方法:该方法的实现由非Java语言实现,比如C。这个特征并非java特有,很多其他的编程语言都有这一机制,比如在C++ 中,你可以用extern “C” 告知 阅读全文
posted @ 2020-06-09 15:16 叮叮叮叮叮叮当 阅读(291) 评论(0) 推荐(0)
摘要:本地方法栈 Java虚拟机栈用于管理Java方法的调用,而本地方法栈用于管理本地方法的调用 本地方法栈,也是线程私有的。 允许被实现成固定或者是可动态拓展的内存大小。(在内存溢出方面是相同的) 如果线程请求分配的栈容量超过本地方法栈允许的最大容量,Java虚拟机将会抛出一个StackOverFlow 阅读全文
posted @ 2020-06-09 15:02 叮叮叮叮叮叮当 阅读(330) 评论(0) 推荐(0)
摘要:Q:举例栈溢出的情况?(StackOverflowError) A:递归调用等,通过-Xss设置栈的大小 Q:调整栈的大小,就能保证不出现溢出么? A:不能,如递归无限次数肯定会溢出,调整栈大小只能保证溢出的时间晚一些 Q:分配的栈内存越大越好么? A:不是 会挤占其他线程的空间 Q:垃圾回收是否会 阅读全文
posted @ 2020-06-09 14:57 叮叮叮叮叮叮当 阅读(226) 评论(0) 推荐(0)
摘要:每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返回地址(Return Address) (或方法正常退出或者异常退出的引用的定义) 一些附加信息 一 阅读全文
posted @ 2020-06-09 14:40 叮叮叮叮叮叮当 阅读(376) 评论(0) 推荐(0)
摘要:每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返回地址(Return Address) (或方法正常退出或者异常退出的引用的定义) 一些附加信息 动 阅读全文
posted @ 2020-06-05 18:02 叮叮叮叮叮叮当 阅读(2722) 评论(2) 推荐(0)
摘要:每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返回地址(Return Address) (或方法正常退出或者异常退出的引用的定义) 一些附加信息 动 阅读全文
posted @ 2020-06-05 17:53 叮叮叮叮叮叮当 阅读(6053) 评论(0) 推荐(1)
摘要:每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返回地址(Return Address) (或方法正常退出或者异常退出的引用的定义) 一些附加信息 操 阅读全文
posted @ 2020-06-05 16:07 叮叮叮叮叮叮当 阅读(846) 评论(0) 推荐(0)
摘要:每个栈帧中包含: 局部变量表(Local Variables) 操作数栈(Opreand Stack) 或表达式栈 动态链接 (Dynamic Linking) (或指向运行时常量的方法引用) 动态返回地址(Return Address) (或方法正常退出或者异常退出的引用的定义) 一些附加信息 局 阅读全文
posted @ 2020-06-05 15:50 叮叮叮叮叮叮当 阅读(2020) 评论(0) 推荐(0)
摘要:虚拟机栈即是程序运行时的单位,而堆是数据存储的单位。换句话说,栈解决的是程序运行的问题,即程序如何执行,如何处理数据,而堆是解决数据的存储问题,数据存在哪,放在哪 虚拟机栈细节如下图所示,其中当前栈帧中包含 局部变量表、操作数栈、动态链接、本地返回值。另外对于栈来说,每个线程在创建时都会创建一个虚拟 阅读全文
posted @ 2020-06-05 15:06 叮叮叮叮叮叮当 阅读(443) 评论(0) 推荐(0)
摘要:程序计数器(PC Register) 这里的计数器(Program Counter Register)并非为广义上所指的物理寄存器,JVM中的PC寄存器(程序计数器)是对物理PC寄存器的一种抽象模拟,相当于IDE中的光标索引值,行号,表示当前正在编辑的行号。 PC寄存器用来存储指向下一条指令的地址, 阅读全文
posted @ 2020-06-04 14:26 叮叮叮叮叮叮当 阅读(789) 评论(0) 推荐(1)
摘要:运行时数据区 class文件使用类加载子系统进行加载,经过加载、链接、初始化三个过程后进入方法区。接下来需要使用执行引擎进行执行并依赖于运行时数据区 如图所示,相同灰色为线程私有,绿色为多个线程共享的 线程是一个程序里的运行单元,jvm允许一个应用有多个线程并行执行,即多线程思想。每个线程独立包括程 阅读全文
posted @ 2020-06-04 12:34 叮叮叮叮叮叮当 阅读(361) 评论(0) 推荐(0)
摘要:类加载子系统 类加载子系统的主要功能是将本地物理文件加载到内存中,其结构如下所示: 1、加载(Loading) 通过一个类的全限定名获取定义此类的二进制文件字节流。 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。 在内存中生成一个代表这个类的java.lang.Class对象,作为方 阅读全文
posted @ 2020-06-04 11:12 叮叮叮叮叮叮当 阅读(493) 评论(0) 推荐(0)
摘要:整个jvm的运行流程图如上所示,首先需要进行加载class文件,然后使用类加载子系统将class翻译解析导入内存,在内存中分别导入到对应的运行时数据区,然后执行引擎开始执行,对于需要的数据在对应的区域进行获取。 本文基于Hotspot虚拟机,采用的是解释器与即时编译器(JIT)并存的架构。 整体的结 阅读全文
posted @ 2020-06-04 10:36 叮叮叮叮叮叮当 阅读(501) 评论(0) 推荐(0)