Área de datos de tiempo de ejecución de JVM:
- Durante la ejecución de un programa Java, la máquina virtual Java divide la memoria que gestiona en varias áreas de datos diferentes.
Montón :
- Compartir hilo
- Almacenamiento: más creado
实例对象
,数组
,字符串常量池
;- Descripción:
- La referencia del objeto se almacena en栈
, apuntando a la dirección donde el objeto está almacenado en el montón
- El objeto en la memoria del montón almacena sus propias variables miembro y no guarda los métodos del objeto, que方法
se guardan en la pila de marcos. .- Parámetros:
-Xms1G
- Memoria de montón inicial-Xmx1G
- memoria de montón máxima; tamaño predeterminado
- valor inicial predeterminado,64/1
la memoria física máxima1/4
; calculado en base a 8G de memoria, es decir128M ~ 2G
- Reciclaje de memoria: nueva generación, vieja generación -
1:2
; nueva generación:eden 、s1 、s2 - 8:1:1
- Algoritmo de reciclaje:
– Nueva generación复制算法
: divide la memoria de nueva generación disponible en dos áreas s1 y s2. Solo se utiliza un área a la vez. Cuando se recicla un área, los objetos supervivientes en esta área se copian a otra área. Vacíe la actual área.-eden + s1 - > s2 , eden + s2 ->1
Generación anterior标记压缩
: marque todos los objetos referenciados desde el nodo raíz, comprima y mueva todos los objetos supervivientes a un extremo de la memoria y borre los objetos basura restantes.
Desbordamiento de memoria del montón (
java.lang.OutOfMemoryError
)
La adición de bucle de lista, generalmente puede aparecer en:
大批量添加数据
- Todo general, agregar Lista en lotes e importar a la base de datos
List<User> list=new ArrayList<>();
while(true){
list.add(new User().setName("小树"));
}
Al procesar archivos grandes IO:
//size 声明 多 ~~大 ,比如: new byte[in.available()];
byte[] buffer = new byte[size] //1024 * 1024 * 5
Manejo de excepciones: para detectar este tipo de excepción, utilícelo
Throwable e
y luego manéjelo en consecuencia
try {
//TODO
} catch (Throwable e) {
e.printStackTrace();
}
pila de máquina virtual java:
- El área privada del subproceso tiene el mismo ciclo de vida que el subproceso; cuando se ejecuta cada método, la máquina virtual Java creará sincrónicamente un marco de pila (Stack Frame)
- Almacenamiento: el marco de la pila almacena la tabla de variables locales del método, la pila de operandos, la conexión dinámica y la dirección de retorno del método.
- Proceso: el proceso desde cada método que se llama hasta la finalización de la ejecución corresponde al proceso de este marco de pila en la pila de la máquina virtual desde
入栈
hasta - captura de pantalla tomada a: dirección出栈
- parámetro:
-Xss<size>
Desbordamiento de pila (
java.lang.StackOverflowError
):
- Método de llamada recursiva. El nivel de llamada al método es demasiado profundo y la memoria no es suficiente para crear un nuevo marco de pila.
private static int count;
public static void count(){
try {
count++;
count();
} catch (Throwable e) {
System.out.println("最大深度:"+count);
e.printStackTrace();
}
}
public static void main(String[] args) {
count();
}
Área de métodos: información de clase Java, grupo constante de tiempo de ejecución, variables estáticas
- JDK1.7 y anteriores se denominan
Perm
generación permanente堆中
. Almacenamiento: información de clase Java, grupo constante de tiempo de ejecución, variables estáticas, código compilado por un compilador justo a tiempo y otros datos- JDK 1.8, llamado
元空间 MetaSpace
, en直接内存中
. Almacenamiento: la información de clase y los grupos constantes se colocan en la memoria local, y los grupos constantes y las variables estáticas se colocan en el montón de Java.- parámetro:
-XX:MaxMetaspaceSize
Contador de programa: guarda la dirección de la instrucción de código de bytes que está ejecutando el bloqueo de subproceso actual para volver a la posición de ejecución normal después del cambio de subproceso.
Pila de métodos nativos: el método nativo, JNI, utiliza Java para llamar a la biblioteca de métodos locales implementada en c y c++.