jvm
因努力 果随缘
一个有故事的程序员
展开
-
java是否存在内存泄露问题
今天我们来讲讲java内存泄露问题,内存泄露是指一个不在被程序使用的对象或变量还在内存中占有存储空间,在C/C++语言中,内存的分配与释放是由开发人员负责的,如果开发人员忘记释放已分配的内存就会造成内存泄露,而在java语言中引进了垃圾回收机制,由垃圾回收器负责回收不在使用的对象,那么,我们想一个问题,既然有垃圾回收器开负责回收垃圾,那么还是否存在内存泄露的问题了? 其实,在java语言中...原创 2020-04-04 10:30:24 · 205 阅读 · 0 评论 -
java虚拟机内存结构,哪些结构是线程共享,哪些结构是线程私有
线程共享区有: 堆Heap 如:对象new出来的对象实例,数组。 方法区:注意:jdk8之后叫元空间,里面主要存放类的信息,常量,静态变量,运行时常量。线程私有区有: 虚拟机栈Stack,本地方法栈Native,程序计数器,执行引擎。...原创 2020-08-30 22:14:49 · 983 阅读 · 0 评论 -
jvm之内存结构
我们来看上图所示,这个就是jvm内存结构图,我们来分析下这些不同区域的作用:方法区:JDK8之后叫元空间,主要用来存储被虚拟机加载的类信息,常量,静态变量,和编译器编译后的代码等数据,...原创 2020-09-27 22:33:19 · 108 阅读 · 0 评论 -
详解虚拟机栈
今天我们来详细说下java虚拟机中的栈,英文名叫Stack,说到虚拟机栈,我们就来先说下栈,栈其实就是一种数据结构,这种数据机构是先进后出的,反过来就是后进先出,我们来举个场景,作为90后的我们,小时候一定玩过玩具手枪,那个时候为了买把玩具枪真的是不容易,都是自己平时省着早点钱买下来的,宁愿早上饿肚子,也要买一把,每台你睡觉都要摸着枪睡,怀念那段快乐的时光,嘿嘿,越扯越远了。首先,我们想想,当我们往手枪弹夹里装子弹的时候,是不是一个一个往里面压的,我们可以把手枪弹夹想象为一个栈,那么往里面填装子弹的就相当于原创 2020-10-01 17:40:36 · 570 阅读 · 0 评论 -
简单证明jdk1.8字符串常量池
jdk1.8jvm内存做了一个优化,就是把字符串常量池放到堆内存中了,jdk1.7是把字符串常量池放到方法区(元空间)中的,那么我们怎么验证jdk1.8是把字符串常量池放到堆内存中的了,我们用代码演示一遍。 List<String> list = new ArrayList<>(); for (long i = 0; i < 900000000; i++) { //把数字转成字符串类型,然后放入到字符串常量池中原创 2020-10-04 00:59:37 · 418 阅读 · 2 评论 -
java字节码文件转汇编文件
输入指令 javap -c -v 后面加上字节码路径转换后的汇编语言原创 2020-10-02 21:46:37 · 933 阅读 · 8 评论 -
java中的四种引用
强引用:被引用关联的对象永远不会被垃圾收集器回收我们来举个例子,Object object = new Object();那Object就是一个强引用了,如果一个对象具有强引用的话,垃圾回收器绝对不会回收它,当内存空间不足,java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。软引用 :软引用关联的对象,在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统才会回收软引用对象,如果回收了软引用对象之后仍然没有足够原创 2020-10-05 15:15:26 · 124 阅读 · 0 评论 -
详解JVM中的常量池
首先说说常量的核心作用,概念: 就是定义一个固定的值,比如配置文件jvm虚拟机中的常量池分为三类:(1)class常量池(静态常量池)(2)运行常量池(3)字符串常量池我们来延申一个问题 字符串常量池放在jvm什么区域jdk1.6之前,常量池都放入方法区(永久区)jdk1.7常量池放入到堆中,这样不合理。jdk1.8只是将字符串常量池放入到堆中,其他常量都是放在元空间。...原创 2020-10-02 21:34:29 · 465 阅读 · 0 评论 -
jvm之类加载器分类
类加载器的分类:BootstrapClassLoader:启动类加载器ExtClassLoader:扩展类加载器AppClassLoader:应用类加载器每个类加载器都有读取class字节码的范围,启动类加载器加载$JAVA_HOME/jre/lib下的文件,代表rt.jar启动类加载器加载$JAVA_HOME/jre/lib/ext下的文件应用类加载器:读取我们当前项目中定义的引入jar包,写的class文件。自定义类加载器:读取class文件范围,都是属于自定义。原创 2020-08-23 17:05:59 · 221 阅读 · 0 评论 -
为什么把String设计为不可改变的
在java语言中,String是一个非常重要的类,几乎在所有的项目中都会被用到,因此,String的性能就非常重要,鉴于此,String被设计为一个不可变量。具体而言,Stirng被设计为不可变量有如下几个重要的原因。(1)节省空间:在java语言中,为了提高效率和空间使用率,把字符串常量存储在String pool(池)中,这些字符串可以被共享,为了保证一个用户对字符串的修改不会影响到其他用...原创 2020-04-12 12:52:24 · 668 阅读 · 1 评论 -
Jvm加载class文件的原理机制是什么
java语言是一种具有动态性的解释性语言,类(class)只有被加载到jvm中后才能运行,当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的java应用程序,这个加载过程是由类加载器完成的,具体来说,就是由ClassLoader和它的子类来实现的,类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中。类的加载方式分为隐式加载与显示...原创 2020-03-21 16:59:26 · 252 阅读 · 0 评论 -
Java中的堆和栈有啥区别
在java语言中,堆与栈都是内存中存放数据的地方,变量分为基本数据类型和引用类型,基本数据类型的变量(列如,int,short,long,byte,float,double,boolean以及char等)以及对象的引用变量,其内存都分配在栈上,变量出了作用域就会自动释放,而引用类型的变量,其内存分配在堆上或者常量池(列如字符串常量和基本数据类型常量)中,需要通过new等方式创建。具体而言,栈内...原创 2020-03-22 11:52:36 · 383 阅读 · 0 评论 -
java内存溢出与内存泄露的区别
内存溢出:是在申请内存空间时,超出最大堆内存空间。内存泄漏:是因为内存空间没有及时释放,长时间导致占用内存,最终导致内存溢出。原创 2020-02-10 23:14:29 · 255 阅读 · 0 评论 -
java字节码技术
何为字节码技术?可以使用字节码技术对类的基本信息做操做,新增属性或者方法,修改属性或者方法,删除属性或者方法。比如AOP技术,Lombok去除重复代码插件,动态修改class文件等。我们来说说常见的字节码操做类库BCELByte Code Engineering Library(BCEL),这是Apache Software Foundation的Jakarta项目的一部分。B...原创 2020-02-11 09:57:09 · 246 阅读 · 0 评论 -
String中intern用法
再说这个方法之前,我们来看一段代码。 String s1 = "HelloWorld"; String s2 = new String("HelloWorld"); System.out.println(s1 == s2);打印的结果是false,因为”==“比较的是引用地址,很显然是s1引用地址指向是字符串常量池,s2的引用地址指向的是堆内存空间中,所以为false。 String s1 = "HelloWorld"; String原创 2020-10-04 00:32:16 · 135 阅读 · 0 评论 -
String字符串原理
我们在开发中用到的最多的是String类型;概念:String对象用于保存字符串,也就是一组字符序列。字符串常量对象是用双引号括起来的字符序列比如 “dsdsd”,"兰陵笑笑生",“编号89757”,字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉子)占两个字节,String类比较常用的构造方法:String实现了Serializable,,说明String可以序列化String是final不可以被继承 不可以被修改(内存地址不可以修改,内容是可以修改的)底层实际上是通..原创 2021-12-16 20:20:00 · 822 阅读 · 0 评论 -
jvm栈堆
今天就来讲下:原创 2021-12-12 13:41:34 · 417 阅读 · 0 评论