随笔分类 -  深入理解Java虚拟机

深入理解Java虚拟机
摘要:ps -ef|grep javajstat -gcutil 54649 500 10jstat -gcnew 54649 500 10 jstat -gcclass 54649jstat -class 54649jstat -printcompilation 54649jstat -compiler 阅读全文
posted @ 2024-05-13 16:14 使用D 阅读(3) 评论(0) 推荐(0) 编辑
摘要:jstat jstat jstat -gcutil 11117 250 20 查看进程号为11117的java进程的垃圾收集情况,每250ms输出一次,一共输出20次。 新生代Eden区(E,表示Eden)使用了6.2%的空间,两个Survivor区(S0、S1,表示Survivor0、Surviv 阅读全文
posted @ 2019-04-18 00:22 使用D 阅读(216) 评论(0) 推荐(0) 编辑
摘要:Java内存自动管理可以解决两个问题:给对象分配内存和回收分配给对象的内存; 给对象分配内存,都是在堆上进行分配的,对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓存TLAB,将按线程优先在TLAB上分配,少数情况也可能会直接分配在老年代中,分配的规则并不是固定的,也取决于当前使用的垃圾 阅读全文
posted @ 2019-04-17 23:56 使用D 阅读(318) 评论(0) 推荐(0) 编辑
摘要:UseSerialGC UseSerialGC 使用串行GC,虚拟机在client模式下的默认GC方式 UseParNewGC UseParNewGC 打开此选项,使用ParNew+Serial Old 组合GC方式 UseConcMarkSweepGC UseConcMarkSweepGC 使用P 阅读全文
posted @ 2019-04-16 00:25 使用D 阅读(338) 评论(0) 推荐(0) 编辑
摘要:G1是一款面向服务端的垃圾回收器,它是作用是替换到JDK1.5中发布的CMS收集器,与其他收集器相比,G1具有以下优点: 并行与并发 并行与并发 利用多核CPU来缩短Stop the world停顿的时间,G1收集器可以通过并发的方式让Java程序与GC并发执行。 分代收集 分代收集 G1收集器任然 阅读全文
posted @ 2019-04-09 00:30 使用D 阅读(867) 评论(0) 推荐(0) 编辑
摘要:Serial Old收集器 Serial Old收集器时Serial收集器的老年代版本。 同样是单线程收集器。 使用“标记-整理”算法。 默认也是给client模式下使用的老年单收集器。 该收集器可以作为CMS收集器的后备预案; Parallel Old收集器 Parallel Old是Parall 阅读全文
posted @ 2019-04-05 01:41 使用D 阅读(823) 评论(0) 推荐(0) 编辑
摘要:注意: Parallel为并行:指多条垃圾收集器并行工作,但是此时用户先仍然处于等待状态; Concurrent为并发 :指用户线程和垃圾收集线程同时执行,用户程序在继续运行,而垃圾收集先运行在另一个CPU上。 上图中包含了虚拟机中的所有收集器及相互协作的关系。 如果两个收集器连线,说明这两个收集器 阅读全文
posted @ 2019-04-03 01:07 使用D 阅读(623) 评论(0) 推荐(0) 编辑
摘要:枚举根节点 可达性分析算法中,需要根据GC Roots节点下找出所有存活的引用(例如常量或者静态属性)与执行上下文(例如栈帧在宏的本地变量表)。GC Roots中的方法区可能会有数百兆,如果逐个检索这里的引用,那么必然会消耗很多时间。 可达性分析算法堆执行时间的敏感还体现在GC停顿上,因为这项分析公 阅读全文
posted @ 2019-04-02 00:31 使用D 阅读(429) 评论(0) 推荐(0) 编辑
摘要:标记-清除算法 标记-清除算法 算法分为标记、清除两个阶段:首先标记处所有需要回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程其实就是之前介绍的两种算法(可达性分析算法)。 标记-清除算法的两个不足之处:一个是效率问题,标记和清除两个剁成的效率都不高;另一个是空间问题,标记清除之后会产 阅读全文
posted @ 2019-04-01 01:27 使用D 阅读(221) 评论(0) 推荐(0) 编辑
摘要:方法区的垃圾回收,即使永生代的垃圾收集:主要回收两部分内容,废弃的常量和无用类、 回收废弃的常量与Java堆中的对象非常类似,以常量池中字面量的回收为例:假如一个字符串"abc"已经进入了常量池中,但是当前系统没有任何一个String对象的是叫做abc的,换句话说就是没有任何STring对象引用常量 阅读全文
posted @ 2019-04-01 00:04 使用D 阅读(336) 评论(0) 推荐(0) 编辑
摘要:垃圾回收需要考虑三个问题: 哪些内存需要回收? 什么时候回收? 如何回收? JVM中程序计数器、虚拟机栈、本地方法三个区域随线程而生,随线程而死,这三个区域的内存分配和回收都具有确定性,在这个几个区域不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就随着回收了。 而Java堆和方法区则 阅读全文
posted @ 2019-03-31 23:18 使用D 阅读(302) 评论(0) 推荐(0) 编辑
摘要:由于运行时常量池属于方法区的一部分,因此两个区域放在一块执行。 String.intern()是一个Native方法,它的作用是如果字符串常量池中已经包含了此String对象的字符串,则返回代表池中这个字符串的String对象;否则将此String对象包含的字符串添加到常量池中,并且返回此Strin 阅读全文
posted @ 2019-03-29 00:19 使用D 阅读(520) 评论(0) 推荐(0) 编辑
摘要:Java堆溢出 Java堆溢出 可以通过不停的创建对象来造成堆内存溢出 public static void main(String[] args) { List list = new ArrayList<>(); while(true) { list.add(new ObjectBIg()) } 阅读全文
posted @ 2019-03-29 00:18 使用D 阅读(177) 评论(0) 推荐(0) 编辑
摘要:DirectMemory容量可以同-XX:MaxDirectMemorySize指定,如果不指定,默认为Java堆最大值相同。 可以同通过反射获得Unsafe实例进行内存分配进行抛出异常。虽然可以使用DirectMemory分配内存也可以抛出内存异常,但是它抛出异常时并没有真正向操作系统申请分配内存 阅读全文
posted @ 2019-03-29 00:17 使用D 阅读(199) 评论(0) 推荐(0) 编辑
摘要:由于在Hotspot虚拟机中中不区分虚拟机栈和本地方法栈,因此通过-Xoss修改参数是无效的,可以通过修改-Xss设定。 如果线程请求的栈深度大于虚拟机允许的最大深度,将抛出StackOverflowError异常。 如果虚拟机在扩展栈时无法申请到足够的内存空间,将抛出OutOfMemoryErro 阅读全文
posted @ 2019-03-29 00:17 使用D 阅读(923) 评论(0) 推荐(0) 编辑
摘要:对象创建 对象创建 虚拟机遇到一个new指令时,首先去,检查这个指令的参数是否在常量池中定位到一个雷的符号引用,并且检查这个符号引用代表的雷是否已被加载、解析、初始化过。 在类加载检查通过后,虚拟机将会为新对象分配内存,对象所需要的内存大小在加载后可以确定,为对象分配内存的任务就是把一块确定大小的内 阅读全文
posted @ 2019-03-27 23:30 使用D 阅读(175) 评论(0) 推荐(0) 编辑
摘要:Java虚拟机在执行Java程序的过程中会把它管理的内存划分为若干个不同的数据区域。 这些区域各有个的用途、以及创建和销毁时间,有的随虚拟机进程的启动而存在,有的则依赖于用户线程的启动和结束而建立和销毁。 Java虚拟机主要分为5部分:方法区、虚拟机栈、本地方法栈、堆、程序计数器。 程序计数器:是一 阅读全文
posted @ 2019-03-27 23:29 使用D 阅读(235) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示