![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java虚拟机
Crazy Monkey
这个作者很懒,什么都没留下…
展开
-
垃圾收集器
如果说收集算法是内存回收的方法论,垃圾收集器就是内存回收的具体实现。 Serial 收集器 Serial 收集器是最基本、历史最悠久的收集器。这个收集器是一个单线程收集器,但它的 “单线程” 的意义并不仅仅是说明它只会使用一个 CPU 或者一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程(Sun 将这件事情称之为 “Stop The Wo...原创 2019-01-03 16:54:57 · 184 阅读 · 0 评论 -
字节码指令简介
Java虚拟机的指令由一个字节长度的、 代表着某种特定操作含义的数字(称为操作码,Opcode)以及跟随其后的零至多个代表此操作所需参数(称为操作数,Operands)而构成。字节码指令集是一种具有鲜明特点、优劣势都很突出的指令集架构:由于限定了Java虚拟机操作码的长度为1个字节,指令集的操作码不能超过256条。 Class文件格式放弃了编译后代码中操作数长度对齐,这就意味者虚拟机处理...原创 2019-01-13 22:59:31 · 1007 阅读 · 0 评论 -
HotSpot的算法实现
一、枚举根节点 从可达性分析中从GC Roots节点找引用链这个操作为例,可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,现在很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很多时间。 另外,可达性分析对执行时间的敏感还体现在GC停顿上,因为这项分析工作在一个能确保一致性的快照中进行——这...原创 2019-01-03 14:29:39 · 160 阅读 · 0 评论 -
垃圾收集算法
标记-清除算法算法的执行过程与名字一样,先标记所有需要回收的对象,在标记完成后统一回收所有被标记的对象。该算法有两个问题:标记和清除过程效率不高。主要由于垃圾收集器需要从GC Roots根对象中遍历所有可达的对象,并给这些对象加上一个标记,表明此对象在清除的时候被跳过,然后在清除阶段,垃圾收集器会从Java堆中从头到尾进行遍历,如果有对象没有被打上标记,那么这个对象就会被清除。显然遍历的效率...原创 2019-01-02 22:30:18 · 115 阅读 · 0 评论 -
Java引用分类(强、软、弱、虚)
强引用就是指在程序代码之中普遍存在的,类似“Objcct obj = ncew Obicct()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。软引用是用来描述一些还有 用但并非必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出异常之前, 将会把这些对象列进回收范围之中进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。在JDK 1.2之后,提供了So...原创 2019-01-02 22:17:02 · 287 阅读 · 0 评论 -
判断Java对象是否存活
判断对象是否存活的算法包括:引用计数算法 可达性分析算法引用计数算法(Reference Counting)给对象中添加一个引用计数器,每当有一个地方引用它时,计数器加1;当引用失效时,计数器值减1;任何时刻计数器为0的对象就是不能再被引用的。例如Object-C,Python语音使用引用计数算法进行内存管理。Java虚拟机没有选用引用计数器算法来管理内存,其中最主要的原有是它很难解决...原创 2019-01-02 22:06:17 · 291 阅读 · 0 评论 -
HotSpot虚拟机对象探索
一、对象的创建1.检查虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。2.分配内存在类加载检查通过后,接下来虚拟机将为新生对象分配内存。假设Java堆中内存是绝对规整的,所有用过的内存都放在一边,空闲的内存放在另一边,中间放着一个指针作为分界...原创 2019-01-02 20:57:09 · 127 阅读 · 0 评论 -
Java内存区域(运行时数据区域)
Java运行时数据区 1.程序计数器程序计数器(Program Counter Register)是一块较小的内存空间,它可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令、分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数...原创 2019-01-02 20:22:27 · 139 阅读 · 0 评论 -
JVM中的直接引用和符号引用
类在虚拟机中的生命周期如下:加载、验证、准备、解析、初始化、使用和卸载7个阶段。在解析阶段Class文件中的符号引用被替换为运行时常量池中的直接引用。常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。1.符号引用(Symbolic References): 符号引用以一...原创 2019-01-02 20:02:16 · 281 阅读 · 0 评论 -
一、走进Java
1.Java技术体系结构广义上讲,所有运行于java虚拟机上的语言和相关程序都属于Java技术体系结构的一员。传统意义上讲,Sun公司定义的Java技术体系包括以下几个组成部分:Java程序设计语言 Java虚拟机 Class文件格式 Java API 类库 第三方Java类库tips: JDK:Java程序设计语言、Java虚拟机、Java API 类库JRE...原创 2019-01-02 17:08:13 · 151 阅读 · 0 评论 -
Class文件属性表集合详解
1.code属性最常用的属性恐怕就是Code属性了,因为大多数的方法都会有编译后的字节码指令,这些指令就存储在方法表中的Code属性中。如果一个Java程序的信息可以分为代码(方法体中的代码)和元数据(包括类、字段、方法定义以及其它信息),那么Code属性存储的就是代码,其它所有的结构存储的都是元数据。不过并非所有的方法表都有这个Code属性,比如接口或抽象类中的方法表就不存在Code属性(J...原创 2019-01-05 17:32:14 · 1773 阅读 · 0 评论 -
Class类文件的结构
Class文件是一组以8位字节(8-bit bytes)为基础的二进制流,各个数据项目严格按照顺序紧凑地排列在class文件中,中间没有任何分隔符,这点和png、jpg等图片文件格式类似。当遇到需要占用8位字节以上空间的数据项时,则会按照一定的字节顺序分隔为若干个8位字节进行存储。Java虚拟机规范规定Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型...原创 2019-01-05 17:10:07 · 281 阅读 · 0 评论 -
年轻代,老年代,永久代
首相明确一点,年轻代和老年代属于堆;永久代属于在Hotspot虚拟机下对方法区的实现,并不存在于堆中。 在 Java 中,堆被划分成两个不同的区域:新生代 ( Young )、老年代 ( Old)。新生代 ( Young ,垃圾回收器都采用复制算法) 又被划分为三个区域:Eden和两块Survivor(S0、S1)。每次使用Eden和一块Survivor,当回收时将Eden和Survi...原创 2019-01-04 11:31:37 · 1653 阅读 · 0 评论 -
永久代和元空间
永久代“PermGen space”其实指的就是方法区。不过方法区和“PermGen space”又有着本质的区别。前者是 JVM 的规范,而后者则是 JVM 规范的一种实现,并且只有 HotSpot 才有 “PermGen space”,而对于其他类型的虚拟机,如 JRockit(Oracle)、J9(IBM) 并没有“PermGen space”。由于方法区主要存储类的相关信息,所以对于动...原创 2019-01-04 09:24:38 · 232 阅读 · 0 评论 -
内存分配与回收策略
Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。对象的内存分配,往大方向讲,就是在堆上分配,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参...原创 2019-01-03 18:57:15 · 144 阅读 · 0 评论 -
垃圾收集器参数总结
参数 描述 -XX:+UseSerialGC Jvm运行在Client模式下的默认值,打开此开关后,使用Serial + Serial Old的收集器组合进行内存回收 -XX:+UseParNewGC 打开此开关后,使用ParNew + Serial Old的收集器进行垃圾回收 -XX:+UseConcMarkSweepGC 使用ParNew +...原创 2019-01-03 17:18:06 · 158 阅读 · 0 评论 -
理解GC日志
33.125:[GC [DefNew:3324K->152K(3712K),0.0025925 secs]3324K->152K(11904K),0.0031680 secs]100.667:[Full GC [Tenured:0K->210K(10240K),0.0149142secs]4603K->210K(19456K),[Perm:2999K->2999K(21248K)],0.015...原创 2019-01-03 17:10:02 · 149 阅读 · 0 评论 -
虚拟机类加载机制
在Java语言中,类型的加载、连接、初始化是在程序运行期间完成的,因此Java天生就具有动态扩展的特性。类加载的基本流程这七个阶段按序开始,但不意味着一个阶段结束另一个阶段才能开始。也就是说,不同的阶段往往是穿插着进行的,加载阶段中可能会激活验证的开始,而验证阶段又有可能激活准备阶段的赋值操作等,但整体的开始顺序是不会变的。而解析阶段则不一定:它在某些情况下可以在初始...原创 2019-01-14 01:53:16 · 179 阅读 · 0 评论