参考源 https://www.cnblogs.com/syp172654682/p/8082625.html
程序运行时,除非手动向常量池中添加常量(比如调用方法),否则jvm不会自动添加常量到常量池。
------------------------------------------
参考 https://baijiahao.baidu.com/s?id=1636309817155065432&wfr=spider&for=pc
java 的知识大图在最下面。
此处解释一些相关概念
1 .java文件首先被虚拟机编译成.class文件。 这一步都一样
之后,不同的java虚拟机会把 .class文件 解释为该电脑cpu适用的本地代码(机器码),然后cpu就可以执行了。
2. 关于编译。
此处解释一下下图,当源代码被编译时,首先生成了目标文件。
但是目标文件是不能运行的,因为其中的一些系统方法,(比如print())是不能识别的
此时,就需要把静态库,动态库中的函数信息,一起加入目标文件,(此步骤,官方叫做链接。 另外说明,此时加的是函数信息,也就是函数在哪里放着,并不是真正的函数。真正的在ddl里)
最后系统执行代码的时候,从ddl文件中,找到相关方法,开始使用执行。
这里说的是c语言。c语言的标准函数都存储在ddl里面。
我觉得java标准方法,并不从ddl里面存储,而是就存储在lib中(当然java里面叫jar包)。 因为我感觉ddl文件更接近是底层系统的方法。所以除非java调用底层系统,可能才会涉及到ddl
3. 关于源代码——>机器码
https://blog.csdn.net/moakun/article/details/83043868
4. 看了宋红康老师对于深入java虚拟机的一些小总结:
4.1
每个线程都有自己的栈。
线程上每个方法对应一个栈帧。
每个虚拟机栈是独立的,每个虚拟机栈的数据是自己的。 所以不会发生安全问题。
那么,一个方法里面,如果变量在此产生,也再次消亡,那么他是安全的, 反之,存在安全问题。
如:
另外,看一下两个线程引起的并发问题:
4.2 栈里面的数据不会被垃圾回收,它只会简单的入栈,出栈。 堆里面以及方法区会被垃圾回收
4.3 线程请求分配栈容量时,不足引发stackOverflowError。
栈请求分配内存时候,不足引发outOfMemoryError。
4.4 静态语言,动态语言, 早期,晚期 ,虚方法, 静态链接,动态链接
我觉得下图意思时,编译时候,变量就被指定好类型的,比如String a; int b。为静态语言。
而不能确定的,如js里 var a; var b; 你必须看后面的值才能确定其类型,为动态语言。
4.5 概念
栈是运行时的单位,而堆是存储的单位。
即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。
堆解决的是数据存储的问题,即数据怎么放、放在哪儿。
4.6
4.7
JVM 之 字节码指令_vincent-CSDN博客
https://blog.csdn.net/wuzhiwei549/article/details/80626677?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
4.8
5. 关于一些问题
1. 如果服务器上换一个新数据库的连接地址,你怎么做? (注:地址写在常量java文件里)
把编译好的class文件丢过去替换???
但是你会发现,程序依旧访问的老数据库
......
解决: 因为常量被编译时,系统会看谁用了它了,直接就把用了它的变量换成了真实的值,所以修改变量的class没用,必须替换引用他的那些文件。