- 单点登录
- 方法区 类模板 常量池
- JavaGuide
- 调堆内存 VM options
- JProfiler工具
- 引用计数法
- JMM定义了一套在多线程读写共享数据(变量、数组)时,对数据的可见性、有序性和原子性的规则和保障。
JVM的体系结构
类加载器和双亲委派机制
native和方法区
package com.JVMThreshold;
//native和方法区
public class NativeDemo01 {
public static void main(String[] args) {
new Thread(() -> { }).start();
}
/*
native :凡是带了native 关键字的,说明java的作用范围达不到了,回去调用底层c语言的库!
会进入本地方法栈
调用本地方法本地接口JNI
JNI作用:扩展Java的使用,融合不同的编程语言为ava所用!最初: C、C++。
Java诞生的时候c、C++横行,想要立足,必须要有调用c、C++的程序
它在内存区域中专门开辟了一块标记区域:Native Method Stack,登记native 方法
在最终执行的时候,加载本地方法库中的方法通过JNI
Java程序驱动打印机,管理系统,掌握即可,在企业级应用中较为少见!
*/
public native void start0();
//调用其他接口:socket..webservice~..http~
//球球爱心网: -->输入(PHP) --> NodeJS -->Socket -->C++-->游戏刷爱心
/* 方法区
Method Area方法区
方法区是被所有线程共享,所有字段和方法字节码,以及一些特殊方法,如构造函数,接口代码也在此定义,
简单说,所有定义的方法的信息都保存在该区域,此区域属于共享区间;
***静态变量、常量、类信息(构造方法、接口定义)、运行时的常量池存在方法区中***
但是实例变量存在堆内存中,和方法区无关。
*/
}
新生区、养老区、永久区、堆内存调优
package com.JVMThreshold;
//新生区、养老区、永久区、堆内存调优
public class Test02 {
public static void main(String[] args) {
//返回虚拟机试图使用的最大内存
long max = Runtime.getRuntime().maxMemory();
//返回jvm的初始化总内存
long total = Runtime.getRuntime().totalMemory();
System.out.println("max="+max+"字节\t"+(max/(double)1024/1024)+"MB");
System.out.println("total="+total+"字节\t"+(total/(double)1024/1024)+"MB");
//默认情况下:分配的总内存是电脑内存的1/4,而初始化的内存: 1/64
//遇到 OOM 问题:
//1.尝试扩大堆内存
//2.分析内存,看一下那个地方出现了问题(专业工具)
// -Xms1024m -Xmx1024m -XX:+PrintGCDetails
//元空间逻辑上存在 物理上不存在
}
}
堆内存调优
package com.JVMThreshold;
//堆内存调优
// -Xms1024m -Xmx1024m -XX:+PrintGCDetails
import java.util.Random;
public class Test03 {
public static void main(String[] args) {
String str = "asdasdasdasdas";
while(true){
str += str + new Random().nextInt(8_8888_8888)
+ new Random().nextInt(9_9999_9999);
}
}
}
使用JProfiler工具分析OOM原因
package com.JVMThreshold;
//使用JProfiler工具分析OOM原因
/*
-Xms 设置初始化内存分配大小 默认是1/164
-Xmx 设置最大分配内存 默认是1/4
-XX:+PrintGCDetails 打印GC垃圾回收信息
-XX:+HeapDumpOnOutOfMemoryError
-Xms1m -Xmx8m -XX:+HeapDumpOnOutOfMemoryError
*/
import java.util.ArrayList;
public class JProfilerDemo04 {
byte[] array = new byte[1024*1024];
public static void main(String[] args) {
ArrayList<JProfilerDemo04> list = new ArrayList<>();
int count = 0;
try{
while(true){
list.add(new JProfilerDemo04());
count++;
}
}catch(Error e){
System.out.println(count);
e.printStackTrace();
/*
1676
java.lang.OutOfMemoryError: Java heap space
at com.JVMThreshold.JProfilerDemo04.<init>(JProfilerDemo04.java:6)
at com.JVMThreshold.JProfilerDemo04.main(JProfilerDemo04.java:13)
*/
}
}
}
标签:com,JProfilerDemo04,内存,JVM,new,方法,public
From: https://www.cnblogs.com/799rijiyuelei/p/17003528.html