
jvm虚拟机
文章平均质量分 83
栋先生
Java程序员,努力学习,早日成为大神!
展开
-
十二、内存分配与回收策略
https://my.oschina.net/cimu/blog/1546528对象优先在Eden分配大多数情况下,对象在新生代Eden区中分配。当Eden区没有足够空间进行分配时,虚拟机将发起一次Minor GC。虚拟机提供了-XX:+PrintGCDetails这个收集器日志参数,告诉虚拟机在发生垃圾收集行为时打印内存回收日志,并且在进程退出的时候输出当前的内存各区域分配情况。在实际应用...原创 2019-11-29 21:43:29 · 369 阅读 · 0 评论 -
十一、GC日志详解
每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样。原创 2017-04-16 22:32:09 · 1088 阅读 · 0 评论 -
十三、JDK的命令行工具
前面的博文我们介绍了一些关于jvm的一些基础知识,本文介绍一些jdk的命令行工具,通过这些工具我们可以对运行日志、异常堆栈、GC日志、线程快照(threaddump/javacore 文件)、堆转储快照(heapdump/hprof 文件)等文件进行分析,从而定位解决问题。 jdk的彬目录中有许多命令行工具,其中java.exe、javac.exe这两个命令行工具是我们最熟悉的。同时,还有其他的许原创 2017-04-16 22:33:59 · 1533 阅读 · 0 评论 -
Java内存模型
一、硬件的内存模型和指令重排序二、Java内存模型2.1 主内存与工作内存2.2 内存间交互操作2.3 对于long和double型变量的特殊规则2.3 Java内存模型的三大特征原子性可见性有序性多任务处理在现代计算机操作系统中几乎已经是一项必备的功能了。计算机cpu的运算速度与它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O、网络通信...原创 2018-07-08 16:09:56 · 350 阅读 · 0 评论 -
volatile变量详解
一、可见性二、禁止重排序三、java内存模型对volatile的特殊规则关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易完全被正确、 完整地理解,以至于许多程序员都习惯不去使用它,遇到需要处理多线程数据竞争问题的时候一律使用synchronized来进行同步。 当一个变量定义为volatile之后,它将具备两种特性:一是可见性,二是会禁...原创 2018-07-08 16:14:17 · 4471 阅读 · 2 评论 -
先行发生原则(happens-before)介绍
一、什么是先行发生原则二、Java内存模型中的先行发生关系三、如何应用先行发生规则如果Java内存模型中所有的有序性都仅仅靠volatile和synchronized来完成,那么有一些操作将会变得很烦琐,但是我们在编写Java并发代码的时候并没有感觉到这一点,这是因为Java语言中有一个“先行发生”(happens-before)的原则。 这个原则非常重要,它是判断数据是...原创 2018-07-08 16:15:25 · 3271 阅读 · 2 评论 -
线程的实现方式
一、线程的三种实现方式1. 使用内核线程实现优点缺点2. 使用用户线程实现优点缺点3. 使用用户线程加轻量级进程混合实现优点:二、Java线程的实现本文主要介绍线程的3种实现方式和java线程的实现方式。线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配 和执行调度分开,各个进程既可以共享进程资源(内存地址、文件I/O等)...原创 2018-07-08 16:16:54 · 3308 阅读 · 0 评论 -
Java线程调度与线程优先级
一、线程调度1.1 协同式线程调度1.2 抢占式线程调度二、线程优先级三、线程中的状态转换一、线程调度线程调度是指系统为线程分配处理器使用权的过程,主要调度方式有两种,分别是协同式线程调度和抢占式线程调度。1.1 协同式线程调度协同式线程调度,线程的执行时间由线程本身控制。协同式线程调度,线程执行时间由线程本身来控制,线程把自己的工作执行完之后,...原创 2018-07-08 16:19:17 · 3503 阅读 · 0 评论 -
线程安全
一、什么是线程安全?二、java语言中的线程安全三、线程安全的实现方法1. 互斥同步Java中实现互斥同步的两种方法缺点2. 非阻塞同步缺点3. 无同步方案四、锁优化1. 自旋锁与自适应自旋2. 锁消除3. 锁粗化4. 轻量级锁加锁过程解锁过程注意事项5. 偏向锁加锁过程偏向锁的撤销注意事项轻量级锁、偏向锁的状态转化...原创 2018-07-08 16:22:33 · 836 阅读 · 0 评论 -
八、java对象和方法区的垃圾回收
即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法.原创 2017-04-16 22:30:08 · 1917 阅读 · 0 评论 -
七、引用(reference)详解
什么是引用?如果reference类型的数据中存储的数值代表的是另外一块内存的起始地址,就称这块内存代表着一个引用。引用不等同于对象本身,根据虚拟机种类的不同,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置。原创 2017-03-31 20:31:25 · 16244 阅读 · 0 评论 -
九、垃圾回收算法
本文主要介绍垃圾收集算法的思想及其发展过程。1. 标记-清除算法(Mark-Sweep)2. 复制算法 (Copying)3. 标记-整理算法(Mark-Compact)4. 分代收集算法 (Generational Collecting)原创 2017-04-03 22:01:59 · 547 阅读 · 0 评论 -
十、垃圾收集器
如果说垃圾回收算法是内存回收的方法论,那么垃圾回收器就是内存回收的具体实现。 HotSpot中总共有7种收集器,本文逐一介绍这些收集器的特性、基本原理和使用场景。原创 2017-04-03 22:04:10 · 624 阅读 · 0 评论 -
二、OutOfMemoryError实战
本文通过一些可执行代码来验证异常发生的场景,并且会初步介绍几个与内存相关的最基本的虚拟机参数。 本文的主要目的有两个: 1. 通过代码验证Java虚拟机规范中描述的各个运行时区域储存的内容。 2. 希望读者在工作中遇到实际的内存溢出异常时,能根据异常的信息快速判断是哪个区域的内存溢出,知道怎样的代码可能会导致这些区域的内存溢出,以及出现这些异常后该如何处理。原创 2017-04-16 22:27:46 · 1819 阅读 · 1 评论 -
三、JVM之对象的创建
上篇博文中已经介绍过了jvm内存的概况,接下来我们从jvm的角度来重新来认识一下Java对象是如何创建。 Java是一门面向对象的语言,在Java程序运行的时候无时无刻都有对象的产生。在 语言方面 ,创建一个对象仅仅是一个new关键字而已。那么在 虚拟机中 ,对象(仅指普通对象,不包括数组和Class对象等)的创建又是一个怎么样的过程呢?一、 类加载虚拟机遇到一条new指令时,首先将...原创 2017-03-20 12:57:05 · 657 阅读 · 0 评论 -
四、Java对象的内存布局
上篇博客介绍的对象的创建过程,本文来介绍一下对象的组成结构。 在HotSpot虚拟机中,对象在内存中的布局划分为3个区域:对象头(Header),实例数据(Instance Data)以及对齐填充(Padding)。对象头HotSpot虚拟机对象的对象头一般包含两部分信息。第一部分用于存储对象自身的运行时数据,例如HashCode、GC分代年龄等信息。在32位和64位的JVM中...原创 2017-03-31 20:26:15 · 648 阅读 · 2 评论 -
五、Java对象的访问定位
Java对象在访问的时候,我们需要通过java虚拟机栈的reference类型的数据去操作具体的对象。由于reference类型在java虚拟机规范中只规定了一个对象的引用,并没有定义这个这个引用应该通过那种方式去定位、访问java堆中的具体对象实例,所以一般的访问方式也是取决与java虚拟机的类型。目前主流的访问方式有通过句柄和直接指针两种方式。原创 2017-03-31 20:27:39 · 554 阅读 · 0 评论 -
JVM概述
Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制。JVM实现了Java语言最重要的特征:即平台无关性,同时学习JVM也是一个java程序员在成长过程中的必经之路。本系列博客总结了LZ在学习JVM时的一些经验和面试要点,希望可以帮助到大家。原创 2017-04-17 21:54:24 · 1271 阅读 · 0 评论 -
一、JVM内存区域详解
Java中虚拟机在执行Java程序的过程中会将它所管理的内存区域划分为若干不同的数据区域。下面来介绍几个运行时数据区域。 一、程序计数器1.1 简述程序计数器(Program Counter Register)是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。1.2 作用大家都知道,Java程序从源文件创建到程序运行要经过两大步骤: 1...原创 2017-03-18 21:21:31 · 884 阅读 · 0 评论 -
六、jvm之如何判断对象已死?
在堆里面几乎存放中Java程序运行所动态生成的所有对象,垃圾回收器在对堆进行回收前,第一件事情就是要确定这些对象之中还有哪些存活,哪些已经死去(即不可能再被任何途径使用的对象)。判断的方式有两种:引用计数算法和可达性算法。 目前虚拟机基本都是采用 可达性算法,为什么不采用引用计数算法呢?下面就说说引用计数法是如何统计所有对象的引用计数的,再对比分析可达性算法是如何解决引用技术算法的不足。原创 2017-03-31 20:29:19 · 901 阅读 · 0 评论