Java虚拟机原理图解
可口可乐的围脖
这个作者很懒,什么都没留下…
展开
-
《Java虚拟机原理图解》 1.1、class文件基本组织结构
[last updated: 2014/11/19 09:06] 作为Java程序猿,我们知道,我们写好的.java 源代码,最后会被Java编译器编译成后缀为.class的文件,该类型的文件是由字节组成的文件,又叫字节码文件。那么,class字节码文件里面到底是有什么呢?它又是怎样组织的呢?让我们先来大概了解一下他的组成结构吧。NO1. 魔转载 2014-11-19 15:09:21 · 574 阅读 · 0 评论 -
Shallow heap & Retained heap
所有包含Heap Profling功能的工具(MAT, Yourkit, JProfiler, TPTP等)都会使用到两个名词,一个是Shallow Size,另一个是 Retained Size. 这是两个在平时不太常见的名词,本文会对这两个名词做一个详细的解释。 Shallow Size 对象自身占用的内存大小,不包括它引用的对象。 针对非数组类型的对象,它的大小就是对象与转载 2015-06-25 10:48:06 · 319 阅读 · 0 评论 -
关于 "Unloading class sun.reflect.GeneratedSerial...
谨以此文纪念一次悲剧的经历,并总结从中得到的经验教训。最近,由于项目需要,要在一个Tomcat上部署多个Web应用。考虑到Tomcat的最大堆大小为128MB,所以我对Tomcat的JVM参数做以下调整,并输出GC日志。参数如下:-Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxPermSize=512M -Xloggc:D:/T转载 2015-06-25 10:33:36 · 1930 阅读 · 0 评论 -
java.lang.OutOfMemoryError: GC overhead limit exceeded
今天现场weblogic报java.lang.OutOfMemoryError: GC overhead limit exceeded,在metalink查了下,有明确解释,要设置一个JVM参数,不过由于当前weblogic内存设置为4G,所以设置参数的做法其实并不是解决问题之道,还是要分析weblogic 内存溢出文件,得出是哪个功能有问题:APPLIES TO:Oracle转载 2015-06-25 13:21:31 · 1019 阅读 · 0 评论 -
三个实例演示 Java Thread Dump 日志分析
jstack Dump 日志文件中的线程状态dump 文件里,值得关注的线程状态有:死锁,Deadlock(重点关注) 执行中,Runnable 等待资源,Waiting on condition(重点关注) 等待获取监视器,Waiting on monitor entry(重点关注)暂停,Suspended对象等待中,Object.wait() 或 TIM转载 2015-06-26 06:38:52 · 465 阅读 · 0 评论 -
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat使用详解
JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat等小巧的工具,本博客希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解。 现实企业级Java开发中,有时候我们会碰到下面这些问题:OutOfMemoryError,内存不足内存泄露转载 2015-06-26 06:43:24 · 577 阅读 · 0 评论 -
java.lang.OutOfMemoryError:GC overhead limit exceeded填坑心得
我遇到这样的问题,本地部署时抛出异常java.lang.OutOfMemoryError:GC overhead limit exceeded导致服务起不来,查看日志发现加载了太多资源到内存,本地的性能也不好,gc时间消耗的较多。解决这种问题两种方法是,增加参数,-XX:-UseGCOverheadLimit,关闭这个特性,同时增加heap大小,-Xmx1024m。坑填了,but why?转载 2015-06-26 06:45:25 · 761 阅读 · 0 评论 -
记一次JVM GC日志分析(中间给出了部分的JVM配置参数)
这几天在准备升级JDK版本到1.6,对目前线上JVM(版本是1.5.0_08-b03) GC日志进行了分析,发现一些参数设置不太合理的地方,有待后续通过数据来进行验证。1.原始GC日志(通过JVM配置GC Print参数获取GC日志)...695.775: [GC 695.776: [ParNew: 130944K->0K(131008K), 0.0174100 secs]转载 2015-06-26 06:46:35 · 982 阅读 · 0 评论 -
使用MAT分析Java内存
OverviewMAT(Memory Analyzer Tool) 是一个JAVA Heaper分析器,可以用来分析内存泄露和减少内存消耗。分析Process showmap中的/dev/ashmem/dalvik-heap(deleted)一项所占用的Memory.可以参考我写的使用showmap分析系统内存占用情况一文。下面就将一下如何使用Eclipse MAT转载 2015-06-26 06:52:49 · 537 阅读 · 0 评论 -
MAT分析JAVA内存问题
Java的内存泄露多半是因为对象被遗留在全局的HashMap中得不到释放,如果发现Java应用程序占用的内存出现了泄露的迹象,那么我们一般采用下面的步骤分析: 1. 把Java应用程序使用的heap dump下来 2. 使用Java heap分析工具(如MAT),找出内存占用超出预期的嫌疑对象 3. 根据情况,分析嫌疑对象和其他对象的引用关系。 4. 分转载 2015-06-25 13:43:09 · 544 阅读 · 0 评论 -
JVM 优化经验总结
本文讲解了如何将新对象预留在年轻代、如何让大对象进入年老代、如何设置对象进入年老代的年龄、稳定的 Java 堆 VS 动荡的 Java 堆、增大吞吐量提升系统性能、尝试使用大的内存分页、使用非占有的垃圾回收器等主题。开始之前Java 虚拟机有自己完善的硬件架构, 如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM 屏蔽了与具体操作系统平台相关的信息,使得 J转载 2015-07-08 10:18:18 · 654 阅读 · 0 评论 -
jvm 生成javacore和heapdump文件
(1)如果使用Oracle JVM也就是标准的SUN JVM(SUN已被oracle收购)当内存溢出时生成heapdump文件配置如下-Xloggc:${目录}/temp_gc.log (GC日志文件)-XX:+HeapDumpOnOutOfMemoryError (内存溢出时生成heapdump文件)-XX:HeapDumpPath=${目录}转载 2015-06-25 09:47:33 · 4205 阅读 · 0 评论 -
JVM GC日志和内存DUMP参数配置
在JVM出现内存溢出或泄露时,为便于排查和定位,需要JVM的启动上增加相应的参数。主要是GC日志和内存DUMP参数。详细如下。 1.GC日志和内存DUMP参数配置 本文参数配置基于各厂商的JDK 6.0版本,低版本或高版本的参数有可能不同。各厂商JVM GC日志和内存DUMP参数配置如下: (1)Oracle JVM-Xloggc:${目录}/manage转载 2015-06-25 09:51:17 · 2229 阅读 · 0 评论 -
《Java虚拟机原理图解》 1.2、class文件中的常量池
[最新更新:2014/11/11] 了解JVM虚拟机原理 是每一个Java程序员修炼的必经之路。但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的。感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成《Java虚转载 2014-11-19 15:12:36 · 481 阅读 · 0 评论 -
《Java虚拟机原理图解》1.4 class文件中的字段表集合--field字段在class文件中是怎样组织的
.前言 了解JVM虚拟机原理是每一个Java程序员修炼的必经之路。但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的。 感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成《Java虚转载 2014-11-19 15:18:25 · 474 阅读 · 0 评论 -
Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中。这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码。JVM虚拟机读取字节码文件,取出二进制数据,加载到内存中,解析.class 文件内的信息,生成对应的 Class对象: class字节码文件是根据JVM虚拟机规范中规定的字节码组织规转载 2014-11-19 15:30:27 · 636 阅读 · 1 评论 -
《Java虚拟机原理图解》1.5、 class文件中的方法表集合--method方法在class文件中是怎样组织的
了解JVM虚拟机原理是每一个Java程序员修炼的必经之路。但是由于JVM虚拟机中有很多的东西讲述的比较宽泛,在当前接触到的关于JVM虚拟机原理的教程或者博客中,绝大部分都是充斥的文字性的描述,很难给人以形象化的认知,看完之后感觉还是稀里糊涂的。 感于以上的种种,我打算把我在学习JVM虚拟机的过程中学到的东西,结合自己的理解,总结成《Java虚拟机原理图解》 这个系列,以图解转载 2014-11-19 15:20:23 · 590 阅读 · 0 评论 -
《Java虚拟机原理图解》 1.2.1、Class文件中的常量池详解(上)
NO1.常量池在class文件的什么位置? 我的上一篇文章《Java虚拟机原理图解》 1、class文件基本组织结构中已经提到了class的文件结构,在class文件中的魔数、副版本号、主版本之后,紧接着就是常量池的数据区域了,如下图用红线包括的位置: 知道了常量池的位置后,然后让我们来揭秘常量池里究竟有什么东西吧~ NO2.常量池转载 2014-11-19 15:14:08 · 541 阅读 · 0 评论 -
《Java虚拟机原理图解》3、JVM运行时数据区
[last updated :2014/11/7] JVM运行时数据区(JVM Runtime Area)其实就是指JVM在运行期间,其对计算机内存空间的划分和分配。本文将通过以下几个话题来讨论JVM运行时数据区。Topic 1. JVM运行时数据区里有什么?Topic 2. 虚拟机栈 是什么?虚拟机栈里有什么?Topic 3.栈帧是什么?栈帧里有什么?Topic 4转载 2014-11-19 15:10:18 · 437 阅读 · 0 评论 -
《Java虚拟机原理图解》 1.2.2、Class文件中的常量池详解(下)
NO9.类中引用到的field字段在常量池中是怎样描述的?(CONSTANT_Fieldref_info, CONSTANT_Name_Type_info) 一般而言,我们在定义类的过程中会定义一些 field 字段,然后会在这个类的其他地方(如方法中)使用到它。有可能我们在类的方法中只使用field字段一次,也有可能我们会在类定义的方法中使用它很多很多次。 举一个转载 2014-11-19 15:15:45 · 483 阅读 · 0 评论 -
《Java虚拟机原理图解》1.3、class文件中的访问标志、类索引、父类索引、接口索引集合
讲完了class文件中的常量池,我们就相当于克服了class文件中最麻烦的模块了。现在,我们来看一下class文件中紧接着常量池后面的几个东西:访问标志、类索引、父类索引、接口索引集合。1. 访问标志、类索引、父类索引、接口索引集合 在class文件中的位置 好,让我们来一一击破它们,看看它们到底是什么东西。2. 访问标志(access_flags)能够表示什么?转载 2014-11-19 15:17:32 · 399 阅读 · 0 评论 -
java虚拟机性能监控工具介绍
最近在做性能测试,在性能调优过程中查阅了些虚拟机相关的知识,下面对虚拟机所用的性能监控的工具做个简单的介绍和汇总。一、JDK命令行工具1.jps:虚拟机进程状况工具 列出正在运行的虚拟机进程,显示虚拟机执行祝列的名称,已经这些进程的本地虚拟机的唯一ID。此命令虽然功能单一,但它是使用频率最高的JDK命令工具。Jps 命令格式:jps [options] [hostid]转载 2014-12-29 11:35:32 · 1091 阅读 · 0 评论 -
tomcat 产生heapdump文件配置
系统有时会遇到OutOfMemoryError,Java堆溢出了。我们需要找到造成OutOfMemoryError原因。一般有两种情况:1、内存泄露,对象已经死了,无法通过垃圾收集器进行自动回收;2、内存溢出,内存中的对象都还必须存活着,这说明Java堆分配空间不足,检查堆设置大小(-Xmx与-Xms),检查代码是否存在对象生命周期太长、持有状态时间过长的情况。想在泄漏未发生前转载 2015-06-25 09:44:03 · 2758 阅读 · 0 评论 -
深度分析 Java 的 ClassLoader 机制(源码级别)
转载地址:http://http://blog.jobbole.com/96145/ 写在前面:Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中,JVM在加载类的时候,都是通过ClassLoader的loadClass()方法来加载class的,loadClass使用双亲委派模式。为了更好的理转载 2015-12-16 18:09:42 · 496 阅读 · 0 评论