你应该知道的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运行原理的主要内容,如果未能解决你的问题,请参考以下文章