jvm的学习
第一步:编译openjdk8
在ubuntu1604系统中,使用的jdk版本是:openjdk-8u40-src-b25-10_feb_2015.7z
(1)安装编译需要的库文件:
安装gcc、g++、make等
sudo apt-get install build-essential
安装XRender
sudo apt-get install libxrender-dev
sudo apt-get install xorg-dev
安装alsa
sudo apt-get install libasound2-dev
Cups
sudo apt-get install libcups2-dev
安装零碎的工具包
sudo apt-get install gawk zip libxtst-dev libxi-dev libxt-dev
(2)安装导向jdk,也就是编译openjdk所需要的jdk,使用的jdk1.7比openjdk8小。
(3)配置编译选项:
bash ./configure
(4)编译openjdk
make all
编译时碰到这个错误:
【解决办法】修改 hotspot/make/linux/Makefile 文件,添加 4% ,如:
编译好的jdk镜像的目录在:build/*/images/j2sdk-image ,如下图。
如何查看native的方法
(1)点击 openjdk8 的在线源码
比如 java.long 包下的 thread.java 的函数 :private native void start0(); 对于jdk的代码路径在 /src/share/native/java/lang/ 目录下的 Thread.c 文件,如下:
其中 “JVM_StartThread” 方法对应 hotspot 源码中 /src/share/vm/prims 的 jvm.cpp 文件,如下:
其中“JVM_ENTRY”是一个函数开头的宏,对应的函数结尾的宏是“JVM_END”。
慕课网--课程《剑指Java面试-Offer直通车》--的学习
jvm对于程序员开发和面试,主要包含两个部分:内存分配 和 垃圾回收。
类加载
上图说明:jvm主要有这4个部分。
通过创建自定义的ClassLoader,我们知道只要传入的二进制流是合法的,就可以通过不同的形式去加载。比如可以访问远程的网络去获取二进制流生成我们需要的类。或者对比较敏感的class文件进行加密,在加载的过程中再进行解密。或者对生成的二进制流做手脚,给类添加信息等。(了解“ass”或者“字节码增强技术”)。
对于的是 ClassLoader 类的 loadClass 方法,如下:
内存模型
虚拟机栈 和 本地方法栈 都会抛出异常,异常包含 StackOverflowError 和 OutOfMemoryError 异常。
在JDK1.8中,将永久代和老年代,新生代分离出来,永久代使用元空间替代。如下:
面试题
垃圾回收
这个算法有两个不足:效率底,容易碎片化。
面试题