随笔分类 - JVM虚拟机
摘要:概述 编译器是一种计算机程序, 它主要的目的是将便于人编写、阅读、维护的高级计算机语言所写的源代码程序, 翻译为计算机能解读、运行的低阶机器语言的程序, 即可执行文件。而 javac 就是java语言中的编译器, 它用于将 .java 文件转换成JVM能识别的 .class 字节码文件, 反编译则是
阅读全文
摘要:JConsole: Java监视与管理控制台 代码清单1: 内存监控: 编译运行JConsoleDemo类, 运行时设置的虚拟机参数为 -Xms100m -Xmx100m -XX:+UseSerialGC , 在%JAVA_HOME%\bin目录下, 启动jconsole.exe , 将自动搜索出本
阅读全文
摘要:jhat: heapdump文件分析工具 在前两篇系列文章JDK的命令行工具系列 (一) jps、jstat、JDK的命令行工具系列 (二) javap、jinfo、jmap中, 我们已经介绍过了jps、jmap这些命令行工具的使用, 所以这里就不在多做说明, 直接演示jhat的使用。 代码清单:
阅读全文
摘要:javap: 反编译工具, 可用来查看java编译器生成的字节码 参数摘要: -help 帮助 -l 输出行和变量的表 -public 只输出public方法和域 -protected 只输出public和protected类和成员 -package 只输出包,public和protected类和成
阅读全文
摘要:概述 在我们进行故障定位和性能分析时, 可以使用Java Dump(也叫Dump文件)来帮助排查问题, 它记录了JVM运行期间的内存占用和线程执行等情况。其中Heap Dump文件是二进制格式, 它保存了某一时刻的系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等, 是指定时刻的java
阅读全文
摘要:类加载的时机 首先, 我们来看一下类的生命周期, 如下图所示。其中验证、准备、解析3个阶段统称为连接。加载、验证、准备、初始化、卸载这5个阶段的顺序是确定的, 而解析阶段则不一定, 它在某些情况下可在初始化阶段之后运行, 这是为了支持Java语言的运行时绑定(也叫后期绑定或动态绑定)。 对于初始化阶
阅读全文
摘要:概述 java语言的"编译期"分为前端编译和后端编译两个阶段。前端编译是指把*.java文件转变成*.class文件的过程; 后端编译(JIT, Just In Time Compiler)是指把字节码转变成机器码的过程。 在编译原理中, 将源代码编译成机器码, 主要经过下面几个步骤: Java中的
阅读全文
摘要:前言 在C++语言中, 程序员必须小心谨慎的处理每一项内存分配, 且内存使用完后必须手动释放曾经占用的内存空间。当内存释放不够完全时, 即存在分配但永不释放的内存块, 就会引起"内存泄漏"问题。 而在Java语言中, 它给了程序员一个美好的承诺: 程序员无需管理内存, 因为JVM会有GC去自动进行垃
阅读全文
摘要:前面几篇文章中, 系统的学习了下JVM内存结构、Java内存模型、Java对象模型, 但是发现自己还是对这三者的概念和区别比较模糊, 傻傻分不清楚。所以就有了这篇文章, 本文主要是对这三个技术点再做一个总结和区分, 加深印象。 JVM内存结构 在《Java虚拟机规范(Java SE 8)》中描述了J
阅读全文
摘要:java对象 在内存中,一个Java对象包含三部分:对象头、实例数据和对齐填充。而对象头中又包含锁状态标志、线程持有的锁等标志。 oop-klass model OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象实例的具体类型。 oop体系: 如上面
阅读全文
摘要:java线程之可见性 volatile不需要加锁, 比synchronized更轻量级, 不会阻塞线程; 从内存可见性角度看, volatile读相当于加锁, volatile写相当于解锁。 synchronized既能保证可见性, 又能保证原子性; volatile只能保证可见性,无法保证原子性。
阅读全文
摘要:一. java内存组成介绍 1.堆内存: 用于分配所有类实例和数组的内存 2.非堆内存: 方法区、JVM内部处理或优化、类结构(常量池,字段,方法数据)、方法、构造方法二. JVM内存区域模型 1.方法区(永久代、非堆) 1.1 用于存储虚拟机加载的类信息、常量、静态变量、以及在类中声明的各种方法和
阅读全文