泛型类型擦除 C#中的泛型,不论是代码中,还是编译后,还是运行期,都是切实存在的.List<String>和List<Int>是两个截然不同的类型,有自己的虚方法表和类型数据,这种实现称为类型膨胀. Java中的泛型是编译之后就消失了.只在代码中存在. 当泛型遇见重载 public class OverloadTest {     public void testType(List<String> list) {     System.out.println("…
获取JDK源码 先明确OpenJDK和Sun/OracleJDK之间,以及OpenJDK 6.OpenJDK 7.OpenJDK7u和OpenJDK 8等项目之间是什么关系,这有助于确定接下来编译要使用的JDK版本和源码分支. OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea.UltraViolet都是从OpenJDK源码衍生出的发行版.但如果仅从“开源”字面意义(开放可阅读的源码)上看,其实Sun自…
文章首发于微信公众号:BaronTalk,欢迎关注! 对于性能和效率的追求一直是程序开发中永恒不变的宗旨,除了我们自己在编码过程中要充分考虑代码的性能和效率,虚拟机在编译阶段也会对代码进行优化.本文就从虚拟机层面来看看虚拟机对我们所编写的代码采用了哪些优化手段. 一. 早期优化(编译期优化) Java 语言的「编译期」其实是一段「不确定」的操作过程.因为它可能是一个前端编译器(如 Javac)把 *.java 文件编译成 *.class 文件的过程:也可能是程序运行期的即时编译器(JIT 编译器…
郑重声明:本片博客是学习<深入理解Java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序员有一个共识,以编译方式执行本地代码比解释方式更快,之所以有这样的共识,除去虚拟机解释执行字节码时额外消耗时间的原因外,还有一个很重要的原因就是虚拟机设计团队几乎把对代码的所有优化措施都集中在了即时编译器之中(在JDK 1.3之 后,Javac就去除了-O选项,不会生成任何字节码级别的优化代码了),因此一般来说,即时编译器产生的本地代码会比Javac产生的字节码更加优秀[1].本篇博客,我们将…
郑重声明:本片博客是学习<深入理解java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序最初是通过解释器(Interpreter)进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为"热点代码",为了提高热点代码的执行效率,在运行时, 虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化,完成这个任务的编译器称为即时编译器,即时编译器编译性能的好坏. 代码优化程度的高低却是衡量一款商用虚拟机优秀与否的最关键的指标…
题外话 最近在阅读<深入理解Java虚拟机>,其中有一小节实战是自己编译JDK,实际操作下来后遇到问题不少,为此特地记录,也希望可以给大家带来一些参考! 前置准备 平台及工具:Windows 10 + WSL(ubuntu 20.04) + CLion(2021.2.2) OpenJDK12下载地址:https://hg.openjdk.java.net/jdk/jdk12/ 下载安装解压即可 编译工具版本推荐: GCC 7.4及以上 # Ubuntu上安装GCC命令,该命令默认安装9.3版本…
参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M..) /Users/baidu/Documents/Data/Interview/Java HotSpot 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带…
深入理解Java虚拟机--下 参考:https://www.zybuluo.com/jewes/note/57352 第10章 早期(编译期)优化 10.1 概述 Java语言的"编译期",可能是指一个前端编译器把.java文件转变成.class文件的过程:也可能是指虚拟机的后端运行期编译器(JIT编译器,Just In Time Compiler,即时编译器)把字节码转变成机器码的过程:还可能是指使用静态提前编译器(AOT编译器,Ahead Of Time Compiler)直接把*…
参考 http://book.2cto.com/201306/25434.html 另外,这篇文章也是从一个系列中得出的: <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M..) /Users/baidu/Documents/Data/Interview/Java HotSpot 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带…
文章首发于公众号:BaronTalk 书籍真的是常读常新,古人说「书读百遍其义自见」还是很有道理的.周志明老师的这本<深入理解 Java 虚拟机>我细读了不下三遍,每一次阅读都有新的收获,每一次阅读对 Java 虚拟机的理解就更进一步.因而萌生了将读书笔记整理成文的想法,一是想检验下自己的学习成果,对学习内容进行一次系统性的复盘:二是给还没接触过这部好作品的同学推荐下,在阅读这部佳作之前能通过我的文章一窥书中的精华. 原想着一篇文章就够了,但写着写着就发现篇幅大大超出了预期.看来还是功力不够,…
第一部分走近Java第1章走近Java21.1概述21.2Java技术体系31.3Java发展史51.4Java虚拟机发展史91.4.1SunClassicExactVM91.4.2SunHotSpotVM111.4.3SunMobile—EmbeddedVMMeta—CircularVM121.4.4BEAJRockitIBMJ9VM131.4.5AzulVMBEALiquidVM141.4.6ApacheHarmonyGoogleAndroidDalvikVM141.4.7Microsoft…
这是why的第 47 篇原创文章 荒腔走板 大家好,我是 why.老规矩,先是简短的荒腔走板聊聊生活. 上面的图是前几天拍的,那天晚上下班后,刚刚走进小区就看到了这一轮弯月和旁边那一颗特别特别亮的星星. 不知道为什么,一瞬间,我感觉一下回到了小时候的夏天. 脑海里浮现出了一些画面:一个大铁勺子舀一勺透心凉的井水.经过水缸冰镇的西瓜.树荫下卖樱桃的老爷爷.小河边嬉笑着抓螃蟹的同伴.提着一杯凉白开走在上学路上的自己,还有傍晚在顶楼纳凉的邻居们. 我小时候是在筒子楼长大的,一栋楼 7 层高,每一层住…
目录 前言 1. 自动内存管理 1.1 JVM运行时数据区 1.2 Java 内存结构 1.3 HotSpot 虚拟机创建对象 1.4 HotSpot 虚拟机的对象内存布局 1.5 访问对象 2. 垃圾回收与内存分配 2.1 判断对象是否存活 2.2 分代与内存分配.回收策略 2.3 垃圾回收算法(GC 的算法) 2.4 HotSpot 的算法实现 2.5 垃圾收集器 3. JVM 参数配置 3.1 JVM 内存参数简述 3.2 JVM 的 GC 收集器设置 4. JVM 性能调优案例分析 4.…
上节学习回顾 从课本章节划分,<垃圾收集器>和<内存分配策略>这两篇随笔同属一章节,主要是从理论+实验的手段来讲解JVM的内存处理机制.好让我们对JVM运行机制有一个良好的概念,才能继续往下学习. 本节学习重点 本节主要是针对JVM内存管理机制的一些监控手段,例如堆情况使用的监控,线程栈情况的监控等.有几句废话还是有必要在这里强调的,工具是人类思维的工具,例如Java语言是人类满足需求的一种技术手段,而监控工具只是维护程序应用的一种手段.所以,思考的逻辑思维要清晰,是问题引导工具,…
java内存区域详解 以下内容参考自<深入理解 java虚拟机 JVM高级特性与最佳实践>,其中图片大多取自网络与本书,以供学习和参考.…
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机   作为一个Java程序员,我们每天都在写Java代码,我们写的代码都是在一个叫做Java虚拟机的东西上执行的.但是如果要问什么是虚拟机,恐怕很多人就会模棱两可了.在本文中,我会写下我对虚拟机的理解.因为能力所限,可能有些地方描述的不够欠当.如果你有不同的理解,欢迎交流. 我们都知道Java程序必须在虚拟机上运行.那么虚拟机到底是什么呢?先看网上搜…
其实关于线程的使用,之前已经写过博客讲解过这部分的内容: http://www.cnblogs.com/deman/category/621531.html JVM里面关于多线程的部分,主要是多线程是如何实现的,以及高效并发. 1.Java内存模型 CPU在运行的时候,不可能把所有的东西都放在寄存器里面,所有需要使用内存.这个内存就是我们知道的那个内存. 但是实际情况是,内存的读写速度于CPU的指令操作差了几个数量级.所以为了跟高效的使用CPU,就有高速缓存这么一个东西. 以下是Intel 酷睿…
类加载的过程包括: 加载class到内存,数据校验,转换和解析,初始化,使用using和卸载unloading过程. 除了解析阶段,其他过程的顺序是固定的.解析可以放在初始化之后,目的就是为了支持动态加载. 从java开发者来讲,我们并不关心具体细节,只要知道整个流程以及每个流程大体干了那些事情. 每个流程具体对开发代码会有那些影响就可以了. 类的加载流程 1.加载loading 在加载过程中,虚拟机需要完成3件事情: 1)通过一个类的全限定名来获得此类的二进制字节流. 2)将这个直接流的静态存…
在C++领域,关于C++的内存存储,结构等等,有一本书:深度探索C++对象模型,讲解的非常透彻. 而Java确把这一工作交给了虚拟机来处理. 我们首先来看看关于内存的问题. 1.问题: 1)java 的局部变量存在那里,类型怎么存放的? 2)static 变量 3)final 变量 4)method是存放的那里的 5)class类 & 内部类 是如何存放 2.java虚拟机运行时数据区 2.1程序计数器 线程隔离数据,记录当前线程执行的位置. PC计数器 由于Java虚拟机的多线程,是由线程轮换…
有一个在线系列地址 <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M..) /Users/baidu/Documents/Data/Interview/Java 全书共分为五大部分,围绕内存管理.执行子系统.程序编译与优化.高效并发等核心主题对JVM进行了全面而深入的分析  …
文章主要是阅读<深入理解java虚拟机:JVM高级特性与最佳实践>第二章:Java内存区域与内存溢出异常 的一些笔记以及概括. 好了開始.假设有什么错误或者遗漏,欢迎指出. 一.概述 先上一张图 这张图主要列出了Java虚拟机管理的内存的几个区域. 常有人把Java内存区分为堆内存(Heap)和栈内存(Stack).这样的分法比較粗糙,Java内存区域的划分实际上远比这复杂.从上图就能够看出了. 堆栈分法中所指的"栈"实际上仅仅是虚拟机栈,或者说是虚拟机栈中的局部变量表部分…
深入理解Java虚拟机--中 第6章 类文件结构 6.2 无关性的基石 无关性的基石:有许多可以运行在各种不同平台上的虚拟机,这些虚拟机都可以载入和执行同一种平台无关的字节码(ByteCode),从而实现了程序的"一次编写,到处运行". Java语言中的各种变量.关键字和运算符号的语义最终都是由多条字节码命令组合而成的,因此字节码命令所能提供的语义描述能力肯定会比Java语言本身更加强大. 6.3 Class类文件的结构 注意:任何一个Class文件都对应着唯一一个类或接口的定义信息,…
深入理解Java虚拟机--上 第2章 Java内存区域和内存溢出异常 2.2 运行时数据区域 图 2-1 Java虚拟机运行时数据区 2.2.1 程序计数器 程序计数器可以看作是当前线程所执行的字节码的行号指示器,线程私有. 由于Java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定的时刻,一个处理器(对于多核处理器来说是一个内核)都只会执行一条线程中的指令. 因此,为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器…
<深入理解Java虚拟机:JVM高级特性与最佳实践>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062566 内容简介 作为一位java程序员,你是否也曾经想深入理解java虚拟机,但是却被它的复杂和深奥拒之门外?没关系,<深入理解java虚拟机:jvm高级特性与最佳实践>极尽化繁为简之妙,能带领你在轻松中领略java虚拟机的奥秘.<深入理解java虚拟机:jvm高级特性与最佳实践>是近年来国内出版的唯一一本与…
摘自:http://blog.csdn.net/zhangjg_blog/article/details/20380971 什么是Java虚拟机 我们都知道Java程序必须在虚拟机上运行.那么虚拟机到底是什么呢?先看网上搜索到的比较靠谱的解释: 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的.Java虚拟机有自己完善的硬体架构,如处理器.堆栈.寄存器等,还具有相应的指令系统.JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的…
java虚拟机在执行java程序的时候会把它所管理的内存分为多个不同的区域,每个区域都有不同的作用,以及由各自的生命周期,有些随着虚拟机进行的启动而存在,有些区域则依赖于用户线程的启动或结束而建立或销毁等.在<java虚拟机规范(Java SE7版)>中规定,java内存分为以下一种,如图所示: 1.程序计数器 程序计数器(Program Counter Register)是一个内存较小的区域,它可以被看作是当前线程所执行到的字节码的行号的指示器,字节码解释器在执行下一条指令,比如分支,跳转,…
垃圾收集器与内存分配策略 详解 3.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第三章 ,为了整理思路,简单记录一下,方便后期查阅. 3.2 对象已死吗 在垃圾收集器进行回收前,第一件事就是确定这些对象哪些还存活,哪些已经死去. 3.2.1 引用计数算法 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器就加1:当引用失效时,计数器减1:其中计数器为0的对象是不可能再被使用的已死对象. 当两个对象相互引用时,这两个对象就不会被回收 引用计数算法,不被主流虚拟机采用,主要原…
目录 1.类文件结构 1.1 Class类文件结构 1.2 魔数与Class文件的版本 1.3 常量池 1.4 访问标志 1.5 类索引.父索引与接口索引集合 1.6 字段表集合 1.7 方法集合 1.8 属性表集 1.8.1 Code属性 1.8.2 Exception属性 1.8.3 LineNumberTable属性 1.8.4 LocalVariableTable属性 1.8.5 SourceFile属性 1.8.6 ConstantValue属性 1.8.7 InnerClass属性…
深入理解java虚拟机 精华总结(面试)(转) 原文地址:http://www.cnblogs.com/prayers/p/5515245.html 一.运行时数据区域 3 1.1 程序计数器 3 1.2 Java虚拟机栈 3 1.3 本地方法栈 3 1.4 Java堆 3 1.5 方法区 3 1.6 运行时常量池 4 二. hotspot虚拟机对象 4 2.1 对象的创建 4 检查 4 分配内存 4 Init 4 2.2 对象的内存布局 4 2.3 对象的访问定位 4 使用句柄访问 4 使用直…
虚拟机性能监控与故障处理工具 详解 4.1 概述 本文参考的是周志明的 <深入理解Java虚拟机> 第四章 ,为了整理思路,简单记录一下,方便后期查阅. JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jstack.jmap.jhat.jstat.hprof等小巧的工具,本文希望能起抛砖引玉之用,让大家能开始对JVM性能调优的常用工具有所了解. 4.2 JDK的命令行工具 命令名称 全称 用途 jstat JVM Statisti…