jvm
cwjokaka
GitHub: https://github.com/cwjokaka
展开
-
【JVM】10_长期存活的对象将进入老年代
/** * VM参数 : * -verbose:gc * -Xms20M * -Xmx20M * -Xmn10M * -XX:+PrintGCDetails * -XX:SurvivorRatio=8 * -XX:MaxTenuringThreshold=1 //年龄阈值,对象每熬过一次Minor GC,它的age会加1,age达到此值对象就会晋升老年代 * -XX:原创 2017-11-07 10:30:34 · 490 阅读 · 0 评论 -
【JVM】8_对象优先在Eden分配
/** * VM参数有这些: * -verbose:gc : 表示输出虚拟机中GC的详细情况,输出像: [Full GC 168K->97K(1984K), 0.0253873 secs] * -Xms20M : 堆内存最小值(单位M) * -Xmx20M : 堆内存最大值(单位M) * -Xm原创 2017-11-06 14:37:03 · 505 阅读 · 1 评论 -
【JVM】理解GC日志
本文转载自http://blog.csdn.net/renfufei/article/details/49230943本文是 Plumbr 发行的 Java垃圾收集指南 的部分内容。文中将介绍GC日志的输出格式, 以及如何解读GC日志, 从中提取有用的信息。我们通过 -XX:+UseSerialGC 选项,指定JVM使用串行垃圾收集器, 并使用下面的启动参数让 JVM 打印出详细的GC转载 2017-11-06 14:25:25 · 288 阅读 · 0 评论 -
【JVM】6_GC存活分析算法之引用计数法的优缺
引用计数法(Reference Counting)的含义:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。优点:客观地说,引用计数算法的实现简单,判定效率也很高,在大部分情况下它都是一个不错的算法,也有一些比较著名的应用案例,例如微软公司的COM(Component Object Model原创 2017-11-01 16:25:28 · 1253 阅读 · 0 评论 -
【JVM】7_对象的自我拯救
即使在可达性分析算法中不可达的对象,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段,要真正宣告一个对象死亡,至少要经历两次标记过程:如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链,那它将会被第一次标记并且进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,虚拟机将原创 2017-11-01 17:59:54 · 252 阅读 · 0 评论 -
【JVM】4_利用GCLib测试方法区溢出
方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。对于这些区域的测试,基本的思路是运行时产生大量的类去填满方法区,直到溢出,用GCLib可以方便我们测试方法区溢出。import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cgl原创 2017-11-01 09:46:17 · 269 阅读 · 0 评论 -
【JVM】5_测试直接内存溢出
直接通过反射获取Unsafe实例进行内存分配(Unsafe类的getUnsafe()方法限制了只有引导类加载器才会返回实例,也就是设计者希望只有rt.jar中的类才能使用Unsafe的功能)。因为,虽然使用DirectByteBuffer分配内存也会抛出内存溢出异常,但它抛出异常时并没有真正向操作系统申请分配内存,而是通过计算得知内存无法分配,于是手动抛出异常,真正申请分配内存的方法是unsafe原创 2017-11-01 14:00:07 · 273 阅读 · 0 评论 -
【JVM】2_测试虚拟机栈和本地方法栈溢出
/** * 区域虚拟机栈、本地方法栈 * VM参数 : -Xss128k * -Xss栈内存容量 * 单线程下只会出现StackOverflowError异常 * */public class Main { public static void main(String[] args) { StackTest st = new StackTest();原创 2017-10-30 17:17:27 · 436 阅读 · 0 评论 -
【JVM】1_测试堆内存溢出异常
import java.util.ArrayList;import java.util.List;/** * VM参数 -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError * -Xms : 堆内存最小值(单位M) * -Xmx : 堆内存最大值(单位M) * * -XX:+HeapDumpOnOutOfMemoryError : * 可原创 2017-10-30 12:48:04 · 250 阅读 · 0 评论 -
【JVM】12_空间分配担保
在发生Minor GC之前,虚拟机会先检查老年代最大可用的连续空间是否大于新生代所有对象总空间,如果这个条件成立,那么Minor GC可以确保是安全的。如果不成立,则虚拟机会查看HandlePromotionFailure设置值是否允许担保失败。如果允许,那么会继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小,如果大于,将尝试着进行一次Minor GC,尽管这次Minor G原创 2017-11-07 15:55:58 · 2447 阅读 · 4 评论 -
【JVM】3_总结String和intern方法
通过参考《深入理解java虚拟机》和几篇博客总结并实践得出来的经验JDK1.6和JDK1.7之间intern方法的实现发生了一些变化JDK各版本String的共同之处:用引号做声明的字符串都会在常量池中生成,而new出来的字符串对象则是在堆中生成的,所以它们两个的内存地址肯定是不同的。所以,String str = new String("abc");语句其实可以分为两步原创 2017-10-31 13:05:56 · 199 阅读 · 0 评论 -
【JVM】11_动态对象年龄判定
为了能更好地适应不同程序的内存状况,虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中相同年龄所有对象大小的总和大于Survivor空间的一半,年龄大于或等于该年龄的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。/** * VM参数 : * -verbose:gc * -原创 2017-11-07 13:55:50 · 3123 阅读 · 0 评论 -
【JVM】9_大对象直接进入老年代
/** * VM参数 : * -verbose:gc * -Xms20M * -Xmx20M * -Xmn10M * -XX:+PrintGCDetails * -XX:SurvivorRatio=8 * -XX:PretenureSizeThreshold=3145728 //对象如果大于或等于此值,会直接分配到老年代里 * -XX:+UseSerialGC原创 2017-11-06 16:57:37 · 7218 阅读 · 0 评论