【深入浅出-JVM】(4):编译 jdk】的更多相关文章

此文总结的很不错:https://www.cnblogs.com/ACFLOOD/p/5528035.html 准备openJDK源码和环境 1.在linux和macOS上编译openJDK更加友好,我是在linux上编译的: 2.编译jdk有利于理解jvm的运行过程,下载openJDK:https://my.oschina.net/u/2518341/blog/1931088 3.编译openJDK的过程也需要jdk,我编译的是openJDK 1.7,jdk我也是用的1.7: 4.编译所需要的…
# 前言 在 深入浅出 JVM GC(2) 中,我们介绍了一些 GC 算法,GC 名词,同时也留下了一个问题,就是每个 GC 收集器的具体作用.有哪些 GC 收集器呢? Serial 串行收集器(只适用于堆内存 256M 以下的 JVM ) ParNew 并行收集器(Serial 收集器的多线程版本) Parallel Scavenge (PS 收集器,该收集器以吞吐量为主要目的,是1.8的默认 GC) CMS 收集器(该收集器全称 Concurrent Mark Sweep,是一种关注最短停顿…
# 前言 在 深入浅出 JVM GC(1) 中,限于上篇文章的篇幅,我们留下了一个问题 : 如何回收? 这篇文章将重点讲述这个问题. 在上篇文章中,我们也列出了一些大纲,今天我们就按照那个大纲来逐个讲解.在此,我将大纲复制过来. 垃圾回收算法 标记清除算法 复制算法 标记整理算法 分代收集算法(堆如何分代) 有哪些垃圾收集器 Serial 串行收集器(只适用于堆内存256m 以下的 JVM ) ParNew 并行收集器(Serial 收集器的多线程版本) Parallel Scavenge (P…
Java虚拟机(JVM),JDK,JRE和JVM的区别 作者:CHAITANYA SINGH 来源:https://www.koofun.com/pro/kfpostsdetail?kfpostsid=4 Java是一种高级编程语言.用高级语言编写的程序不能直接在任何机器上运行.首先,它需要被翻译成特定的机器语言,javac编译器做的就是这件事情,它读取Java程序(存有源代码的.java文件)并将其转换成机器代码(称为字节码或.class文件). Java虚拟机(JVM)是驻留在真实机器(您的…
题外话 最近在阅读<深入理解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版本…
我有一个不知道是好还是不好的习惯,搞不懂的一些玩意儿,喜欢调试然后单步执行看这玩意儿到底是怎么运行的. 今天看到正则表达式的时候,appendReplacement()这个方法怎么也看不明白它是怎么工作的,于是想调试源码单步执行,然后watch几个关键的变量看看. 刚开始的时候,eclipse里调试模,单步,发现没有办法进入方法内. 用google百度了一下,发现是JRE配置的问题. 使用jre是不可以的,需要使用jdk的环境.(之前真的没有注意到这一点) 于是window->Preferenc…
因为OpenJDK是开源的,这里使用openJDK进行编译联系 环境要求 Centos6.7 64位 openjdk-7u40-fcs-src-b43-26_aug_2013.zip bootstrap JDK:  jdk1.6.0_38 因为我们是编译,所以环境的话可以根据自己的实际情况进行调整,JDK的源码包可以去这个网站进行下载https://jdk7.java.net/source.html boostrap JDK:辅助JDK,意思是我们要编译一个新的JDK时需要别的JDK来辅助完成,…
(文章后面提供了ant和build.xml打包之后的build.zip下载,解压build.zip,然后将apache-ant-1.9.2-bin.zip解压即完成了ant安装,也可到http://ant.apache.org/bindownload.cgi下载widnows平台下的zip压缩包) 当用eclipse调试jdk源码的时候,会发现里面的局部变量的值无法看到,这是因为sun在编译jdk的时候,没有加入调试信息.下面就介绍用ant如何重新编译jdk,加入调试信息. 首先,要安装ant,…
用Eclipse Debug,当跟踪进jdk api里时(比如javax.swing包里的类),无法查看某些local filed的值.这是因为jdk里的代码在打包时删除了一些用于调试的信息,以减小安装包的体积.不过可以通过重新编译jdk源代码来恢复此功能. 1.在Eclipse里新建一个java工程,把jdk_home/src.zip解压缩,复制java,javax两个目录的源代码到新建工程的src目录下. 2.build整个工程.如果build报Access restriction错误,是因…
最近在看<深入理解 Java 虚拟机>这本书.里面提到了如何手动编译JDK,于是就试了试. 在编译的过程中,遇到了一些问题.上网一搜,发现了一篇很好的文章,跟大家分享一下:ubuntu 13.04环境编译OpenJDK7 虽然文章里说的编译环境是 13.04 ,但笔者在 14.04 的环境下,参考着文章也能成功编译. 这个也不错:http://guoh.org/lifelog/2011/05/compile-openjdk-by-yourself/…
https://juejin.im/post/5b091ee35188253892389683 大型跨境电商JVM调优经历 前提:某大型跨境电商业务发展非常快,线上机器扩容也很频繁,但是对于线上机器的运行情况,特别是jvm内存的情况,一直没有一个统一的标准来给到各个应用服务的owner.经过618大促之后,和运维的同学讨论了下,希望将线上服务器的jvm参数标准化,可以以一个统一的方式给到各个应用,提升线上服务器的稳定性,同时减少大家都去调整jvm参数的时间.参考了之前在淘宝天猫工作的公司的经历:…
环境 mac,xcode,jdk8,openjdk,autoconf 步骤 安装autoconf brew install autoconf 下载openjdk源码 git clone https://github.com/unofficial-openjdk/openjdk.git cd openjdk && git checkout -b build 在openjdk 根目录下执行编译脚本,大约 10 分钟不到,执行完成 bash configure --enable-debug --…
# 前言 在 JVM 综述里面,我们说,JVM 做了三件事情,Java 程序的内存管理, Java Class 二进制字节流的加载(ClassLoader),Java 程序的执行(执行引擎).我们也说,我们大部分情况下只关注前2个.在前面的文章中,我们已经分析了内存关系相关的,包括运行时数据区,GC 相关.今天我们要讲的就是类加载器. 在 JVM 综述 里,我们已经大致分析了一些概念.而今天的文章将详细的阐述类加载器. 首先,我们要了解类加载器,当然,了解的目的是为了更好的开发,通过对类加载器的…
x 首先用书上的脚本尝试,失败. 之后根据源文件的 README 编译,抛出: root@linux:/opt/openjdk# sh ./get_source.sh ERROR: Need initial repository to use this script 采用下面的方案解决: 你jdk8版本太老了,但是你系统又比较新(很多工具,例如make也是最新的),导致很多不匹配.解决办法换成最新版本的jdk8吧. 具体方法:hg clone http://hg.openjdk.java.net…
这篇文章简要解析了JVM的内部结构.下面这幅图展示了一个典型的JVM(符合JVM Specification Java SE 7 Edition)所具备的关键内部组件. 上图展示的所有这些组件都将在下面两个章节中被解析.第一章包含将会在每个线程上创建的组件:第二章包含那些不依赖于线程即可创建的组件(线程间可共享的组件). 线程内创建 JVM系统线程 单个线程 程序计数器(PC) 栈 原生栈 栈的限制 Frame 局部变量数组 操作数栈 动态链接 线程之间共享 堆 内存管理 非堆内存区 JIT编译…
在项目中遇到OOM(Out of Memory)的问题,为了分析内存和JVM的垃圾回收器GC问题,一并把JVM相关的一些工具也研究了一下: jps:Java进程查看工具,实际上它和Unix/Linux上面的ps命令的功能差不多 jstat:Java内存使用情况监控工具 jmap:输出JVM内存中对象的工具 这些工具位于JAVA_HOME/bin目录下 ? 一,jps (Java Virtual Machine Process Status Tool) JVM进程状态工具 jps用来查看host上…
JVM -- java virtual machine A Java virtual machine (JVM) is a process virtual machine that can execute Java bytecode. JVM就是我们常说的java虚拟机,它是整个java实现跨平台的 最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可 以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序…
本文已经收录自笔者开源的 JavaGuide: https://github.com/Snailclimb ([Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识)如果觉得不错的还,不妨去点个Star,鼓励一下! JDK 监控和故障处理工具总结 JDK 命令行工具 这些命令在 JDK 安装目录下的 bin 目录下: jps (JVM Process Status): 类似 UNIX 的 ps 命令.用户查看所有 Java 进程的启动类.传入参数和 Java 虚拟机参数等信…
找到openjdk网站(http://hg.openjdk.java.net/) 选择需要编译的版本,浏览readme文件,有获取源码及编译步骤 CentOS-7-x86_64-DVD-1804.iso vim /etc/sysconfig/network-scripts/ifcfg-ens33 设置ONBOOT=yes 重启网络服务systemctl restart network 源代码及Bootstrap JDK准备 Bootstrap JDK移至/usr/local/java cd /u…
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > .katex-html { display: block; } .katex-display > .katex > .katex-html > .tag { position: absolute; right: 0px; } .katex { font: 1.21em / 1.2 KaTeX…
最近在学习<深入理解java虚拟机 第二版>这本书.书中第一部分建议大家自己编译OpenJDK.抱着学习态度也来编译个玩一玩.下面进入正题. 1.编译环境介绍 操作系统 CentOS Linux release 7.1.1503 (Core) Linux内核版本 3.10.0-229.el7.x86_64 gcc版本 4.8.2 20140120 (Red Hat 4.8.2-16) (GCC) openJdk版本 openjdk-7u40 2.准备工作 2.1下载OpenJDK 打开网站ht…
使用UtralEdit或者sublime text打开编译后的.class文件, 其中cafe babe为magic number(魔数),标识这个文件是java的class文件. 0033转换成10进制是51(3*16^1+3*16^0).而51则是jdk 1.7.(50是jdk1.6.49为jdk1.5) 而51就是jdk1.7的minor.major version. 延伸:: 下表既是minor.major version表…
获取JDK源码 先明确OpenJDK和Sun/OracleJDK之间,以及OpenJDK 6.OpenJDK 7.OpenJDK7u和OpenJDK 8等项目之间是什么关系,这有助于确定接下来编译要使用的JDK版本和源码分支. OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea.UltraViolet都是从OpenJDK源码衍生出的发行版.但如果仅从“开源”字面意义(开放可阅读的源码)上看,其实Sun自…
本文跟大家聊聊JVM的内部结构,从组件中的多线程处理,JVM系统线程,局部变量数组等方面进行解析 JVM JVM = 类加载器(classloader) + 执行引擎(execution engine) + 运行时数据区域(runtime data area) 下面这幅图展示了一个典型的JVM(符合JVM Specification Java SE 7 Edition)所具备的关键内部组件. 组件中的多线程处理 多线程处理"或"自由线程处理"指的是一个程序同时执行多个操作线程…
  前言简介   前文已经对虚拟机进行过了简单的介绍,并且也对class文件结构,以及字节码指令进行了详尽的说明 想要了解JVM的运行机制,以及如何优化你的代码,你还需要了解一下,java编译器到底是如何编译你的代码的 本文不是从最底层的编译原理讲解 本文是针对java代码,去查看归纳总结编译器的结果行为,从而直观的感受到字节码指令集 也就是说本文的内容,主要针对的是使用javap 查看字节码文件中方法的code属性中的字节码内容 让你从java代码  class文件格式,以及字节码指令集 进行…
# 前言 初级 Java 程序员步入中级程序员的有一个无法绕过的阶段------GC(Garbage Collection).作为 Java 程序员,说实话,很幸福,不用像 C 程序员那样,时刻关心着内存,就像网上有句名言------生活从来都不容易,只不过是有人替你负重前行!是的,GC 在替我们做这些脏活累活,GC 像让我们把精力都放在业务上,而不用每时每刻都在想着内存.现在,GC 也是每个语言的标准配置了.不然谁会去使用这个语言呢? 然而,作为一个合格的程序员,对底层的好奇是进步的动力,如果…
一.编译过程 解析和填充符号表的过程 插入注解处理器的注解处理过程 语义分析与字节码生成过程 二.解析和填充符号表 解析包含两个过程:词法分析和语法分析 (一)词法分析 将源代码的字符流转变成标记(Token)集合,如 int aaa = bbb + 2,会被分解成6个标记,[int,aaa,=,bbb,+,2] (二)语法分析 根据Token序列来构造抽象语法树的过程.完成解析之后,下一步是填充符号表 (三)符号表 由一组符号地址和符号信息构成的表格. 符号表登记的内容将用于语义检查和产生中间…
<!--自己添加的,用来控制maven编译时的jdk版本--> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source&g…
环境准备 操作系统,ubuntu-14.04.6-desktop-amd64.iso,下载地址:http://59.80.44.100/releases.ubuntu.com/14.04/ubuntu-14.04.6-desktop-amd64.iso. Open JDK源码,openjdk-7u75-src-b13-18_dec_2014.zip,下载地址:https://download.java.net/openjdk/jdk7u75/ri/openjdk-7u75-src-b13-18_…
解压jar,获取xxx.calss文件 dos命令行javap -verbose classname import java.io.InputStream; import java.io.PrintWriter; public class CMD命令 { public static void main(String[] args) { String filePath = "D:/git/new_baiwang/sdk-java/sdk-java/target/classes/com/baiwan…