JVM
由浅入深
还没秃的小菜鸡
头发阻挡了我对知识的吸收
展开
-
OOM、调优工具、调优实战
OOM与调优方法区实现方法:借助cglib动态生成大量的instanceKlass元空间设置为10m -XX:MetaspaceSize=10m -XX:MaxMetaspaceSize=10M -XX:+PrintGCDetailspublic class MetaspaceOverFlowTest1 { /** * 通过CGLIB模拟向元空间写入数据 */ public static void main(String[] args) {原创 2020-08-26 14:15:11 · 229 阅读 · 0 评论 -
垃圾收集器
串行、并行、并发串行:一个GC线程运行并行:多个GC线程同时运行并发:多个GC线程与多个用户线程同时运行GC常用参数-Xmn -Xms -Xmx -Xss年轻代 最小堆 最大堆 栈空间-XX:+UseTLAB使用TLAB,默认打开-XX:+PrintTLAB打印TLAB的使用情况-XX:TLABSize设置TLAB大小-XX:+DisableExplictGCSystem.gc()不管用 ,FGC-XX:+PrintGC 输出GC日志-XX:+PrintGCDet原创 2020-08-24 16:52:12 · 167 阅读 · 0 评论 -
强软弱虚引用
java对象的引用包括强引用,软引用,弱引用,虚引用Java中提供这四种引用类型主要有两个目的:是可以让程序员通过代码的方式决定某些对象的生命周期;是有利于JVM进行垃圾回收。强引用(StrongReference)强引用是使用最普遍的引用。只要某个对象有强引用与之关联,JVM必定不会回收这个对象,即使在内存不足的情况下,JVM宁愿抛出OutOfMemory错误也不会回收这种对象如下: Object object =new Object(); S...原创 2020-08-24 10:53:59 · 112 阅读 · 0 评论 -
垃圾回收算法
垃圾判断算法引用计数算法在对象中添加一个属性用于标记对象被引用的次数,每多一个其他对象引用,计数+1,当引用失效时,计数-1,如果计数=0,表示没有其他对象引用,就可以被回收。这个算法无法解决循环依赖的问题。public class ReferenceCountingAlgorithm { private Object instance; public ReferenceCountingAlgorithm() { byte [] m = new byte[20*原创 2020-08-20 17:57:14 · 294 阅读 · 0 评论 -
JVM调优
oop模型对象内存布局计算对象大小指针压缩指针压缩实现原理开启指针压缩的情况下,一个oop表示的最大对空间是多少如何扩容为什么没这样做扩容是修改OS底层源码还是JVM底层源码JVM调优实战:亿级流量系统调优...原创 2020-08-17 14:16:22 · 178 阅读 · 0 评论 -
执行引擎、JIT、逃逸分析
Java是半编译半解释型语言编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执 行一次都要翻译一次。两种解释器的底层实现字节码解释器做的事情是:java字节码->c++代码->硬编码原理:通过while(true) 或者 for 将读取的字节码进行一个个编译源码:CASE(_new): { u2 index =原创 2020-08-14 17:18:41 · 252 阅读 · 0 评论 -
探索那讲不清的字符串
字符串常量池常量池class文件中的:Constsnt pool 硬盘上运行时常量池:InstanceKlass的一个属性,方法区字符串常量池:String Pool —>底层StringTable—>底层HashTable 堆区Key的生成方式通过String的内容+长度生成hash值将hash值转为keyhashValue = hash_string(name, len);index = hash_to_index(hashValue);// Pick hash原创 2020-08-13 18:43:35 · 175 阅读 · 0 评论 -
内存池与JVM内存模型
基础class文件硬盘上的.class文件class content类加载器将硬盘上的.class文件读入内存中的那一块内存区域Class对象在java世界里,一切皆对象。从某种意义上来说,java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。Java使用Class对象执行其RTTI(运行时类型识别,Run-Time Type Identification),多态是基于R原创 2020-08-12 18:17:46 · 323 阅读 · 1 评论 -
字节码文件解析
基础知识进制十进制转二进制方法为:十进制数除2取余法,即十进制数除2,余数为权位上的数,得到的商值继续除2,依此步骤继续向下运算直到商为0为止。二进制转十进制方法为:把二进制数按权展开、相加即得十进制数。二进制转八进制方法为:3位二进制数按权展开相加得到1位八进制数。(注意事项,3位二进制转成八进制是从右到左开始转换,不足时补0)。八进制转成二进制方法为:八进制数通过除2取余法,得到二进制数,对每个八进制为3个二进制,不足时在最左边补零。二进制转十六进制方法为:与二进制转八进制原创 2020-08-11 13:37:06 · 533 阅读 · 0 评论 -
类加载器子系统与SPI
类加载JVM中有两种类型的类加载器,由C++编写的及由Java编写的。除了启动类加载器(Bootstrap Class Loader)是由C++编写的,其他都是由Java编写的。由Java编写的类加载器都继承自类java.lang.ClassLoader。启动类加载器因为启动类加载器是由C++编写的,通过Java程序去查看显示的是null因此,启动类加载器无法被Java程序调用启动类加载器不像其他类加载器有实体,它是没有实体的,JVM将C++处理类加载的一套逻辑定义为启动类加载器查看启动类加载原创 2020-08-08 14:42:42 · 368 阅读 · 0 评论 -
JVM底层之类加载
一.klass模型klass模型类的继承结构普通的Java类在JVM中对应的是instanceKlass类的实例2.1 InstanceMirrorKlass:用于表示java.lang.Class,Java代码中获取到的Class对象,实际上就是这个C++类的实例,存储在堆区,学名镜像类2.2 InstanceRefKlass:用于表示java/lang/ref/Reference类的子类2.3 InstanceClassLoaderKlass:用于遍历某个加载器加载的类原创 2020-08-06 16:27:55 · 356 阅读 · 0 评论 -
在Idea中添加javap命令
1.打开setting菜单2.找到工具中的扩展工具点击打开3.点击左侧区域左上角的绿色加号按钮会弹出如下图这样的一个编辑框,按提示输入4.完成后点击ok,点击setting窗口的apply然后ok,到这里就已经完成了javap命令的添加5.查看已添加的命令并运行:在代码编辑区右键external tool的扩展选项里可以看到刚才添加的命令,点击执行即可...原创 2020-08-05 17:04:53 · 830 阅读 · 0 评论 -
搭建单步调试openjdk环境
环境操作系统:Ubuntu16boot jdk:jdk7编译的jdk:jdk8看源码工具:Clion、NetBeans百度云盘:链接:https://pan.baidu.com/s/1lYBU_ZdzYuxZxbJMQ-Xwtw 提取码:hrlf准备工作升级 vim sudo apt-get remove vim-common 先把上面的错误依赖删除 sudo apt-get install vim 然后安装 vim -v 查看是否安装!加入行原创 2020-08-04 10:41:21 · 613 阅读 · 0 评论