Java虚拟机
nisen6477
这个作者很懒,什么都没留下…
展开
-
Java内存区域及其生命周期
运行时数据区域Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存分为若干不同的数据区域,包括以下几个数据区域:1. 程序计数器程序计数器是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器,字节码工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码命令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。由于 Java 虚拟机的多...原创 2019-08-22 14:28:19 · 799 阅读 · 0 评论 -
Java对象创建及访问过程
HotSpot 虚拟机对象创建过程1. 对象的创建虚拟机创建对象和运行时数据区密切相关,在Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象通常仅仅是一个 new 关键字而已,那么在虚拟机中对象的创建过程是什么样的?虚拟机遇到一个 new 指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如...原创 2019-08-22 16:02:44 · 385 阅读 · 0 评论 -
OutOfMemoryError 异常产生原因及其解决方案
OutOfMemoryError 异常在 Java 虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其它几个运行时区域都有发生 OutOfMemoryError 异常的可能。Java 堆溢出Java 堆用于存储对象实例,只要不断地创建对象,并且保证 GC Roots 到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量达到最大堆的容量限制后就会产生内存溢出异常。测试代码测试如...原创 2019-08-22 17:46:25 · 19408 阅读 · 0 评论 -
Java 垃圾收集之判断对象是否存活
判断对象是否存活垃圾收集器工作前需要判断对象是否存活,那么垃圾收集器是如何判断的?判断标准又是什么?前面讲了 Java 内存区域各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭:栈中的栈帧随着方法进入和退出执行出栈和入栈操作。每个栈帧中分配多少内存基本是在类结构确定下来时就已知的,因此这几个区域内存分配以及回收都具备确定性,不需要过多考虑回收问题,因为方法结束或者线程...原创 2019-08-23 16:13:08 · 187 阅读 · 0 评论 -
Java 垃圾收集之垃圾收集算法及 HotSpot 算法实现
垃圾收集算法上一篇博我们探讨了垃圾收集时如何判断对象是否存活,这篇探讨一下垃圾收集器是怎么回收内存的,首先介绍三种垃圾收集算法。标记 - 清除算法最基础的收集算法是“标记 - 清除”(Mark-Sweep)算法,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记后统一回收所有被标记的对象。这种方式有两个不足:一个是效率低,另一个就是空间问题,清除之后会产生大量不连续的内...原创 2019-08-23 17:25:18 · 174 阅读 · 0 评论 -
Java 垃圾收集之垃圾收集器介绍
垃圾收集器垃圾收集器有并行、并发的,解释一下这两个名词:并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。并发(Concurrent):指用户线程与垃圾收集器线程同时执行(但并不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集器运行于另一个 CPU 上。垃圾收集器是内存回收的具体实现,HotSpot 虚拟机包含的收集器如图:上图中有...原创 2019-08-28 16:57:56 · 325 阅读 · 0 评论 -
Java 垃圾收集之内存分配与回收策略
内存分配与回收策略Java 体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。对象的内存分配,往大方向讲就是在堆上分配,对象主要分配在新生代的 Eden 区上,如果启动了本地线程分配缓冲,将按线程优先在 TLAB 上分配。少数情况下也可能直接分配到老年代,分配的规则取决于使用哪一种垃圾收集器组合以及虚拟机中与内存相关的参数设置。介绍一下两...原创 2019-08-28 18:08:37 · 160 阅读 · 0 评论 -
Java 程序编译与代码优化之运行期优化
文章目录程序编译与代码优化运行期优化HotSpot 虚拟机内的即时编译器解释器与编译器编译对象与触发条件方法调用计数器回边计数器程序编译与代码优化Java 对于程序的优化包含了编译期优化与运行期优化,其中编译器优化主要是提高了开发效率,比如自动装箱/拆箱、泛型、循环遍历等。运行期优化就是对代码转换为本地机器码的优化,可以提升程序运行速度。运行期优化Java 程序最初是通过解释器进行解释执行...原创 2019-09-03 14:30:55 · 815 阅读 · 1 评论 -
Java 程序编译与代码优化之编译优化技术
文章目录编译优化技术公共子表达式消除数组边界检查消除方法内联逃逸分析编译优化技术以一段代码来说明编译器是怎么优化代码的:优化前的原始代码:static class B { int value; final int get() { return value; }}public void foo() { y = b.get(); // ...do stuff... z =...原创 2019-09-03 15:59:12 · 481 阅读 · 0 评论 -
高效并发之 Java 内存模型
文章目录Java 内存模型硬件的效率与一致性Java 内存模型主内存与工作内存内存间交互操作对于 volatile 型变量的特殊规则原子性、可见性与有序性先行发生原则Java 内存模型物理计算机中的并发问题与虚拟机中的情况有不少相似之处,物理机对并发的处理方案对于虚拟机的实现也有相当大的参考意义,所以我们先来了解一下物理计算机中的并发问题。硬件的效率与一致性物理计算机中,绝大多数的运算任务...原创 2019-09-05 13:11:47 · 151 阅读 · 0 评论 -
高效并发之 Java 与线程
文章目录Java 与线程线程的实现Java 线程调度状态转换Java 与线程线程的实现实现线程主要有3种方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。使用内核线程实现内核线程(Kernel-Level Thread,KLT)就是直接由操作系统内核支持的线程,这种线程由内核来完成线程切换,内核通过调度器对线程进行调度,并负责将线程的任务映射到各个处理器上。...原创 2019-09-05 15:52:54 · 157 阅读 · 0 评论 -
高效并发之线程安全
文章目录线程安全Java 语言中的线程安全线程安全的实现方法线程安全当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其它的协调工作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。简单来说,如果一个对象可以安全的被多个线程同时使用,那他就是线程安全的。Java 语言中的线程安全线程安全的话题是建立在多...原创 2019-09-06 15:00:58 · 439 阅读 · 0 评论 -
高效并发之锁优化
文章目录锁优化自旋锁与自适应自旋锁消除锁粗化轻量级锁偏向锁锁优化HotSpot 虚拟机实现了各种锁优化技术,如适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁粗化(Lock Coarsening)、轻量级锁(Lightweight Locking)和偏向锁(Biased Locking)等,这些技术都是为了在线程之间更高效地共享数据,以解决竞争问...原创 2019-09-06 16:52:51 · 466 阅读 · 0 评论 -
类加载器与双亲委派模型
文章目录类加载器类与类加载器双亲委派模型类加载器虚拟机设计团队把类加载阶段中的 “通过一个类的全限定名来获取描述此类的二进制字节流” 这个动作放到 Java 虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为 “类加载器”。类与类加载器类加载器虽然只用于实现类的加载动作,但它在 Java 程序中起到的作用却远远不限于类加载阶段。对于任意一个类,都需要由...原创 2019-09-11 15:04:55 · 388 阅读 · 0 评论