
jvm
文章平均质量分 84
HD243608836
这个作者很懒,什么都没留下…
展开
-
jvm不同版本(jdk6、jdk7、jdk8)之间的class常量池、运行时常量池、字符串常量池与堆、方法区的种种关系
问:传说中的R大出现了,再问一下StringTable本身又存在哪里呢,有人说是方法区,又有人说是native memory?答:HotSpot VM的StringTable的本体在native memory里。原创 2022-09-01 03:28:20 · 1524 阅读 · 3 评论 -
从Java的《jvm虚拟机规范》看HotSpot虚拟机的内存结构和变迁
至此,本文对Java虚拟机规范中关于JVM内存区域的描述做了简单的解读,并以HotSpot虚拟机为例说明了具体实现和规范之间的联系。Java虚拟机规范是一份与实现无关的文档,它在描述时没有规定具体的实现细节,显得"模棱两可",但所有的Java虚拟机实现都应该遵循这个规范。其中还有关于类文件格式,字节码指令等相关内容的描述,感兴趣的读者可以自行前往阅读。关于字符串常量池的细节,放在下一篇文章来讨论。.........转载 2022-09-01 02:42:31 · 406 阅读 · 0 评论 -
jvm从HotSpot VM源码看字符串常量池(StringTable)和intern()方法
字符串常量池可以简单理解为就是一个hashmap的结构,记录的是字符串序列和String对象引用的映射关系为了在不同的Java进程之间共享字符串池,StringTable还有另外一个名为的MapJDK6中,会在永久代创建String对象再放入StringTable,而在JDK7中则直接将堆中的String对象放入StringTable中OpenJDK中包含HotSpot VM的源码,是完全开源的。OpenJDK源代码如果嫌Github下载太慢也可以去Gitee找国内的镜像。...转载 2022-09-01 02:35:22 · 581 阅读 · 0 评论 -
java的hashmap中value存放的是引用
【代码】hashmap中value存放的是引用。转载 2022-08-31 20:26:01 · 736 阅读 · 0 评论 -
Java中ArrayList中存放的是值还是引用?
这里我们试了Integer和Double两种,看一下结果:由此可见,修改int和double不会对之前的内容造成影响,但是修改User会对之前的内容造成影响。所以,ArrayList中如果是基本数据类型,那么存放的就是值,如果是对象,那么存放的就是对象的引用而不是对象的拷贝。看样子这个结论是正确的,但是需要注意的一个问题就是ArrayList可以存放基本数据类型吗?.........转载 2022-08-30 01:51:37 · 935 阅读 · 0 评论 -
String为什么是不可变的?为什么要有字符串常量池?String和StringBuilder和StringBuffer
我们使用平时都了解到的方式去通过new去创建对象,即使它的字面量一致,他也是创建了多个对象,这样会导致资源的浪费,同时也占用空间。对象的不可变性是指对象本身的属性或者说本身的数据不会改变,将变量重新赋值,是创建了一个新对象,然后将新对象的引用赋值给了变量,之前的对象是没有受到影响的。当我们使用String进行字符串拼接时,他的底层会创建StringBuilder对象,并调用sb.append()方法。当我们对字符串进行大量操作时,就必须产生很多新的对象,这会导致性能低下。从源码我们可以看到,它继承的。...转载 2022-08-29 18:03:17 · 748 阅读 · 0 评论 -
终于明白了!java只有值传递,而没有引用传递
有人就又会疑问了,形参里的是对象,那传递的应该是引用本身,这肯定是引用传递,我确实这样疑惑过,但仔细想想,其实还是值传递,因为他们指向同一个堆,所以改变堆内内容当然对原本有影响了,我们所说的没有影响是栈中的原数据,这里是对象a,副本a根本对原实参a无法造成影响,因为a是对象,所以你对对象a中数据的更改跟a没有关系,因为堆中的数据时共享的,很多人都会理解错这一点。我们发现值传递和我们上面所说一致,它是把实参复制一份通过形参传给方法,而这个方法改变的只是副本,无法对原来的数值改变。"调用过程中a的值".....转载 2022-07-22 16:01:18 · 1710 阅读 · 0 评论 -
浅析java双亲委派机制及其作用及代码示例
首先我们了解下什么是双亲委派机制?当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。 Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且,加载某个类的class文件时,Java虚拟机采用的是双亲委派机制,即把请求交由父类处理,它是一种任务委派模式。 其工作原理:(1)如果一个类加载器收到了类加载请求,它并不会转载 2022-02-23 18:32:52 · 683 阅读 · 0 评论 -
JVM GC算法
在判断哪些内存需要回收和什么时候回收用到GC 算法,本文主要对GC 算法进行讲解。JVM垃圾判定算法常见的JVM垃圾判定算法包括:引用计数算法、可达性分析算法。引用计数算法(Reference Counting)引用计数算法是通过判断对象的引用数量来决定对象是否可以被回收。给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时刻...转载 2019-12-10 16:34:16 · 187 阅读 · 0 评论 -
垃圾回收器及内存分配(收集算法是内存回收的理论,而垃圾回收器是内存回收的实践。)
收集算法是内存回收的理论,而垃圾回收器是内存回收的实践。说明:如果两个收集器之间存在连线说明他们之间可以搭配使用。2.5.1 Serial 收集器这是一个单线程收集器。意味着它只会使用一个 CPU 或一条收集线程去完成收集工作,并且在进行垃圾回收时必须暂停其它所有的工作线程直到收集结束。2.5.2 ParNew 收集器可以认为是 Serial 收集器的多线程版本。...转载 2019-10-28 12:04:31 · 289 阅读 · 0 评论 -
垃圾回收算法(新生代——复制,老年代——标记清除)
2.3.1 标记 —— 清除算法直接标记清除就可。两个不足:效率不高空间会产生大量碎片2.3.2 复制算法把空间分成两块,每次只对其中一块进行 GC。当这块内存使用完时,就将还存活的对象复制到另一块上面。解决前一种方法的不足,但是会造成空间利用率低下。因为大多数新生代对象都不会熬过第一次 GC。所以没必要 1 : 1 划分空间。可以分一块较大的 Eden 空间和两块较小的...转载 2019-10-28 11:49:38 · 3219 阅读 · 0 评论 -
java中的基本数据类型一定存储在栈中吗?
首先说明,"java中的基本数据类型一定存储在栈中的吗?”这句话肯定是错误的。 下面让我们一起来分析一下原因: 基本数据类型是放在栈中还是放在堆中,这取决于基本类型在何处声明,下面对数据类型在内存中的存储问题来解释一下: 一:在方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个方法栈,其所在方法中声明的变量就放在方法栈中,当方法结束系统...转载 2019-02-27 12:47:07 · 1168 阅读 · 0 评论 -
eclipse+tomcat开发,debug启动导致内存溢出解决方法
eclipse+tomcat开发:大家在开发程序时,如果总报内存溢出错误,请试试修改以下参数: SET CATALINA_OPTS= -Xms2048m -Xmx2048m -XX:MaxNewSize=2048m -XX:MaxPermSize=2048m转载请注明出处!原创 2017-08-22 14:40:59 · 657 阅读 · 0 评论 -
java中的字符串到底是在方法区的常量池里还是new出来的对象里
String实质是字符数组,两个特点:1、该类不可被继承;2、不可变性(immutable)例如 String s1 = new String("myString");和 String s1 = "myString"; 第一种方式通过关键字new定义过程:在程序编译期,编译程序先去字符串常量池检查,是否存在“myString”,如果不存在,则在常量池中开辟一个内存空间存放“myString”;如果...转载 2018-04-16 20:32:14 · 5049 阅读 · 5 评论 -
jvm虚拟机加载类,是把类的属性和方法全加载了吗
问题:比如我一个程序里有30个类1程序运行时候,虚拟机是一下把30类都加载还是用哪个类加载哪个类?2类里有属性和方法,那加载某个类的时候,是把该类里的所有属性和方法都加载,还是根据我调用该类的哪个方法就加载哪个方法,,其它没用到的方法并不加载?下面这俩句话懒汉式是,只有用到这个用例的时候,再将他实例化,不会浪费,所以效率要高一些。饿汉式则是程序只要开始,就将他实例化,到用到他的时候就省去了再实...转载 2018-05-05 20:04:05 · 838 阅读 · 0 评论 -
JVM的内存区域划分
有5块:1.寄存器 —— 供CPU使用2.本地方法栈 —— 调用系统底层内容3.方法区(也叫:数据区,共享区,共享数据区) —— 存放全局变量,静态变量和字符串常量,和方法4.栈 —— 存放函数的参数值,局部变量的值等5.堆 —— 存放对象~~~~~~~~~~~~~~~~~~~~~~~~~~ JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据...转载 2018-05-06 07:20:11 · 283 阅读 · 0 评论 -
JVM的内存区域划分(更新版)
写在前面:方法区:JDK8之前,由永久代实现,主要存放类的信息、常量池、方法数据、方法代码等;JDK8之后,取消了永久代,提出了元空间,并且常量池、静态成员变量等迁移到了堆中;元空间不在虚拟机内存中,而是放在本地内存中。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~以下是针对jdk7及以下版本!!~~~~~~~~~~~~~~~~~~~...转载 2019-02-26 11:16:46 · 277 阅读 · 0 评论 -
java常量池中基本数据类型包装类(-128~127)
转载自:https://www.cnblogs.com/liaochong/p/javabase.html,建议看原文,格式更清晰~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~想必大部分学过java的人都应该做过这种题目: 1 public class Test { 2 public ...转载 2019-02-26 13:26:15 · 1290 阅读 · 0 评论 -
8种基本类型的包装类和常量池简单介绍
8种基本类型的包装类和对象池 包装类:java提供的为原始数据类型的封装类,如:int(基本数据类型),Integer封装类。 对象池:为了一定程度上减少频繁创建对象,将一些对象保存到一个”容器”中。Byte,Short,Integer,Long,Character。这5种整型的包装类的对象池范围在-128~127之间,也就是说, 超出这个范围的对象都会开辟自己的堆内存。 Boolean也...转载 2019-02-26 14:54:00 · 352 阅读 · 0 评论 -
Java常量,变量,对象(字面量)在JVM内存中的存储位置
苦苦研究了快一天了,终于找到个“大神精准的总结”了!!!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~建议与《JVM存储位置分配》https://blog.youkuaiyun.com/HD243608836/article/details/87940295结合着看,容易理解!!针对Java中...转载 2019-02-26 18:13:09 · 4955 阅读 · 3 评论 -
JVM存储位置分配——java中局部变量、实例变量和静态变量在方法区、栈内存、堆内存中的分配
找了一天,这个总结的很好!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Java中的变量根据不同的标准可以分为两类,以其引用的数据类型的不同来划分可分为“原始数据类型变量和引用数据类型变量”,以其作用范围的不同来区分可分为“局部变量,实例变量和静态变量”。根据“...转载 2019-02-26 18:21:15 · 6737 阅读 · 0 评论 -
JVM知识点总览-中高级Java工程师面试必备
JVM知识点总览-中高级Java工程师面试必备 对于搞开发的我们其实也是一样,现在流行的框架越来越多,封装的也越来越完善,各种框架可以搞定一切,几乎不用关注底层的实现,初级程序员只要熟悉基本的使用方法,便可以快速的开发上线;但对于高级程序员来讲,内功的修炼却越发的重要,比如算法、设计模式、底层原理等,只有把这些基础熟练之后,才能在开发过程中知其然知其所以然,出转载 2017-06-26 01:07:58 · 624 阅读 · 0 评论