JVM
_Marshall
这个作者很懒,什么都没留下…
展开
-
JVM常见内存溢出问题归纳
OutOfMemoryError发生有三种比较常见的情况:堆溢出,简单说就是创建了太多的实例对象,导致内存溢出 OutOfMemoryError栈溢出, 栈的深度不够或者多线程导致栈内存不足,导致内存溢出 StackOverFlowErrorOutOFMemoryError 方法区溢出, 方法区用于存放Class的相关信息,可能出现情况,java 反射创建了太多的类,导致内存溢出原创 2016-07-25 22:27:02 · 672 阅读 · 0 评论 -
JVM运行时数据区
JVM运行时数据区方法区和堆是所有线程共享的,而其他区域则是线程私有的。虚拟机栈区和本地方法栈虚拟机栈描述了java方法执行的内存模型:每个方法在执行的同时会创建一个栈帧(Stack Frame)用于 存储局部变量表、操作数栈、动态链接、方法出口等信息。本地方法区也是类似。 此区域内有两种异常,1.如果线程请求的栈的深度大于虚拟机所允许的深度,throw StackOverFlowError Ex原创 2016-07-20 22:39:19 · 321 阅读 · 0 评论 -
GC在堆和方法区的内存回收
对象的存活判断对象是否存活,主流实现是可达性分析。 可达性算法的基本思路,通过一系列为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链(Reference Chain), 当一个对象到GC Roots 没有任何引用链相连时,相当于图论的从GC Roots不可达,则这个对象不可用。引用类型 -* 强引用* 只要强引用还存在,垃圾收集器永远不会收掉被引用的原创 2016-07-31 20:47:35 · 5830 阅读 · 0 评论 -
JVM对象的内存布局和访问
对象在内存中的布局可以分为3块区域:对象头(Header)、实例数据(Instance data)和对齐填充(Padding)。对象头对象运行时数据 HashCodeGC分代年龄锁状态标志线程持有的锁偏向线程ID偏向时间类型指针(虚拟机通过这个指针来确定这个对象是哪个类的实例)HotSpot VM 的自动管理系统要求对象起始地址必须是8字节的整数倍,in other word, 对原创 2016-07-21 22:38:02 · 361 阅读 · 0 评论 -
垃圾(GC)收集算法
GC的三种主要算法标记-清除复制标记-整理1.标记-清除 基本思路:算法分为标记和清除两个阶段, 首先标记所有要回收的对象,然后在清除阶段统一回收。 优缺点: 1. 效率问题,标记清除阶段效率都不高。 2. 空间问题,清除后产生大量不连续的内存碎片,不利于大对象内存的分配2.复制 基本思路:将内存分为大小相等的两块,只使用其中原创 2016-08-11 00:16:06 · 333 阅读 · 0 评论 -
垃圾收集器(整理版)
垃圾收集器是内存回收的HotPot具体实现。垃圾回收方法见GC收集算法 GC收集器 Serial ParNew Parallel Scavenge Serial Old Parallel Old CMS 应用内存区域 新生代 新生代 新生代 永久代 永久代 永久代 是否是多线程 否 是 是 否 是 是 诞生JDK原创 2016-09-18 16:30:05 · 405 阅读 · 0 评论 -
JDK自带的小工具
Summary 名称 主要功能 jps JVM Process Status Tool 显示指定系统内所有的HotSpot 虚拟机进程 jstat JVM Statistics Monitoring Tool, 用于收集HotSpot虚拟机各方面的运行数据 jinfo Configuration Info for Java, 显示虚拟机配置信息 jmap Mem原创 2016-10-09 15:49:16 · 606 阅读 · 0 评论 -
理解JIT 编译器
前言本文尝试用浅显的语言, 解释JIT的概念和基本原理,让读者明白JIT的运行方式和作用。最后,附上关于JIT的代码样例,帮助大家更好理解JIT。本文使用JVM虚拟机为Hotspot ,一切分析都在Hotpot上。如有不对的地方,欢迎指正。JIT简介JIT 是just in time 的缩写,即时编译编译器。当JIT编译启用时, JVM读入字节码文件解释后,将其发给JIT编译器。JIT编译器将字节码原创 2016-09-24 16:24:02 · 770 阅读 · 0 评论