JVM
Ydoing
这个作者很懒,什么都没留下…
展开
-
JVM垃圾回收算法和垃圾收集器笔记
概述程序计数器,本地方法栈,虚拟机栈随线程而生,随线程而灭. Java堆和方法区则不一样,这部分内存分配和回收的都是动态的,垃圾收集器所关注的是这部分内存.判断对象是否是垃圾的算法JVM没有选用引用计数算法来管理内存,最主要的是引用计数很难解决对象之间相互循环引用的问题.JVM采用了可达性分析算法来判断对象是否能回收.用GC Roots对象作为起点,向下搜索,搜索走过的路劲称为引用链(referen原创 2015-03-19 09:41:12 · 996 阅读 · 0 评论 -
一次JVM调优实战
早上查看低峰期gc情况,发现昨晚上fgc有274次,感觉有些不正常,开始查找原因[jump@order-binlog-data002 spring-boot]$ sudo jstat -gc 20028 4000 10 S0C S1C S0U S1U EC EU OC OU MC MU CCSC C原创 2017-07-17 19:15:32 · 1643 阅读 · 0 评论 -
JVM的Perm区持续增长导致OOM问题记录
查找问题先用jstack看看线程栈是否正常,确认正常后用jmap查看(因为线上用的OpenJDK,需要安装debuginfo包)堆中快照情况。jmap一些命令可能会造成JAVA进程挂起,特别是jmap -permstat会造成STW,程序无法响应。建议使用jmap命令应该与线上环境隔离才能用。使用jmap -permstat发现大量dead状态的class对象,其中class为groovy/lang原创 2017-02-05 17:33:48 · 4015 阅读 · 3 评论 -
聊聊JVM常用参数设置
整体考虑堆大小-Xms3550m, 初始化堆大小。通常情况和-Xmx大小设置一样,避免虚拟机频繁自动计算后调整堆大小。 -Xmx3550m,最大堆大小。考虑分代设置堆大小首先通过jstat等工具查看应用程序正常情况下需要堆大小,再根据实际情况设置。新生代-xmn2g,新生代大小。Sun官方推荐配置为整个堆的3/8。 -XX:SurvivorRatio=8。Eden和Survivor的比值。老年代原创 2016-07-30 10:46:28 · 6484 阅读 · 0 评论 -
Mac编译OpenJDK7(8)和Eclipse调试Hotspot
一、前言Java是我主要的生产语言,但对JVM不是很了解,最近也在看《深入理解Java虚拟机 第二版》,所以想亲手编译OpenJDK和调试HotSpot虚拟机系统是15年的Mac OS X(10.11.5),而OpenJDK7却是13的,完全按照书本来,肯定是编译不过的,本文记录了在这个痛苦过程中遇到的坑,希望对其他人能有所帮助OpenJDK8使用configure && make转载 2016-07-27 14:50:03 · 3560 阅读 · 3 评论 -
Java虚拟机类加载机制
类加载的整个生命周期:加载、验证、准备、解析、初始化、使用、卸载。其中验证、准备、解析3个部分统称为连接。初始化情况遇到new、getstatic、putstatic、invokestatic这4条字节码指令。使用java.lang.reflect包的方法对类进行反射调用。初始化的一个类的时候,发现其父类没有进行初始化。初始化化主类(包含main()方法的那个类) 这几种情况称为主动引用。原创 2015-03-23 21:15:54 · 594 阅读 · 0 评论 -
Java内存分配
对象优先在Eden分配大多数情况,对象在新生代Eden区中分配。当Eden去没有足够内存空间分配时,进行Minor GC。大对象直接进入老年代大对象是指连续占用内存空间的对象,比如很长的字符串以及数组。长期存活的对象将进入老年代用一个年龄计数器,每次minor GC后存活的对象移动到Survior空间,并且计数器加1.年龄计数器大于一定值(默认是15),将晋升到老年代.可以用-XX:MaxTenur原创 2015-09-09 21:05:13 · 641 阅读 · 0 评论 -
Java方法分派-重写与重载区别
说明:这两天遇到的一些Java方法分派的问题,结合自己书上看的,google的,还有撒迦教我的,做一个总结吧.望指正. 写道方法分派指的是虚拟机如何确定应该执行哪个方法! 很多的内容可以参加撒迦的这篇博文 : http://rednaxelafx.iteye.com/blog/652719我这篇里很多概念的解释都摘自上面的博文,所以,我就不一一指出啦转载 2015-03-22 17:39:58 · 596 阅读 · 0 评论 -
Java字节码指令简介
概述Java虚拟机指令由一个字节的操作码或操作数组成。大部分指令都没有支持byte、short、char和boolean的类型。编译器会在编译期或运行期转换为带符号扩展的int类型处理。指令类型加载和存储指令加载和存储指令用于将数据在栈帧中的局部变量表和操作数栈之间来回传数据。以下指令t代表i、l、f、d、a,n代表局部变量表的slot位置。 - 将一个局部变量加载到操作栈:tload_. -原创 2015-03-22 16:13:06 · 1104 阅读 · 0 评论 -
Java类文件结构笔记
概述一次编写,处处运行(Write Once, Run Anywhere).各种平台的虚拟机与所有平台都统一使用的程序存储格式-字节码(ByteCode).Java虚拟机不和包括Java在内任何语言绑定,它只与Class文件锁关联.因此Groovy,JRuby,Jython,Scala都可以在Java虚拟机上运行.Class类文件结构Class文件是一组以8字节为基础单位的二进制流,中间没有原创 2015-03-22 12:31:11 · 724 阅读 · 0 评论 -
Java内存区域分析
程序计数器指令执行的指示器.每个线程都有独立的程序计数器,互无影响,我们称这类区域为线程私有的内存.执行Java方法,计数器记录的是正在执行的虚拟机字节码指令地址;如果执行的是native方法,这个计数器为空.此内存区域唯一一个没有规定任何OutOfMemoryError的区域.虚拟机栈Java虚拟机栈也是线程私有的,它的生命周期与线程相同.虚拟机栈描述的是Java方法执行的内存模型:原创 2015-03-17 10:14:09 · 682 阅读 · 0 评论 -
理解Java的GC日志
分析如下GC日志: [GC [PSYoungGen: 9216K->1024K(9216K)] 1246196K->1246220K(1287040K), 0.2398360 secs] [Times: user=0.29 sys=0.01, real=0.24 secs] [Full GC [PSYoungGen: 1024K->0K(9216K)] [ParOldGe...2015-03-17 09:19:00 · 85 阅读 · 0 评论