JVM精华总结
Jerry_Fu24
这个作者很懒,什么都没留下…
展开
-
深入理解Java虚拟机--垃圾回收算法
了解GC和内存分配算法目的:当需要排查各种内存溢出、内存泄漏问题时,当垃圾回收成为系统达到更高并发量的瓶颈时,就需要对此实施必要的监控和调节。 垃圾回收之前最重要的工作——判断对象的死活: 1.引用计数算法:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻计数器为0的对象就是不可能再被使用的。主流的java虚拟原创 2016-07-11 09:47:52 · 1498 阅读 · 0 评论 -
深入理解Java虚拟机--运行时栈帧结构
栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构。它是虚拟机运行时数据区的虚拟机栈的栈元素。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。 在编译程序代码时,栈帧中需要多大的局部变量表、多深的操作数栈都已经完全确定。并且写入到了方法表的Code属性之中,因此,一个栈需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。原创 2016-07-16 10:22:33 · 2640 阅读 · 0 评论 -
深入理解Java虚拟机--类加载器
通过一个类的全限定名来获取描述此类的二进制流,执行这个动作的代码模块成为“类加载器”。 两个类只有在同一个类加载器加载的前提下才有意义,否则即使两个类原子相同的Class文件,只要加载它们的加载器不同,那这两个类也是不相等的。这里的相等,包括equals,isAssignableFrom(),isInstance() instanceof等情况。 双亲委派模型原创 2016-07-15 23:07:33 · 1072 阅读 · 0 评论 -
深入理解Java虚拟机--虚拟机类加载机制
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可被虚拟机直接使用的Java类型,这就是虚拟机加载机制。 类加载时机 类从被加载到虚拟机内存中到卸载出内存,整个生命周期:加载、连接、初始化、使用、卸载。其中连接分为验证、准备、解析。解析的顺序不一定,有可能按照上述顺序,也有可能在初始化阶段之后才开始,这是为了支持Java的运行时原创 2016-07-15 16:04:57 · 344 阅读 · 0 评论 -
深入理解Java虚拟机--虚拟机性能监控与故障处理工具
jps(JVM Process Status Tool):虚拟机进程状况工具 列出正在运行的虚拟机进程显示虚拟机执行主类进程id-l 输出主类的全名 -m输出虚拟机进程启动时传给主类main()函数的参数 jstat(JVM Statistics Monitoring Tool):虚拟机统计信息监视工具 监视虚拟机运行状态信息,可以查询类装载、垃圾回收、运行期编译状况jsta原创 2016-07-12 10:04:00 · 387 阅读 · 0 评论 -
深入理解Java虚拟机--java内存区域
java运行是数据区 一、程序计数器 一块较小的内存空间,可看做当前线程所执行的字节码的行号指示器 字节码解释器工作依赖计数器控制完成 线程私有,生命周期与线程相同 唯一在Java虚拟机规范中没有规定任何OutOfMemoryError情况区域 二、Java虚拟机栈 线程私有,生命周期与线程相同 虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都原创 2016-07-07 22:05:53 · 305 阅读 · 0 评论 -
深入理解Java虚拟机--对象访问
对象访问会涉及到Java栈、Java堆、方法区这三个内存区域。 这句代码出现在方法体中,"Object obj” 这部分将会反映到Java栈的本地变量中,作为一个reference类型数据出现。而“new Object()”这部分将会反映到Java堆中,形成一块存储Object类型所有实例数据值的结构化内存,根据具体类型以及虚拟机实现的对象内存布局的不同,这块原创 2016-07-07 22:38:55 · 256 阅读 · 0 评论 -
深入理解Java虚拟机--OutOfMemoryError异常
在Java虚拟机规范的描述中,除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(下文称OOM )异常的可能。 Java堆溢出 Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。 下原创 2016-07-08 10:32:59 · 384 阅读 · 0 评论 -
深入理解Java虚拟机--垃圾回收器
在讨论垃圾回收器的语境中: 并行:多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态 并发:用户线程与垃圾回收线程同时执行(但不一定是并行,可能会交替执行) 1.Serial收集器 最基本、历史最悠久的收集器 单线程收集器,只能使用一个CPU或一条收集线程去完成收集任务,而且期间必须暂停其他所有的工作线程 简单而高效(相比于其他收集器原创 2016-07-11 13:46:26 · 286 阅读 · 0 评论 -
深入理解Java虚拟机--内存分配规则
新生代GC(Minor GC):指发生在新生代的垃圾回收动作,因此区域对象大多朝生夕死,所以Minor GC非常频繁,一般回収速度也比较快 老年代GC(Major GC/Full GC):指发生在老年代的GC,出现Major GC,经常会伴随至少一次的Minor GC(并非绝对),Major GC一般会比Minor GC慢10倍以上。 1.对象优先分配在Eden,当Eden区没有原创 2016-07-11 15:09:07 · 646 阅读 · 0 评论 -
深入理解Java虚拟机--java内存模型与线程
Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。Java内存模型规定了所有的变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量值得传递原创 2016-07-16 23:13:56 · 437 阅读 · 0 评论