深入理解JVM
LiuXudongHnu
这个作者很懒,什么都没留下…
展开
-
Java内存区域的划分
JVM在执行Java程序时会讲它所管理的内存划分为若干个数据区域。目前比较流行的划分方式是将内存区域划分为堆(Heap)内存和栈(Stack)内存。这种方法的划分说明与对象分配关系最为密切的内存是很多程序员最关注的部分,实际上JVM在执行Java程序时,内存区域的划分远远比这个复杂。根据《JAVA虚拟机规范》的规定,JVM所管理的内存将分为以下几个区域。 1、程序计数器:所占内存很原创 2017-03-15 14:03:30 · 530 阅读 · 0 评论 -
Java中对象的死亡
Java中是通过可达性分析来判定对象是否存活的。这个算法的思路是通过一系列的称为”GC Roots“的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,则证明这个对象是不可用的。JAVA中可作为GC Roots的对象包括下面几种:1、虚拟机栈中引用的对象 2、方法区中类静态属性引用的对象 3、方法去中常量引用的对象 4、本地方原创 2017-03-16 22:04:14 · 1045 阅读 · 0 评论 -
Java中内存分配和回收策略、新生代、老年代
Java中对于垃圾回收的策略有多种,而目前商业虚拟机的垃圾收集都采用“分代收集”,这种算法是根据对象存活周期的不同将内存分为几块,一般是将Java堆分为新生代和老年代,根据各个年代的特点采用较适合的收集算法。 新生代中采用的收集算法:复制算法。算法的思想是将可用内存分为大小相等的两块,每次使用其中一块,当一块内存用完了,就将还存活的对象分到另一块。然后把使用过的内存空间一次进行清理原创 2017-03-17 10:44:40 · 5964 阅读 · 0 评论 -
Java堆外内存及导致的溢出错误
除了Java堆和永生代之外,还有一些区域会占用较多的内存,而这些内存总和可能受到操作系统进程最大的内存限制。比如,一个服务器内存2G,其中1.6G分配给Java堆,另外的0.4G分配给操作系统和下面的区域,那么0.4G很可能不够用。例如当Direct Memory占用过多的内存时,虚拟机虽然会对Direct Memory进行回收,但是却不像新生代,老年代一样,发现空间不足了就通知收集器进行垃圾回收原创 2017-05-11 10:54:25 · 2966 阅读 · 0 评论 -
JAVA中对象的创建、对象的内存布局、对象的访问定位
对象的创建:在语言层面,创建对象通常仅仅需要一个new关键字即可创建一个对象。而在虚拟机中,对象的创建是一个复杂的过程。当JVM遇到一个new指令的时候,首先将去检查这个指令的参数能否在常量池中找到 一个类的符号引用,并且检查这个符号引用所代表的类是否已经被加载、解析、初始化过。如果没有,将先进行类加载的过程。在类加载检查通过后,虚拟机就要为新生对象分配内存,所需内存的大小在类加载完成后便可以完全原创 2017-03-15 21:55:38 · 659 阅读 · 0 评论 -
JAVA中的强引用、软引用、弱引用、虚引用
Java中关于引用的定义为:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。这种定义很纯粹,但是太过狭隘,一个对象在这种定义下只有被引用或者没有被引用两种状态,对于如何描述一些“食之无味,弃之可惜”的对象就显得无能为力。我们希望可以描述这么一类对象:当内存足够时,可以保留在内存中;如果内存空间在进行垃圾回收后还是很紧张,那么就把他抛弃。JDK原创 2017-03-16 20:46:21 · 525 阅读 · 0 评论