Archive | jvm RSS feed for this section

最简单例子图解JVM内存分配和回收

一、简介

JVM采用分代垃圾回收。在JVM的内存空间中把堆空间分为年老代和年轻代。将大量(据说是90%以上)创建了没多久就会消亡的对象存储在年轻代,而年老代中存放生命周期长久的实例对象。年轻代中又被分为Eden区(圣经中的伊甸园)、和两个Survivor区。新的对象分配是首先放在Eden区,Survivor区作为Eden区和Old区的缓冲,在Survivor区的对象经历若干次收集仍然存活的,就会被转移到年老区。

jvm-memory-generation

doudou-closet

简单讲,就是生命期短的对象放在一起,将少数生命期长的对象放在一起,分别采用不同的回收策略。生命

期短的对象回收频率比较高,生命期长的对象采用比较低回收频率,生命期短的对象被尝试回收几次发现还存活,则被移到另外一个地方去存起来。就像现在夏天了,勤劳的doumadoudoudouba常穿的衣服放在顺手的地方,把冬天的衣服打包放在柜子

另一个地方。虽然把doudo[......]

阅读全文

Tags: , ,

Comments { 3 }

jvm笔记之GC

基于《深入理解java虚拟机 jvm高级特性与最佳实践》整理的笔记要点,谢谢作者。

  1. 当需要排查各种内存溢出、内存泄露问题时,或者发现gc成为并发瓶颈时,需要对哪些号称“自动化”的内存分配与回收技术进行监控和调节
  2. 程序计算器、虚拟机栈、本地方法栈3个区域随现场而生存、灭亡;栈中的栈帧随着方法的进入和退出而有条不紊的执行出栈和入栈操作,每个栈帧分配多说内存基本上在类结构确定下来时就是已知,这几个区域内存分配和回收是确定的。
  3. 主流的java虚拟机不采用引用计数算法,最主要原因是很难结局对象之间的相互循环引用问题。
  4. 可达性分析算法的基本原理是通过一系列称为GC roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链reference? chain,当一个对象到GC roots没有任何引用链路时。证明该对象是不可用的。
  5. GC? roots包括如下几种:[......]

阅读全文

Comments { 0 }

Java 并发之内存模型整理

一、概述

Java线程之间的通信由Java内存模型JMM控制,[highlight]JMM决定一个线程对共享变量的写入何时对另一个线程可见[/highlight]。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。Java内存模型的抽象示意图如下:

jmm2

从上图来看,线程A与线程B之间如要通信的话,必须要经历下面2个步骤:

  1. 首先,线程A把本地内存A中更新过的共享变量刷新到主内存中去。
  2. 然后,线程B到主内存中去读取线程A之前已更新过的共享变量。

在线程运行的时候有一个内存专用的一小块内存,当[......]

阅读全文

Tags: , , ,

Comments { 0 }

读书笔记《深入理解Java虚拟机》: 垃圾收集器与内存分配策略

  1. 当需要排查各种内存溢出、内存泄露问题时,或者发现gc成为并发瓶颈时,需要对哪些号称“自动化”的内存分配与回收技术进行监控和调节
  2. 程序计算器、虚拟机栈、本地方法栈3个区域随现场而生存、灭亡;栈中的栈帧随着方法的进入和退出而有条不紊的执行出栈和入栈操作,每个栈帧分配多说内存基本上在类结构确定下来时就是已知,这几个区域内存分配和回收是确定的。
  3. 主流的java虚拟机不采用引用计数算法,最主要原因是很难结局对象之间的相互循环引用问题。
  4. 可达性分析算法的基本原理是通过一系列称为GC roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链reference? chain,当一个对象到GC roots没有任何引用链路时。证明该对象是不可用的。
  5. GC? roots包括如下几种:
  • 虚拟机栈(栈帧中的本地变量表)中引用的对象
  • 方法区中类静态属性引用的[......]

阅读全文

Tags: , ,

Comments { 0 }

java 垃圾回收策略

尝试介绍几种常用的垃圾回收算法,根据年轻代、年老的的特征分别使用不同的收集算法。以及考虑到垃圾收集的吞吐量、暂停时间等采用不同的收集选项。

垃圾回收算法

收集算法主要有引用计数(reference counting)和引用追踪(tracing collector),从名字上不难理解一个就是数对象引用数,没用了则清楚,引用追踪则是产看对象是否从活的“跟对象”(“跟对象”见本文下面介绍)关联出来。收集器从根开始访问每一个活跃的节点,标记它所访问的每一个节点。走过所有引用后,收集就完成了,然后就对堆进行清除(即对堆中的每一个对象进行检查),所有没有标记的对象都作为垃圾回收并返回空闲列表。

根据算法的细节引用追踪又分为标记清除、复制、标记整理三类。

tracing-collector

引用计数(Reference?Counting

比较简单直接。最好理解最容易想到的一种策略。原理是此对象有一个引用,即增加[......]

阅读全文

Tags: ,

Comments { 2 }