JVM
johnllllll
这个作者很懒,什么都没留下…
展开
-
深入Java虚拟机(一):Java内存区域
Java内存区域: 程序计数器(ProgramCounterRegister) (1)线程私有 (2)当线程在执行一个Java方法时,该计数器记录的是正在执行的虚拟机字节码指令的地址; 当线程在执行的是Native方法(调用本地操作系统方法)时,该计数器的值为空。 (3)唯一一个在Java虚拟机规范中么有规定任何O...原创 2019-01-10 21:25:11 · 151 阅读 · 0 评论 -
深入Java虚拟机(七):JVM字节码指令
JVM字节码指令转载 2019-02-17 11:13:02 · 266 阅读 · 0 评论 -
深入Java虚拟机(十二):方法调用
解析在 Java 虚拟机里面提供了 5 条方法调用字节码指令,分别如下。invokestatic:调用静态方法。 invokespecial:调用实例构造器 <init> 方法、私有方法和父类方法。 invokevirtual::调用所有的虚方法。 invokeinterface:调用接口方法,会在运行时再确定一个实现此接口的对象。 invokedynamic:先在运行...原创 2019-02-18 08:54:07 · 116 阅读 · 0 评论 -
深入Java虚拟机(十一):基于栈的字节码解释执行引擎
基于栈的字节码解释执行引擎基于栈的指令集与基于寄存器的指令集基于栈的指令集优点:1、可移植,因为不同处理器的寄存器不同。2、代码相对紧凑,大部分都是零地址指令。缺点:执行速度慢原因:完成相同功能所需的指令数量一般会比寄存器架构多,因为出栈、入栈操作本身就产生了相当多的指令数量。栈实现在内存之中,频繁的栈访问也就意味着频繁的内存访问,不如处理器的寄存器快。基于...原创 2019-02-17 11:14:35 · 138 阅读 · 0 评论 -
深入Java虚拟机(十):运行时栈帧结构
运行时栈帧结构栈帧(Stack Frame)是用于支持虚拟机进行方法调用和方法执行的数据结构, 每一个栈帧都包括了局部变量表、操作数栈、动态连接、方法返回地址和一些额外的附加信息。在编译程序代码的时候,栈帧中需要多大的局部变量表,多深的操作数栈都已经完全确定了,并且写入到方法表的 Code 属性之中,因此一个栈帧需要分配多少内存,不会受到程序运行期变量数据的影响,而仅仅取决于具体的虚拟机实现。...原创 2019-02-17 11:14:10 · 136 阅读 · 0 评论 -
深入Java虚拟机(九):类加载器和双亲委派模型
类的唯一性判断是否为同一个类的条件:类的完整类名必须一致,包括包名。 加载这个类的ClassLoader(指ClassLoader实例对象)必须相同。//创建两个不同的自定义类加载器实例FileClassLoader loader1 = new FileClassLoader(rootDir);FileClassLoader loader2 = new FileClassLoad...原创 2019-02-17 11:13:49 · 126 阅读 · 0 评论 -
深入Java虚拟机(六):Class文件
概述Class类文件是一组以8位字节为基础单位的二进制流,是字节码文件。两种数据类型1、无符号数无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表一个字节、两个字节、四个字节、八个字节的无符号数。无符号数可以描述数字,索引引用,数量值,或者安装UTF-8编码构成的字符串值。2、表表是多个无符号数或其他表构成的复合数据类型,表都习惯以"_info"结尾。Cla...原创 2019-02-17 11:12:30 · 146 阅读 · 0 评论 -
深入Java虚拟机(五):常用虚拟机工具
JDK的bin目录下有很多常用的工具,包括:jps:显示系统中所有Hotspot虚拟机进程jstat:收集Hotspot虚拟机各方面运行数据jinfo:显示虚拟机的配置信息jmap:用于生成虚拟机的内存快照信息jhat:用于分析heapdump文件jstack:显示虚拟机的线程栈信息此外还有可视化工具Jconsole和VisualVM执行示例: $ jps -...原创 2019-02-17 11:10:49 · 185 阅读 · 0 评论 -
深入Java虚拟机(三):内存溢出与内存泄漏
内存溢出内存溢出是指程序所需要的内存超出了系统所能分配的内存(包括动态扩展)的上限。内存泄露的解决方案:1、避免在循环中创建对象。2、尽早释放无用对象的引用。(最基本的建议)3、尽量少用静态变量,因为静态变量存放在永久代(方法区),永久代基本不参与垃圾回收。4、使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域。...原创 2019-02-17 11:09:46 · 127 阅读 · 0 评论 -
深入Java虚拟机(八):类加载过程
概述虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机类加载机制。在Java语言中,类的加载、连接和初始化过程都是在程序运行期间完成的,这是java作为动态语言的基础。另外值得注意的是上面提到的Class文件,并不一定值得是磁盘上的.class文件,而只需要是任何符合字节码规范的一串二进制字节流就可以了。...原创 2019-02-17 11:13:26 · 132 阅读 · 0 评论 -
深入Java虚拟机(四):垃圾回收
目录判断对象是否存活1、引用计数法2、可达性分析法四种引用类型1、强引用2、软引用(SoftReference)3、弱引用(WeakReference)4、虚引用(幽灵/幻影引用PhantomReference)finalize()方法回收方法区垃圾收集算法1、标记—清除算法2、复制算法3、标记—整理算法(Mark-Co...原创 2019-02-17 11:10:16 · 169 阅读 · 0 评论 -
深入Java虚拟机(二):Java对象
创建对象的方法使用 new 语句创建对象使用对象的clone()方法通过反射,使用Class对象的newInstance()方法反序列化创建对象的流程这里只说明new语句创建对象的流程:检查类是否已加载首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程。为对象分...原创 2019-01-11 20:51:06 · 184 阅读 · 1 评论 -
JVM调优案例
一、常见虚拟机配置参数汇总堆配置-Xms4g:初始堆大小-Xmx4g:最大堆大小-Xmn2g:年轻代大小-Xss1024K:线程栈大小-XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区...原创 2019-06-26 15:35:57 · 375 阅读 · 0 评论