JVM
汲建帅
这个作者很懒,什么都没留下…
展开
-
JVM 内存模型
内存划分java虚拟机按照运行时内存使用区域划分如图: 区域 是否线程共享 是否会内存溢出 程序计数器 否 不会 java虚拟机栈 否 会 本地方法栈 否 会 堆 是 会 方法区 是 会一、程序计数器(Program Counter Register) 程序计数器就是记录当前线程执行程序的位置,改变计数器的值来确定执行的下原创 2017-04-20 23:26:46 · 1573 阅读 · 0 评论 -
生成 Heap Dump 的几种方式
Heap Dump 概述Heap Dump 是 Java进程所使用的内存情况在某一时间的一次快照。以文件的形式持久化到磁盘中。 Heap Dump的格式有很多种,而且不同的格式包含的信息也可能不一样。但总的来说,Heap Dump一般都包含了一个堆中的Java Objects, Class等基本信息。同时,当你在执行一个转储操作时,往往会触发一次GC,所以你转储得到的文件里包含的信息通常是有原创 2018-01-22 13:34:14 · 28723 阅读 · 1 评论 -
Java 对象占用内存大小
Java 对象如果想要了解java对象在内存中的大小,必须先要了解java对象的结构。HotSpot虚拟机中,对象在内存中存储的布局可以分为三块区域:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)java 对象头Mark Word HotSpot虚拟机的对象头(Object Header)包括两部分信息,第一部分用于存储对象自身的原创 2018-01-22 13:35:25 · 5163 阅读 · 1 评论 -
局部变量和常量的性能分析
前两天群里有人问,下面的代码1 比代码2运行时间上慢了100ms,这是问什么? 请看下面的两个代码片段:代码1for(int i=0; i<Integer.MAX_VALUE; i++){ sum+=i;}代码2for(int i=0, len=Integer.MAX_VALUE; i<len; i++){ sum+=i;}我本地使用的JDK1.8执行的,但每次执行这两段的时间原创 2017-07-20 10:24:05 · 1994 阅读 · 0 评论 -
多线程并发下的单例模式
定义:单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。下面通过代码分析下java中,各种单例模式写法的优缺点。1、饿汉模式示例1.1public class Singleton { private Singleton() {} private static Object INSTANCE = new Object(); public原创 2017-06-26 14:55:36 · 1847 阅读 · 0 评论 -
深入分析JVM逃逸分析对性能的影响
逃逸分析(Escape Analysis)逃逸分析的基本行为就是分析对象动态作用域:当一个对象在方法中被定义后,它可能被外部方法所引用,称为方法逃逸。甚至还有可能被外部线程访问到,譬如赋值给类变量或可以在其他线程中访问的实例变量,称为线程逃逸。方法逃逸的几种方式如下:public class EscapeTest { public static Object obj; public原创 2017-06-26 14:53:44 · 5628 阅读 · 6 评论 -
JVM基于栈的解释器执行原理
继上一篇字节码分析finally块对return返回值的影响,好多人对局部变量表和操作数栈之间的关系搞不清楚,下面通过图解来描述局部变量表和操作数栈直接的关系。通过下面这段代码来解释JVM基于栈的执行原理4. public static int add(int a, int b) {5. int c = 0;6. c = a + b;7. return c;8. }查看字节码的命令:j原创 2017-06-26 14:51:53 · 2942 阅读 · 0 评论 -
字节码分析finally块对return返回值的影响
通过字节码分析在finally块中修改返回值后,返回的结果原创 2017-06-26 14:50:29 · 1650 阅读 · 0 评论 -
常量池之字符串常量池String.intern()
运行时常量池是方法区(PermGen)的一部分。需要提前了解: 1. JVM内存模型。 2. JAVA对象在JVM中内存分配常量池的好处常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。 - Java的自动装箱中其实就使用到了运行时常量池。详见:Java 自动装箱与拆箱的实现原理 - 还有字符串常量池。字符串进入到常量池的两种方法:1. new String()的实例原创 2017-04-25 22:01:41 · 3219 阅读 · 4 评论 -
JVM 类加载机制深入浅出
从类被加载到虚拟机内存中开始,到卸御出内存为止,它的整个生命周期分为7个阶段,加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)、卸御(Unloading)。其中验证、准备、解析三个部分统称为连接。 7个阶段发生的顺序如下:1. 加载通过一个类的全限定名来获取定义此类的原创 2017-05-06 15:39:04 · 1571 阅读 · 0 评论 -
JVM垃圾回收算法
判断Java中对象存活的算法1.引用计数器算法:引用计数器算法是给每个对象设置一个计数器,当有地方引用这个对象的时候,计数器+1,当引用失效的时候,计数器-1,当计数器为0的时候,JVM就认为对象不再被使用,是“垃圾”了。 引用计数器实现简单,效率高;但是不能解决循环引用问问题(A对象引用B对象,B对象又引用A对象,但是A,B对象已不被任何其他对象引用),同时每次计数器的增加和减少都带来了很多额外原创 2017-05-06 15:36:59 · 1548 阅读 · 0 评论 -
JVM(HotSpot) 垃圾收集器
需要提前了解的知识: 1. JVM内存模型 2. JVM垃圾回收算法HotSpot虚拟机所有的垃圾收集器如下图:上面有7种收集器,分为部分,上面为新生代收集器,下面是老年代收集器。如果两个收集器之间存在连线,就说明它们可以搭配使用。新生代的收集器使用复制算法, 老年代使用并发标记清除(CMS)或标记-整理算法。Stop The WorldJava中Stop-The-World机制简称原创 2017-05-15 17:26:48 · 334 阅读 · 0 评论 -
JVM 内存区域大小参数设置
需要提前了解的知识点: 1. JVM内存模型 2. JVM垃圾回收算法下图是JVM内存区域划分的逻辑图从图中我们大概了解JVM相关的内存区域。JVM内存包括区域Heap(堆区)New Generation(新生代) EdenSurvivor FromSurvivor ToOld Generation(老年代)方法区Permanent Generation(持久代)Stack(栈区)原创 2017-05-15 17:24:48 · 4400 阅读 · 0 评论 -
JAVA对象在JVM中内存分配
如果你还不了解JVM内存模型的建议您先看下JVM内存模型以一下代码为例,来分析下,java对象在内存中的空间分配。public class Student { private String name; private static Birthday birthday = new Birthday(); public Student(String name) { t原创 2017-04-22 13:50:07 · 1975 阅读 · 0 评论 -
window 查找 java 进程中占用cpu比较高的线程
概述公司内部的一个产品 (java 开发的) 运行在 window 虚拟机上,运行一段时间后CPU飙升,然后想查看是哪个线程占用。 折腾了一下午,终于定位到该线程。下面我们通过两种方式定位到占用cpu比较高的线程。 * 1. 使用Process Explorer,第三方工具定位,使用比较简单,容易上手。 * 2. 使用window自带的perfmon 性能监控工具进行监控,功能强大,原创 2018-01-22 13:32:44 · 3923 阅读 · 0 评论