JVM
数据china
这个作者很懒,什么都没留下…
展开
-
1JVM内存四大类型问题:Heap、Stack、Contant、DirectMemory
第一 heap 堆溢出: heap中只能保存对象,对象存储过多会报错 java heap space 测试时修改JVM的默认参数: 代码: import java.util.ArrayList; import java.util.List; class Person{ } public class HelloHeapOutOfMemory { publ原创 2016-05-30 14:27:35 · 1013 阅读 · 0 评论 -
20.JVM中CMS收集器
CMS垃圾回收的作用 XX:+UseConcMarkSweepGC 启动cms的垃圾回收机制 CMS-initial-mark 初始标记阶段,此时会短暂的stop the world,标记出可到达的对象。 CMS-concurrent-mark 并发标记阶段,主要是基于上一阶段的成功,找出不可到达的对象。 CMS-remark 再次标记阶段。stop the world ,避免第二阶原创 2016-06-01 14:20:38 · 200 阅读 · 0 评论 -
21.JVM中G1收集器解密
可以想CMS一样,GC操作与应用的线程一起并发执行。 紧凑的空闲内存区间且没有很长的GC停顿时间。需要可预测的gc暂停耗时,不牺牲太多的吞吐量性能,启动后不需要启动更大的java heap。 G1 heap 空间分配: 完全重新分配了原有的heap 区域。 阶段: 初始标记 并发标记 再次标记 清理 适用场景: full gc 次数太频繁或者时间太长。 对象分配的频率原创 2016-06-01 15:13:00 · 468 阅读 · 0 评论 -
19.JVM中Serial收集器、ParNew收集器、Parallel收集器解析
1.serial收集器 单线程的方式,串行即程序停止。分为serial old(采用标记压缩算法,一般用于收集老年带)和serial.因为是单线程没有线程切换带来的资源开销 2.parNew收集器 多线程,并行。采用复制算法和stop the world 。单线程时用serial,如果是多cpu的机器可以用parNew方式。 3.parallel收集器 吞吐量优先的收集器,可以设置吞吐量原创 2016-06-01 14:06:27 · 565 阅读 · 0 评论 -
18.JVM垃圾回收器串行、并行、并发垃圾回收器概述
1.JVM的不同垃圾回收器 2.串行,并行,并发垃圾回收器概述 串行:jvm GC时存在一个线程 并行:jvm gc时有多个线程,用多个cpu或者core同时执行垃圾回收,优点是提高了吞吐量。但是由于线程切换占用了时间,所有并行并不一定比串行好。两者都基于stop the world。 并发:不用停止任务,可以在gc时,任务同时运行。由此提高了效率,增加了用户体验。原创 2016-06-01 13:28:35 · 484 阅读 · 0 评论 -
17.JVM垃圾回收分代收集算法
所谓分代算法其实都是基于3中基本gc算法的,只不过根据实际情况选用不同的算法 1.分带GC在新生代的算法 新生代是new出来或者gc次数没有达到阙值的对象,是瞬态的。且eden和fromto比例约为8:1。eden的对象到to中,to中的对象进入from中。from本身的进行+1,达到阙值进入old。 2.分带GC在老年代的算法原创 2016-06-01 11:17:53 · 318 阅读 · 0 评论 -
16.三种基本的GC算法基石
1.GC标记、清除算法 由于内存中对象构成一个树,当内存耗尽时,程序停止(如果不停止新new对象时标记出错)。此时程序对对象进行标记和清除。 缺点:停止程序运行,降低用户体验。且释放的内存空间不连续。 2.GC的复制算法 先找出活动对象存储到空白区域,然后把原来的对象空间清空。 缺点:虽然活动空间连续,但是耗内存,且对象空间满的情况下,复制只是单纯的耗内存原创 2016-06-01 11:13:53 · 276 阅读 · 0 评论 -
14.Java对象内存逃逸技术
1.内存逃逸技术分析 概念;指创建对象时,对象不存储在heap空间中,由此可以减少gc次数,减少gc压力。 2.内存逃逸技术测试 对象在方法中创建,并被外部对象引用,此时会发生内存逃逸,在大数据领域鼓励使用这种方式,可以减少oom的发生。原创 2016-06-01 10:32:24 · 682 阅读 · 0 评论 -
12.JVM的GC日志Full GC每个字段解释
原创 2016-06-01 09:50:00 · 533 阅读 · 0 评论 -
8.JVM的Young Generation大小对GC性能的致命影响力
1.young generation工作机制详解 2.young generation 对gc性能的影响。原创 2016-05-31 15:35:00 · 530 阅读 · 0 评论 -
7.JVM GC时的内存管理工作流程和频繁GC的原因
大部分创建的对象都是在使用后结束,但是有的会存在很久。所以考虑gc的时候会考虑生命周期短,生命周期长,大对象,小对象。 生命周期短或者小对象此时可能就需要频繁的gc,把对象从内存释放掉。如果对象比较大,或者生命周期长就不需要gc,因为这种对象一般在old,如果heap过小此时就会被迫对old区域进行gc,从而导致full gc,此种情况下对性能的影响极大。所以一般会尽可能大的设置较大的heap。原创 2016-05-31 14:28:38 · 334 阅读 · 0 评论 -
6.从OOM推导出JVM GC时候基于的内存结构:Young Generation(Eden、From、To)、Old Generation、Permanent Generation
GC的异常信息如下 通过以上异常信息,推导jvm的内存结构。 Young Generation:Object 产生和基本活跃区。 Eden :当new后,此时进入eden。如果对象特别大会直接进入old from: to: from 和to具有相同的大小。他们作为eden和old的缓冲地带,先放到to中,to满了以后放到from。目的是增加对象在young中的时间,因为在youn原创 2016-05-31 13:54:39 · 557 阅读 · 0 评论 -
5.JVM三大性能调优参数:-Xms -Xmx -Xss
1.-Xss是对每个线程stack大小的调整。直接影响对方法的调用次数 测试结果: 测试代码: package com.dt.spark.jvm.basics; public class HelloStackOverFlow { private static int counter; public void count() {原创 2016-05-31 11:37:06 · 4493 阅读 · 0 评论 -
4.JVM内存模型
1.stack(线程私有) 管理方法执行时的内存模型。stack里面有帧,用于记录方法执行时的变量,参数,动态链接库,返回信息,地址等。 递归调用时要非常注意stack over flow的异常。 还受当前内存的限制,如果内存不够也会oom异常。 2.native method area(线程私有) 不是java实现而是通过本地的C/C++实现,此时jvm引擎要通过JNI去做。 3.h原创 2016-05-31 11:20:22 · 208 阅读 · 0 评论 -
3.JVM线程引擎和内存共享区的交互及此背景下的程序计数器
1.线程和内存共享的交互 2.程序计数器(Program Counter Register) 为了让线程正常工作,在不同的线程轮流使用core时,线程切换时让每个线程继续执行之前的任务。JVM在线程切换时就是通过读取program counter register的值来决定该线程下一条需要执行的字节码指令,进而进行选择语句,循环,异常处理等。原创 2016-05-31 11:03:18 · 188 阅读 · 0 评论 -
2.详细图解JVM内存三大核心区域及其JVM内存案例剖析
jvm的结构: 1.jvm内存的三大核心区域(方法区,java heap 和java stack) 代码: package com.dt.spark.jvm.basics; /** * 从JVM调用的角度分析Java程序对内存空间的使用: * 当JVM进程启动的时候,会从类加载路径中找到包含main方法的入口欧蕾HelloJVM; * 找到HelloJV原创 2016-05-30 15:00:05 · 257 阅读 · 0 评论 -
22.使用MAT对Dump文件进行分析实战
下载mat http://www.eclipse.org/mat/downloads.php 设置eclipse运行参数 -server -Xms1024m -Xmx1024m -Xmn384m -XX:+UseParallelOldGC -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+P原创 2016-06-01 16:47:06 · 1625 阅读 · 0 评论