你应该知道的jvm运行原理

Posted 长城守卫队长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你应该知道的jvm运行原理相关的知识,希望对你有一定的参考价值。

背景:

曾几何时,我也曾疑惑过,我们编写的代码到底安不安全。我们创建一个对象去请求api接口,我们接口直接调用的数据会不会互相影响,读了本文,将会解答你的所有的困惑。

1.jvm内存区域划分

以jdk1.8为例,执行我们的一些对象方法,执行代码的时候肯定会有很多线程,tomcat里就有很多自己的工作线程,去执行我们写的代码,每个工作线程都会有自己的数据结构,栈空间(也就是说每个线程独享一段栈内存),堆内存是所有的线程都可以使用,常量池放入堆空间,类的信息放入了metaspace(元空间)

2.你应该知道的jvm运行原理

一般来说我们平时使用springboot进行系统开发。首先我们会写一个controller:

@RestController
@RequestMapping("/api")
public class XxxController {

    @Autowired
    private XxxBiz xxxBiz

    @RequestMapping("dorequest")
    public CommonResult<String> dorequest(Long id) throws Exception{
        return xxxBiz.dorequest(id);
    }
}

然后我们在写一个service:

@Service
public class XxxBiz {
    
    //do something
    public CommonResult<String> dorequest(Long id) throws Exception{
        MyService myService = new MyService();
	    myService.doService;
        return XXX;
    }

}

我们编写的这样一段代码到底是如何运行起来的呢!

1.我们会将我们编写的代码打成war包

2.tomcat启动时候,会加载类,类加载器会把我们编写的相关的类的信息加载到metaspace

3.会通过反射技术讲我们编写的类加载到spring容器里面

4.spring容器帮创建我们编写的类的对象的实例,对象的实例信息会存入堆空间

5.tomcat启动的同时,也会启动一个端口

6.一般来说我们编写的都是web工程,会通过浏览器进行请求。

7.此时会执行我们定义的对象中的一些方法,此时记住,每个线程是独享一段栈空间的

8.我们会把调用的方法压入栈空间(栈空间,先进去,后出来)

9.当这个方法需要创建一个对象的时候,比如MyService myService = new MyService();

此时doreques的局部变量表会存储MyService的引用,并指向对空间

10.当线程执行结束,方法出站,栈空间销毁

 

本文参考石杉课程资料!

以上是关于你应该知道的jvm运行原理的主要内容,如果未能解决你的问题,请参考以下文章

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程

Java面试- JVM 内存模型讲解

JVM:Java类加载原理深度解析

JVM:Java类加载原理深度解析

程序员都应该知道的 Java 虚拟机小常识

面试灵魂拷问:你对 JVM 的运行原理了解多少?