|
|
@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
一、JVM 虚拟机常识
|
|
|
|
|
|
|
|
作为了解JVM 虚拟机的开始。我们很有必要弄明白以下两个问题。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1.什么是JAVA虚拟机
|
|
|
|
|
|
|
|
所谓虚拟机,就是一台虚拟的计算机。他是一款软件,用来执行一系列虚拟计算机指令。大体上,虚拟机可以分为系统虚拟机和程序虚拟机。大名鼎鼎的VisualBox、VMware就属于系统虚拟机。他们完全是对物理计算机的仿真。提供了一个可以运行完整操作系统的软件平台。
|
|
|
|
|
|
|
|
程序虚拟机的典型代表就是Java虚拟机,它专门为执行单个计算机程序而设计,在Java虚拟机中执行的指令我们称为Java字节码指令。无论是系统虚拟机还是程序虚拟机,在上面运行的软件都限制于虚拟机提供的资源中。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.JAVA 如何做到跨平台
|
|
|
|
|
|
|
|
同一个JAVA程序(JAVA字节码的集合),通过JAVA虚拟机(JVM)运行于各大主流操作系统平台
|
|
|
|
|
|
|
|
比如Windows、CentOS、Ubuntu等。程序以虚拟机为中介,来实现跨平台。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3.虚拟机基本结构
|
|
|
|
|
|
|
|
我们要对JVM虚拟机的结构有一个感性的认知。毕竟我们不是编程人员,认知程度达不到那么深入。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1)、类加载子系统
|
|
|
|
|
|
|
|
负责从文件系统或者网络中加载Class(类)信息,加载的类信息存放于一块称为方法区的内存空间。除了类信息外,方法区中可能还会存放运行时常量池信息,包括字符串字面量和数字量。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2)、Java堆
|
|
|
|
|
|
|
|
在虚拟机启动的时候建立,它是Java程序最主要的内存工作区域。几乎所有的Java对象实例都放Java堆中。堆空间是所有线程共享的,这是一块与Java应用密切相关的内存区间。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3)、Java的NIO库(直接内存)
|
|
|
|
|
|
|
|
允许Java程序使用直接内存。直接内存是在Java堆外的、直接向系统申请的内存区间。通常访问直接内存的速度会优于Java堆。因此出于性能考虑,读写频繁的场合可能会考虑使用直接内存。由于直接内存在Java堆外,因此它的大小不会受限于Xmx指定的最大堆大小。但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
JAVA写一个项目 服务器上运行(足够的内存)100%以上
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4)、垃圾回收系统
|
|
|
|
|
|
|
|
垃圾回收系统是Java虚拟机的重要组成部分,垃圾回收器可以对方法区、Java堆和直接内存进行回收。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5)、Java栈
|
|
|
|
|
|
|
|
每一个Java虚拟机线程都有一个私有的Java栈。一个线程的Java栈在线程创建的时候被创建。Java保存着帧信息,Java栈中保存着局部变量、方法参数,同时和Java方法的调用、返回密切相关。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
4.虚拟机堆内存结构
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
JVM中堆空间可以分成三个大区,年轻代、老年代、永久代(方法区)。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
新生代(年轻代):新生区
|
|
|
|
|
|
|
|
类在这里产生和应用,最后被垃圾回收。所有的类在伊甸区被new出来,当伊甸区满了,GC会对该区不用的对象销毁,剩余有用的转到幸存区。
|
|
|
|
|
|
|
|
老年代:老年区(养老区)
|
|
|
|
|
|
|
|
用于存放生成周期比较长的对象。
|
|
|
|
|
|
|
|
永久代:永久区
|
|
|
|
|
|
|
|
存放JDK自带的class,interface。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|