前言 该读书笔记用于记录在学习《深入理解Java虚拟机——JVM高级特性与最佳实践》一书中的一些重要知识点,对其中的部分内容进行归纳,主要是方便之后进行复习。 运行时数据区域 Java虚拟机在执行过程中会将其管理的内存划分为多个不同的数据区域。其中一些区域随着虚拟机启动而创建,一些区域生命周期则依赖用户线程的启动和结束。 下面是JDK1.7程序计数器 是一块较小的内存空间,用于记录当前线程所执行的字节码的行号,在执行过...
运行时内存模型相关内容参见 java 运行时内存模型 直接内存特征直接内存并非 JVMS 定义的标准 Java 运行时内存。 直接内存区域是全局共享的内存区域。 直接内存区域可以进行自动内存管理(GC),但机制并不完善。 本机的 Native 堆(直接内存) 不受 JVM 堆内存大小限制。 可能出现 OutOfMemoryError 异常。nioJDK1.4 加入了新的 NIO 机制,目的是防止 Java 堆 和 Native 堆之间往复的数据复制带来的性能损耗,此后 NIO 可以使用 Nativ...
本章文章目录什么是运行时区域 什么是内存模型 什么是运行时区域 java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 线程私有:指依赖用户线程的启动和结束而建立和销毁(线程拥有自己的内存) 线程共享:指随着虚拟机进程的启动而存在 如图所示:程序计数器(线程私有)当前线程所执行的字节码的行号指示器存在的原因:是由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,...
垃圾收集算法java中的内存是交给虚拟机管理的。要实现垃圾回收,必须考虑如下三个问题:1. 哪些内存需要回收?2. 什么时候回收?3. 怎么回收?对于第一点,往大了来说,是堆和方法区的内存需要回收。往具体了来说,是堆中哪些对象的内存可以回收了?方法区中哪些类的信息的内存可以回收了?要解答这两点问题,必须要有算法能够判断 哪些对象已“死”,哪些类的信息不再需要。对于第二点,则要在性能与效率中做好兼顾,不能过于频...
在许多情况下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与它的存储和通信子系统速度的差距太大, 大量的时间都花费在磁盘I/O、网络通信或者数据库访问上。 如果不希望处理器在大部分时间里都处于等待其他资源的状态,就必须使用一些手段去把处理器的运算能力 ” 压榨 ” 出来, 否则就会造成很大的浪费,而计算机同时处理几项任务则是最容易想到、也被证明是非常有效...
一,java虚拟机所管理的运行时数据区域分为:程序计数器、java虚拟机栈、本地方法栈、java堆、方法区、运行时常量池。 1,程序计数器:(线程私有、没有规定OutOfMemoryError) 程序计数器是一块较小的内存空间,它可以看做当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础...
文章目录运行时的数据区域一.程序计数器二.Java虚拟机栈局部变量表:操作数栈三.本地方法栈四.Java堆五.方法区(非堆)运行时常量池直接内存运行时的数据区域一.程序计数器 目的:作为当前线程所执行字节码的行号指示器 原理:通过字节码解释器改变计数器的值来选取下一条字节码指令 特点: 1.占用较小的内存空间 ? 2.每条线程需要一个独立的程序计数器 ? 3.Native方法不需要程序计数器,因为它不需要解释器 ? 4.不...
内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域。Java虚拟机规范将JVM所管理的内存分为以下几个运行时数据区:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区。下面详细阐述各数据区所存储的数据类型。程序计数器(Program Counter Register)一块较小的内存空间,它是当前线程所执行的字节码的行号指示器,字节码解释器工作时通过改变该计数器的值来选择下一条需要执行的字节码...
运行时内存区域主要分为以下几个部分:一、程序计数器 程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。字节码工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。 由于Java虚拟机的多线程是通过线程流转切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器都只会执行一条...
什么是Java内存模型 Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。在此之前,主流程序语言(如C/C++等)直接使用物理硬件和操作系统的内存模型,因此,会由于不同平台上内存模型的差异,有可能导致程序在一套平台上并发完全正常,而在另外一套平台上并发访问却经常出错,因此在某些场景下就不许针对不同的...
判断对象是否存活 1、引用计数法 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值加1,当引用失效时,计数器值减1, 任何时刻计数器为0的对象就是不可能再被使用的。 缺点:不能解决对象之间循环引用的问题 2、根搜索算法(GC Roots Tracing) 通过一系列名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。 可...