
jvm
weixin_43164504
这个作者很懒,什么都没留下…
展开
-
jvm-8-java
static(静态)方法,和静态变量一样,属于类本身,在类加载的时候就被加载到内存,而其他方法在实例化的时候才会被加载到内存。静态方法由线程共享,不会自动销毁,直到jvm关闭 调用方法的时候,编译器预先计算好调用该方法需要的操作数栈的深度以及局部变量表的空间(都属于虚拟机栈,为线程私有) 编译后的java代码储存在class字节码文件中,虚拟机栈、帧、操作数栈、局部变量表是存放变量或结构的地方,这些结构中的数据由jvm中字节码的指令集操作 ...原创 2021-10-05 20:40:21 · 231 阅读 · 0 评论 -
jvm-7
类加载器(加载java源码编译形成的class)需要寻找类的位置 类加载器有启动、扩展、用户类加载器三种,除了启动类加载器没有父类,其他都用父亲类,jvm先尽量调用父亲类加载器,父亲类无法加载则一级一级往子类推送加载 抽象类和普通类一样有成员方法,成员变量,构造方法等,但是没有实例化,必须被继承之后实例化 关于常量池的位置:java6之前,存放在方法区(永久代)中,java7存放在堆中,java8取消了永久代,设置了元空间,元空间占用操作系统内存,运行时常量池和静态常量池存放在元空间中,字符串常量池依然存.原创 2021-09-27 19:46:42 · 192 阅读 · 0 评论 -
jvm-6
即时编译器(JIT)和解释器的区别:解释器将字节码转为机器码,下次遇到得重新转,JIT将一些字节码编译为机器码,并存入code cache,下次遇到同样的,直接执行,无需再次编译。JIT会根据平台差异,生成平台特定的机器码。hotspot虚拟机的原理 Java内存模型(jmm)定义了一套在多线程读写共享数据时,对数据的可见性、有序性、原子性的规则 java reflection,允许获取自身的信息,并且可以操作类或者对象的内部属性。一般对象的类型在编译期间就会确定下来,jvm通过在运行时候动态加载类来实现.原创 2021-09-26 12:55:40 · 160 阅读 · 0 评论 -
jvm-5
加入大对象时候,对象过大,直接放入老年代,不会引起gc 垃圾回收器:串行,吞吐量优先,响应时间优先 串行:单线程,堆内存较小,个人电脑 吞吐量和响应时间:并行,多线程,堆内存较大。 吞吐量优先:单位时间内,STW时间最短:0.2+0.2=0.4,(吞吐量最大) 响应时间优先:单次STW时间最短:0.1+0.1+0.1+0.1+0.1=0.5,(每次响应更快) ...原创 2021-09-24 21:28:59 · 85 阅读 · 0 评论 -
jvm-4
java中NIO(直接内存),比普通io速度更快,且不受到gc作用,NIO免去了系统缓存和java缓存的传输这一步骤 垃圾回收:通常有引用计数方法和可达性方法,引用计数法存在循环引用的问题(互相引用,都不能被回收) 可达性分析:查看对象是否能通过gc root对象找到 引用:强,软,弱,虚 垃圾回收算法:标记清除,先标记再清楚,不用连续,容易产生内存碎片 标记整理:在标记清除的基础上再做一步整理,避免内存碎片,但效率低,例如需要移动引用对象的地址 复制算法:两个区域,一个区域的存活对象复制(顺便整理)到另.原创 2021-09-23 21:38:07 · 90 阅读 · 0 评论 -
jvm笔记-3
stringtable特性,intern方法主动将字符串放入串池 jvm 1.8中,将字符串尝试放入串池,有则不会放入,没有则放入,并将串池中对象放回 jvm 1.6中,没有则将对象复制一份,放入串池,返回串池中的对象 stringtable是常量池的一部分,在1.6位置处于永久代中,在1.8处于元空间中,前者需要fullgc,后者只需要metagc ...原创 2021-09-23 20:24:57 · 119 阅读 · 0 评论 -
jvm笔记-2
jvm 1.6 类,类加载器和常量池用堆内存中的永久代实现 到了jvm 1.8 ,类,加载器和常量池被放入了元空间,元空间占用操作系统内存而不是堆内存 cglib 常量池是储存指令的常量表,根据指令编号在常量池中查找,跳转指令 运行时常量池就是将指令编号加载到运行内存中 串池(stringtable),例如,string xx = “a”,a首先为常量池中的符号,还没有变成字符串对象,通过string指令后,会首先在stringtable中寻找是否有“a”,没有就声明这一对象并加载进入stringtabl.原创 2021-09-22 14:11:01 · 78 阅读 · 0 评论 -
jvm笔记-1
程序计数器不考虑内存溢出 程序计数器是线程私有的 栈帧是方法需要的,通常将方法的参数,变量,返回地址放入栈帧 一个方法对应一个栈帧,如果方法调用了其他方法,其他方法的栈帧也被压入栈 所以垃圾回收不管栈内存,栈内存会随着方法的调用自动变动 栈内存空间并不是越大越好,栈内存越大,总物理内存一定,能并发的线程越少 方法内的局部变量是否是线程安全的? 如果局部变量没有逃离方法的作用范围,则安全;如果局部变量引用了对象且逃离了范围,则不安全。 栈内存溢出:栈帧过多和栈帧过大都会导致溢出 本地方法栈就是为native.原创 2021-09-21 21:19:38 · 82 阅读 · 0 评论