java - solicita - su configuracion de seguridad ha bloqueado la ejecucion de una aplicacion formada con un certificado
¿Se bloquean los programas de Java? (12)
Soy un programador de c ++, sé un poco sobre java. Sé que los programadores de Java no tienen que trabajar con la memoria directamente como C ++. También sé que la mayoría de los bloqueos en aplicaciones de C ++ se deben a daños en la memoria.
Entonces, ¿puede una aplicación escrita en Java fallar debido a un problema relacionado con la memoria?
Gracias
Por lo tanto, una aplicación escrita en Java nunca se bloqueará debido a problemas relacionados con la memoria.
OutOfMemoryError
es ciertamente un problema relacionado con la memoria. Además, puede obtener un bloqueo "real" (segfault) cuando se encuentra un error en la JVM (que normalmente se escribe en C o C ++), o cuando hay un problema de hardware (como una memoria RAM incorrecta). Posiblemente también cuando ejecute un bytecode no válido en una JVM que no lo valide (como las JVM para sistemas integrados).
Pero normalmente, sí, los programas de Java no segfault.
Contrariamente a otras respuestas, afirmaré que los programas de Java se bloquearán con la frecuencia, o posiblemente incluso más a menudo que los programas de C ++.
Al “bloquearse”, la mayoría de las personas entienden que un programa encuentra un error que no se maneja adecuadamente, lo que hace que la aplicación finalice. Bueno, esto, por supuesto, sucede y no tiene nada que ver con la forma en que Java trata la memoria.
Esto es algo bueno . Lo que hace que C ++ sea tan peligroso, y que Java sea relativamente seguro, es precisamente el hecho de que Java se bloqueará en los casos en que C ++ continuará ejecutándose, aunque haciendo cosas muy equivocadas y potencialmente peligrosas (como escribir en una memoria no inicializada, búferes desbordados, ...) . El bloqueo de Java (por ejemplo, excepciones de lanzamiento) evita daños peores. Las aplicaciones de C ++, por otro lado (debido a la falla de terminación por errores), pueden dañar los datos externos o el sistema. O pueden simplemente entregar un resultado incorrecto (pero aparentemente plausible).
Es contra estos peligros que Java guarda, no contra los choques per se .
Este programa lanzará OutOfMemoryException
y se bloqueará.
void crash(List list) {
while (true) {
list.add(new Object());
}
}
Java puede bloquearse.
La causa puede ser ..
OutOfMemoryError
Error
OutOfMemoryError: PermGen space.
OutOfMemoryError Se produce cuando la máquina virtual de Java no puede asignar un objeto porque se ha quedado sin memoria y el recolector de basura no pudo disponer de más memoria.
Error Exception se produce para los errores de desbordamiento de la pila de ejecución, generalmente en el caso de una recursión muy profunda o ilimitada.
OutOfMemoryError: espacio PermGen El mensaje detallado del espacio PermGen indica que la generación permanente está llena. La generación permanente es el área del montón donde se almacenan los objetos de clase y método. Si una aplicación carga un número muy grande de clases, entonces el tamaño de la generación permanente podría necesitar incrementarse utilizando la opción -XX: MaxPermSize.
La pregunta era sobre problemas de memoria que pueden causar un bloqueo.
Otros problemas que pueden causar un bloqueo, pero que pueden ser detectados por el programa y recuperados de cualquier posibilidad son cualquier excepción RuntimeExceptions. es decir
ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException
No voy a entrar en esto aquí. pero echa un vistazo a ... enlace de texto
Las corrupciones de la memoria en C ++ no ocurren simplemente. Son causados por errores de software, como escribir más allá del final de una matriz. Hacer eso también provocará un bloqueo en Java. (Ningún idioma tomará el código fuente que contiene un error y producirá un programa que hace lo que pretendía originalmente). La diferencia es que en C ++ se obtiene un "comportamiento indefinido", es decir, el programa puede fallar en otro lugar. El programa Java se bloqueará en el momento en que intentes escribir más allá del final de la matriz, lo que hace que sea mucho más fácil encontrar el error.
Los programas de Java se bloquean todo el tiempo. Las causas más comunes que me encuentro son el agotamiento de la memoria y las excepciones no controladas.
No. Las aplicaciones Java pueden fallar debido a problemas de memoria. Si bien Java tiene una administración de memoria integrada, no es en absoluto perfecta. Es solo que mucho del trabajo duro está hecho para ti.
Como se mencionó en algunas de las otras respuestas, Java tiene un sistema de asignación de memoria bastante particular que implica un poco de administración manual y en realidad es bastante fácil agotar esta asignación si no tiene cuidado y no la tiene configurada correctamente para su aplicación.
(Ver los parámetros -Xmx y -Xms para Java)
Por supuesto que se estrellan :)
Además de toda la multa, las respuestas, también está la simple y simple caída de JVM. Por ejemplo, aquí hay una pregunta que hice con respecto a un caso de una JVM defectuosa que puedo bloquear de manera confiable al usar un conjunto de datos en particular (y no es mi culpa: esto " no debería " ocurrir ... Pero sucede;)
He visto fallas en la JVM del servidor en algunas circunstancias extrañas (problema de Tomcat + Hibernate + Sun VM, en la antigüedad, que se solucionó, en la antigüedad, cambiando Tomcat o Sun VM).
He visto JVM en el lado del escritorio cuando no deberían (el envío de software Java comercial a una gran cantidad de máquinas de escritorio tiende a aumentar la probabilidad de que veas algo así).
Y lo mejor que he visto es una llanura de JVM rota que puedo bloquear de forma confiable en el trabajo en varias máquinas y, no, las máquinas no tienen todos los problemas, son estaciones de trabajo sólidas como estables (desde ese post, I '' He probado en varias máquinas y puedo reproducirlo):
Java VM: SIGSEGV reproducible en 1.6.0_17 y 1.6.0_18, ¿cómo informar?
(tenga en cuenta que hay muchas otras JVM que están bien en las mismas máquinas, con el mismo software / conjunto de datos).
Lo primero que hago al presenciar un bloqueo de JVM es cambiar uno de los componentes del software: por lo general, actualizar la JVM a la última versión.
Si bien es poco probable que la JVM se bloquee, es perfectamente posible que su programa se bloquee a través de problemas relacionados con la memoria, por ejemplo, a partir de fugas de memoria a través de objetos que nunca salen del alcance.
( edición: la JVM es una plataforma altamente optimizada, y aunque los errores son muy raros, aún surgen ocasionalmente, y por supuesto, como han mencionado otros aquí, si tiene problemas de hardware como I / O o RAM dañada, la JVM puede y morirá)
Si quieres probar qué sucede si la JVM realmente falla, prueba esta función (la uso para probar mis controladores de fallas :). No funciona en entornos seguros ni en JDK que no sean Sun.
/**
* Crashes the JVM, by copying 1 byte from address 1 to address 1. If this did
* not crash the machine already, we copy a byte from -1 to -1 :). Never call
* this except for debugging problems related to handling system crashes.
*/
public static void crash() {
Unsafe unsafe;
try {
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (Unsafe)field.get(null);
} catch (Exception ex) {
throw new RuntimeException("Can''t get Unsafe instance to crash app.", ex);
}
log.fatal("Here we are and say good bye, the app ist now about to die...");
// Crash now!
unsafe.copyMemory(1,1,1);
// Still alive? Than the following line will help... Crash now!
unsafe.copyMemory(-1,-1,1);
}
Un choque grave se parece a eso:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0x00000000, pid=3387, tid=166603048020
#
# JRE version: 6.0_14-b08
# Java VM: Java HotSpot(TM) Server VM (14.0-b16 mixed mode linux-x86 )
# Problematic frame:
# C 0x00000000
#
# An error report file with more information is saved as:
# .....hs_err_pid3387.log
No es el programa Java el que causa esto, es el código de la propia máquina virtual. Es muy raro desde hace unos años.
sí puede :)
public void test() {
test();
}
esto se bloqueará con un Error
. también hay algunos otros, por ejemplo, quedarse sin memoria causará un bloqueo ( OutOfMemoryError
) también.