常用命令:
jps:查看进程及其相关信息
jmap:用来生成dump文件和查看堆相关的各类信息的命令
jstat:查看jvm运行时的状态信息
jstack:查看jvm线程快照的命令
jinfo:查看jvm参数和动态修改部分jvm参数
常用参数:
-Xms:初始化堆大小
-Xmx:最大堆大小
-Xmn:新生代的内存空间大小
-XX:SurvivorRatio
-Xss:每个线程的堆栈大小
-XX:PermSize:设置永久代初始值
-XX:MaxPerSize:设置永久代最大值
当通过 Java 命令启动 Java 进程的时候,会为它分配内存。内存的一部分用于创建堆空间,当程序中创建对象的时候,就从堆空间中分配内存。GC 是 JVM 内部的一个进程,回收无效对象的内存用于将来的分配。
JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、Execution engine(执行引擎);两个组件为Runtime data area(运行时数据区)、Native Interface(本地接口)。
作用 :首先通过编译器把 Java 代码转换成字节码,类加载器(ClassLoader)再把字节码加载到内存中,将其放在运行时数据区(Runtime data area)的方法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作系统去执行,因此需要特定的命令解析器执行引擎(Execution Engine),将字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他语言的本地库接口(Native Interface)来实现整个程序的功能。
JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。
队列和栈都是被用来预存储数据的。
在java中,程序员是不需要显示的去释放一个对象的内存的,而是由虚拟机自行执行。在JVM中,有一个垃圾回收线程,它是低优先级的,在正常情况下是不会执行的,只有在虚拟机空闲或者当前堆内存不足时,才会触发执行,那些没有被任何引用的对象,并将它们添加到要回收的集合中,进行回收。
垃圾回收器通常作为一个单独的低级别的线程运行,在不可预知的情况下对内存堆中已经死亡的或很长时间没有用过的对象进行清除和回收。
程序员不能实时的对某个对象或所有对象调用垃圾回收器进行垃圾回收。
垃圾回收有复制垃圾回收、标记垃圾回收、增量垃圾回收。
可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。