JVM
文章平均质量分 81
jvm学习
1个G
永不放弃,一点点进步
展开
-
自定义类加载器---支持同时加载jar包和文件夹中得类
自定义类加载器如下:public class MyClassLoaderToJar extends ClassLoader{ URLClassPath ucp; public MyClassLoaderToJar(URL[] urls) { // 初始化一个资源工具,可加载jar包和文件夹中类 ucp = new URLClassPath(urls); } @Override public Class<?> loadCla原创 2021-04-27 16:40:29 · 544 阅读 · 1 评论 -
ClassLoader 的 findLoadedClass 方法
findLoadedClass官方文档说明:Returns the class with the given binary name if this loader has been recorded by the Java virtual machine as an initiating loader of a class with that binary name.在ClassLoader的loadClass方法中第一步是去加锁,第二部就会调用findLoadedClass方法判断该类是否已经加载过,原创 2021-04-27 15:19:19 · 1326 阅读 · 0 评论 -
Jave Agent(java代理 java探针 字节码插庄)
java探针、字节码插庄都是指的agent技术,agent技术可以构建一个独立于应用程序的代理程序(即为Agent),用来协助监测、运行甚至替换其他JVM上的程序(即替换字节码)。使用它可以实现虚拟机级别的AOP功能。实现java agent,有两种类型的:1.运行在主程序之前通过命令加载agent的jar包。2.运行在主程序之后通过VirtualMachine来加载agent。1 运行在主程序之前agent程序需要实现premain方法,premain方法有两种签名,虚拟机会首先尝试运行第一个方原创 2021-01-30 18:03:22 · 396 阅读 · 0 评论 -
JNI示例
JNI是Java Native Interface的缩写,中文bai为duJAVA本地调用,它bai允许Java代码和其他语言写du的代码进行交互,主要是C和C++。由于在实现的时候遇到很多坑,所以记录下实现不走,本文主要讲解在windows环境下实现,废话不多说,上代码。1 环境本文使用的环境:jdk1.8windows10,64位mingw_642 java代码public class JniDemo { public native void callCppMethod();原创 2021-01-30 13:18:35 · 792 阅读 · 4 评论 -
jvm 调优工具
1 示例代码1.1 示例代码1 元空间OOM设置启动参数:-XX:+PrintGCDetails -XX:MetaspaceSize=20m -XX:MaxMetaspaceSize=20mpublic class MetaspaceOverFlowTest { public static void main(String[] args) throws InterruptedException { while (true) { Thread.sl原创 2021-01-21 23:35:48 · 1072 阅读 · 2 评论 -
jvm 调优命令
此博客是为了总结所有的调优命令,后续会不断更新。。。1 堆-Xmx 最大堆内存 ,-XX:MaxHeapSize命令简写。默认大小为物理内存1/4-Xms 初始堆内存,-XX:InitialHeapSize命令简写。默认大小为物理内存1/64一般初始堆内存和最大堆内存调成一样大,防止内存抖动,增加额外开销,-XX:MaxHeapSize-XX:MinHeapFreeRatio 参数用来设置堆空间最小空闲比例,默认值是 40。当堆空间的空闲内存小于这个数值时,JVM 便会扩展堆空间。-XX:Ma原创 2021-01-19 10:58:09 · 793 阅读 · 0 评论 -
jvm 对象大小和指针压缩
1 对象的内存布局下图是java对象的结构,数组对象才会有数组长度2 计算对象大小2.1 8字节对齐java 的对象默认都是8字节对齐的,即对象的大小都是8的整数倍,所以大小不够8的整数倍的会被补到8的整数倍,例:如果对象大小为30byte那么jvm会自动补2byte,补的2byte就叫对齐填充。2.1.1为什么要8字节对齐读取对象效率更高。假如一个对象大小为30byte,如果我们一个字节去读,需要读30次,才能将对象读取完成,假如是8字节对齐,我们只需要读4次,就能将对象读取完成。这其实是一原创 2021-01-10 15:38:24 · 1006 阅读 · 0 评论 -
jvm 执行引擎
执行引擎是jvm执行java程序的一套子系统。1 解释器jvm中又两种解释器,字节码解释器、模板解释器,字节码解释器,解释执行,模板解释器执行编译后的硬编码(机器码)。1.1 字节码解释器java初期只有字节码解释器,字节码解释器是逐个将字节码指令翻译成硬编码然后执行,所以是java字节码 -> c++ -> 硬编码过程;非常低效。 0 new #2 <java/lang/StringBuilder> 3 dup 4 invokespecial #3 <java原创 2021-01-09 22:13:22 · 204 阅读 · 0 评论 -
字符串详解
1 常量池jvm中有三种常量池:进态常量池、运行时常量池,字符串常量池1.1 静态常量池(class常量池)在class文件中有一部分内容是常量池,用于存放编译期生成的各种字面量和符号引用。1.2 运行时常量池class常量池是静态信息,有些符号引用在运行时才能确定内存地址信息,这些常量被加载到内存后形成了运行时常量池,时InstanceKlass的一个属性,存在方法区。可通过HSDB查看可以看到编译器的类的符号引用转成了直接引用。1.3 字符串常量池java中会大量使用字符串,为了避原创 2021-01-09 18:05:59 · 218 阅读 · 0 评论 -
jvm 内存模型
jvm内存模型就是jvm启动的时候从操作系统中要了一块大的内存,然后将其分成了五个部分,方法区、堆、虚拟机栈、本地方法栈、程序计数器;其中堆和方法区是线程共有的,虚拟机栈、本地方法栈、程序计数器是线程私有的。1 方法区方法区是所有线程共享的,方法区是规范,1.8以前方法区的实现是永久代,1.8及以后方法区的实现是元空间;1.8以前永久代主要存储类的元信息、常量池、静态变量;1.8以后常量池和静态变量放到了堆里,用元空间替换了永久代,将类的元信息放到元空间,元空间使用本地内存,所以现在方法区可以使用更多原创 2021-01-09 14:33:31 · 166 阅读 · 0 评论 -
深入理解class文件
1.class文件1.1 class文件结构1.2 class文件结构说明class文件结构图中,u4、u2、u1表示该项占用子节数。比如常量池大小和接口数量各占两个子节,所以最多只能有65535个常量和最多能实现65535个接口。...原创 2021-01-07 12:46:40 · 487 阅读 · 1 评论 -
Oop-Klass 模型
OOP-KlASS模型是java 的类和对象在jvm中的存在形式。HotSopt JVM的设计者不想让每个对象中都含有一个vtable(虚函数表),所以拆分成Klass和Oop,虚函数表存在Klass中。1.Klass体系java中的每个类,在jvm中都有一个对应的Klass实例与之对应,存储了类的元信息如:常量池、方法信息、属性信息。继承体系如下:InstanceKlass:表示普通java类在JVM中的实例。InstanceMirrorKlass:表示java.lang.Class对象,在j原创 2020-12-20 15:27:35 · 874 阅读 · 3 评论