JVM
文章平均质量分 87
我爱袁婷
这个作者很懒,什么都没留下…
展开
-
深入理解JAVA虚拟机读书笔记:Java内存区域
目录概述运行时数据区1、程序计数器2、Java虚拟机栈3、本地方法栈4、java堆5、方法区6、运行时常量池7、直接内存HotSpot虚拟机对象探秘1、对象的创建2、对象的内存布局。对象头实例数据对齐填充3、对象的访问定位句柄方式直接指针方式概述对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个...原创 2018-11-22 16:32:57 · 200 阅读 · 0 评论 -
基于JDK命令行工具的监控。
前言不会JVM调优的程序员不是一个好Java程序员。一、JVM调优命令大全jpsJVM Process Status Tool,显示指定系统内所有的HotSpot虚拟机进程.命令格式jps [options] [hostid]Option参数-l : 输出主类全名或jar路径-q : 只输出LVMID-m : 输出JVM启动时传递给main()的参数-v : 输出JVM启动...原创 2019-01-17 14:08:12 · 321 阅读 · 0 评论 -
深入理解JAVA虚拟机读书笔记:类加载器
前言类加载器是Java语言的一个创新,也是Java语言流行的重要原因之一。它使得Java类可以被动态加载到Java虚拟机中并执行。类加载器从JDK1.0就出现了,最初是为了满足Java Applet的需要而开发出来的。Java Applet需要从远程下载Java类文件到浏览器中并执行。现在类加载器在Web容器和OSGi中得到了广泛的使用。一般来说,Java应用的开发人员不需要直接同类加载器进行交...原创 2018-12-10 10:31:39 · 150 阅读 · 0 评论 -
深入理解JAVA虚拟机读书笔记:虚拟机加载机制
前言虚拟机把描述类的数据和Class文件加载进内存,并对数据进行效验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。一、类加载的时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段。其中验证、准备、解析3个部分统称为连接。加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,...原创 2018-12-06 17:31:51 · 131 阅读 · 0 评论 -
深入理解JAVA虚拟机读书笔记:内存分配与回收策略。
前言对象的分配,往大方面讲,就是在堆上分配(但也有可能经过JIT编译后被拆散为标量类型并间接地在栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配(只是每个线程在不同的TLAB上分配对象,在分配的角度上是线程私有的,在回收的角度上TLAB实际上也是在Eden区上)。少数情况下也可能会直接分配在老年代中,分配规则并不是百分百固定的,其细节取决于...原创 2018-12-03 16:25:53 · 203 阅读 · 0 评论 -
深入理解JAVA虚拟机读书笔记:G1收集器入门
前言在官网中,是这样描述G1的:The Garbage-First (G1) collector is a server-style garbage collector,targeted for multi-processor machines with large memories. It meetsgarbage collection (GC) pause time goals wi...转载 2018-12-02 16:54:00 · 1001 阅读 · 0 评论 -
深入理解JAVA虚拟机读书笔记:HotSpot虚拟机对象探秘
HotSpot虚拟机对象探秘1、对象的创建虚拟机遇到一条new指令时,首先将去检查这个指令的参数是否能在常量池中定位这个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化过。如果没有,那必须先执行响应的类加载过程。(类加载会在后面的章节给出)。在类加载检查通过后,虚拟机将会为新生对象分配内存。对象所需的内存的大小在类加载完成后便可完全确定,为对象分配空间的任务等同于...原创 2018-11-27 20:33:30 · 222 阅读 · 0 评论 -
深入理解JAVA虚拟机读书笔记:垃圾收集器
上一篇文章我们讲了很多关于垃圾回收的算法,这一篇我们一起来看看垃圾收集器是如何来实现他们的。一、垃圾收集器的组合在jdk7后,HotSpot虚拟机所有的垃圾收集器和组合如下。1、图中他们所在的区域表明他们是属于新生代收集器还是老年代收集器:新生代收集器:Serial、ParNew、ParallelScavenge老年代收集器:CMS、SerialOld、ParallelOld整堆收集...原创 2018-12-01 15:34:16 · 242 阅读 · 0 评论 -
G1垃圾收集器之SATB
对象漏标垃圾回收的并发标记阶段,GC线程和应用线程是并发执行的,所以一个对象被标记之后,应用线程可能篡改对象的引用关系,从而造成对象的漏标、误标,其实误标没什么关系,顶多造成浮动垃圾,在下次GC还是可以回收的,但是漏标的后果是致命的,把本应该存活的对象给回收了,从而影响了程序的正确性。为了解决在并发标记过程中,存活对象漏标的情况,GC HandBook把对象分成三种颜色:1、黑色:自身以及可...转载 2018-12-02 19:32:53 · 2792 阅读 · 0 评论 -
JVM源码分析之线程局部缓存TLAB
前言介绍TLAB之前先思考一个问题:创建对象时,需要在堆上申请指定大小的内存,如果同时有大量线程申请内存的话,可以通过CAS乐观锁机制确保不会申请到同一块内存,在JVM运行中,内存分配时一个极其频繁的动作,这种方式势必会降低性能。因此,在HotSpot1.6的实现中引入了TLAB技术。什么是TLABTLAB全称ThreadLocalAllocationBuffer,是线程的一块私有内存,...转载 2018-12-02 16:54:08 · 237 阅读 · 0 评论 -
深入理解JAVA虚拟机读书笔记:HotSpot的算法实现
上一篇我们学习了判断对象是否存活的一些算法,主要就是可达性分析算法。这篇来讲讲HotSpot的算法实现。一、枚举根节点我们知道在可达性分析算法中是需要有GC Roots节点,可作为GC Roots的节点主要在全局性的引用(例如常量或静态变量,这部分数据存储在方法区)与执行上下文(例如栈帧的局部变量表)中,现在很多应用仅仅方法区就有数百兆,如果要逐个检查这里面的引用,那么必然会消耗很多时间。而...原创 2018-11-26 16:49:46 · 158 阅读 · 0 评论 -
深入理解JAVA虚拟机读书笔记:垃圾收集与垃圾收集算法
概述我们需要思考三个问题:1、哪些内存需要回收?2、什么时候回收?3、如何回收?一、哪些内存需要回收?在Java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,这部分不需要过多考虑回收问题。垃圾收集器主要关注的是Java堆中内存回收。二、什么时候回收判断对象是否存活的算法:1、引用计数算法给对象添加一个引用计数器,每一个地方引用它...原创 2018-12-01 15:33:42 · 182 阅读 · 0 评论 -
字节码层面i++,++i以及线程安全问题。
前言在前面的文章我们讲过JVM的内存结构,虚拟机栈和Java堆,这章我们通过字节码指令来观察两者的差异。一、准备工作代码如下:public class Main { int count = 0; public static void test1() { } public void test2() { int i = 0; ...原创 2019-02-02 22:16:21 · 1280 阅读 · 0 评论